lewtun HF Staff commited on
Commit
f2c3987
·
verified ·
1 Parent(s): 80ac3a1

PyBot: Can Python be a chatbot? (in-browser demo)

Browse files
Files changed (3) hide show
  1. README.md +12 -17
  2. index.html +9 -8
  3. tree.json +1 -1
README.md CHANGED
@@ -6,40 +6,35 @@ colorTo: gray
6
  sdk: docker
7
  app_port: 7860
8
  pinned: false
9
- datasets:
10
- - HuggingFaceSwarms/SwarmChat-v8
11
  ---
12
 
13
- PyBot: a conversational bot without LLMs, written by a swarm of LLM agents. This Space is a chat demo that runs
14
- PyBot entirely in your browser: [Pyodide](https://pyodide.org) (CPython compiled to WebAssembly) runs the bot's Python
15
- in a Web Worker; the Space only serves files. Each reply shows which of PyBot's modules and files produced it.
16
 
17
- The bot is commit `3185a7a9bc50` of `HuggingFaceSwarms/SwarmChat-v8`, the best run on the
18
- [SwarmChat leaderboard](https://huggingface.co/spaces/HuggingFaceSwarms/swarmchat-leaderboard) (26.55% length-penalised
19
- win rate on SmolTalkBench). Replaying 40 of that run's recorded conversations in the browser bundle gives byte-identical
20
- replies.
21
 
22
  ## Files
23
 
24
  - `index.html`: the page (chat, the reply's trace, and a treemap of PyBot's files; Plotly from jsDelivr).
25
  - `worker.js`: loads Pyodide 314.0.7 from jsDelivr and the bot bundle, then answers turns. Like transformers.js does
26
  for model files, it keeps the bundle in Cache Storage, so a second visit doesn't download it again.
27
- - `pybot_web.py`: the glue, ported from the previous server version of this Space (`bot_runner.py`, `app.py`): fixed
28
- random seeds as in the eval server, the trace via `sys.monitoring`, and the file that holds a reply's text.
29
  - `pybot-<sha12>.zip`: `bot/**.pyc` compiled for Pyodide's CPython 3.14 (loading skips compiling 33 MB of source),
30
  plus `norm.json` (each file's text, letters and digits only) for finding the file that holds a reply.
31
- - `tree.json`: PyBot's files and line counts for the treemap.
 
32
  - `Dockerfile`: only serves the files above (`python -m http.server`). A static Space would redirect the large files to a
33
  CDN without CORS headers, which blocks the worker's fetch of the bundle and the fonts.
34
 
35
- ## Rebuild for another commit
36
 
37
  ```sh
38
- hf download HuggingFaceSwarms/SwarmChat-v8 --repo-type dataset --revision <sha> --include "bot/**" --local-dir src
39
- (cd src && zip -qr ../bot-src.zip bot -i '*.py')
40
  npm install pyodide@314.0.7 # the same version as worker.js: bytecode only loads in the Python that compiled it
41
  node build/build.mjs bot-src.zip build/build_bundle.py pybot-<sha12>.zip
42
  ```
43
 
44
- Then regenerate `tree.json` (`[path, line count]` for every `bot/**.py`, plus `repo` and `sha`) and update `BUNDLE`
45
- in `worker.js`. To test locally, serve this folder (`python -m http.server`) and open it.
 
6
  sdk: docker
7
  app_port: 7860
8
  pinned: false
 
 
9
  ---
10
 
11
+ # PyBot: Can Python be a chatbot?
 
 
12
 
13
+ A chat demo that runs [PyBot](https://github.com/huggingface/pybot), a chatbot written in plain Python, entirely in your
14
+ browser: [Pyodide](https://pyodide.org) (CPython compiled to WebAssembly) runs the bot in a Web Worker, and this Space
15
+ only serves files. Each reply shows which of PyBot's modules and files produced it; click a file to read it on GitHub.
 
16
 
17
  ## Files
18
 
19
  - `index.html`: the page (chat, the reply's trace, and a treemap of PyBot's files; Plotly from jsDelivr).
20
  - `worker.js`: loads Pyodide 314.0.7 from jsDelivr and the bot bundle, then answers turns. Like transformers.js does
21
  for model files, it keeps the bundle in Cache Storage, so a second visit doesn't download it again.
22
+ - `pybot_web.py`: the glue: fixed random seeds as in the benchmark's eval server (so replies match the leaderboard run),
23
+ the trace via `sys.monitoring`, and the file that holds a reply's text.
24
  - `pybot-<sha12>.zip`: `bot/**.pyc` compiled for Pyodide's CPython 3.14 (loading skips compiling 33 MB of source),
25
  plus `norm.json` (each file's text, letters and digits only) for finding the file that holds a reply.
26
+ It is built from the same code as `bot/` in the GitHub repo.
27
+ - `tree.json`: PyBot's files and line counts for the treemap, and the repo its file links open.
28
  - `Dockerfile`: only serves the files above (`python -m http.server`). A static Space would redirect the large files to a
29
  CDN without CORS headers, which blocks the worker's fetch of the bundle and the fonts.
30
 
31
+ ## Rebuild from a newer bot
32
 
33
  ```sh
34
+ git clone https://github.com/huggingface/pybot && (cd pybot && zip -qr ../bot-src.zip bot -i '*.py')
 
35
  npm install pyodide@314.0.7 # the same version as worker.js: bytecode only loads in the Python that compiled it
36
  node build/build.mjs bot-src.zip build/build_bundle.py pybot-<sha12>.zip
37
  ```
38
 
39
+ Then regenerate `tree.json` (`[path, line count]` for every `bot/**.py`) and update `BUNDLE` in `worker.js` (a new
40
+ name makes browsers download the new bundle). To test locally, serve this folder (`python -m http.server`) and open it.
index.html CHANGED
@@ -3,7 +3,7 @@
3
  <head>
4
  <meta charset="utf-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>PyBot</title>
7
  <style>
8
  @font-face { font-family:"Routed Gothic"; src:url("fonts/routed-gothic.ttf") format("truetype"); }
9
  @font-face { font-family:"Letter Gothic"; src:url("fonts/LetterGothicCode-R.ttf") format("truetype"); }
@@ -17,7 +17,7 @@
17
  .page { min-height:100%; max-width:1400px; margin:0 auto; padding:clamp(16px,3vw,32px) clamp(16px,3vw,32px) 20px;
18
  display:flex; flex-direction:column; gap:16px; }
19
  header { display:flex; align-items:baseline; justify-content:space-between; gap:12px 24px; flex-wrap:wrap; }
20
- h1 { font:400 clamp(34px,5vw,52px)/1 var(--lead); letter-spacing:.02em; margin:0; }
21
  #status { flex:1 1 320px; max-width:520px; font:13px/1.4 var(--mono); color:var(--mute); }
22
  #status .bar { height:4px; background:var(--off); border:1px solid var(--ink); margin-top:6px; overflow:hidden; }
23
  #status .bar i { display:block; height:100%; width:0; background:var(--ink); transition:width .2s; }
@@ -45,7 +45,8 @@
45
  button.ghost { color:var(--ink); background:var(--paper); width:42px; padding:0; font:400 20px var(--lead); }
46
  button:disabled, input:disabled { opacity:.45; cursor:default; }
47
  input:focus-visible, button:focus-visible { outline:2px solid var(--accent); outline-offset:2px; }
48
- #why { font:14px/1.5 var(--mono); color:var(--mute); min-height:44px; padding:10px 14px; border-bottom:1px solid var(--hair); }
 
49
  #why b { color:var(--ink); }
50
  #map { flex:1; min-height:0; width:100%; }
51
  .legend { display:flex; flex-wrap:wrap; gap:6px 18px; font:13px var(--mono); color:var(--mute); padding:8px 14px 12px; border-top:1px solid var(--hair); }
@@ -66,7 +67,7 @@
66
  <body>
67
  <div class="page">
68
  <header>
69
- <h1>PyBot</h1>
70
  <div id="status" role="status" aria-live="polite"><span id="status-text">Starting…</span><div class="bar busy"><i></i></div></div>
71
  </header>
72
 
@@ -93,7 +94,7 @@
93
  </section>
94
  </div>
95
 
96
- <p class="foot">PyBot at commit <a id="commit" target="_blank" rel="noopener"></a>, running in your browser with <a href="https://pyodide.org" target="_blank" rel="noopener">Pyodide</a>. Click a file to open it on the Hub.</p>
97
  </div>
98
 
99
  <script src="https://cdn.jsdelivr.net/npm/plotly.js-dist-min@2.35.2/plotly.min.js"></script>
@@ -146,7 +147,7 @@ function done() { q.disabled = send.disabled = false; q.focus({preventScroll:tru
146
 
147
  // ---- the file map ----
148
  let TREE = null, dirs, ids, labels, parents, values, last = null; // last: the last reply's trace
149
- const url = (p) => `https://huggingface.co/datasets/${TREE.repo}/blob/${TREE.sha}/${p}`;
150
  function roleOf(id) {
151
  if (!last || dirs.has(id)) return null;
152
  const mod = (m) => `bot/modules/${m}.py`;
@@ -171,11 +172,11 @@ function draw() {
171
  hovertemplate:"<b>%{id}</b><br>%{value:,} lines<br>%{customdata}<extra></extra>"}],
172
  {margin:{l:0, r:0, t:26, b:0}, paper_bgcolor:PAPER, font:{family:MONO, color:INK},
173
  hoverlabel:{bgcolor:PAPER, bordercolor:INK, font:{family:MONO, size:13, color:INK}}},
174
- {responsive:true, displaylogo:false, displayModeBar:false});
 
175
  }
176
  fetch("tree.json").then((r) => r.json()).then((tree) => {
177
  TREE = tree;
178
- const commit = $("commit"); commit.textContent = TREE.sha.slice(0, 7); commit.href = `https://huggingface.co/datasets/${TREE.repo}/tree/${TREE.sha}/bot`;
179
  dirs = new Map();
180
  for (const [p, n] of TREE.files) { const parts = p.split("/"); for (let i = 1; i < parts.length; i++) { const d = parts.slice(0, i).join("/"); dirs.set(d, (dirs.get(d) || 0) + n); } }
181
  ids = [...dirs.keys(), ...TREE.files.map(([p]) => p)];
 
3
  <head>
4
  <meta charset="utf-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>PyBot: Can Python be a chatbot?</title>
7
  <style>
8
  @font-face { font-family:"Routed Gothic"; src:url("fonts/routed-gothic.ttf") format("truetype"); }
9
  @font-face { font-family:"Letter Gothic"; src:url("fonts/LetterGothicCode-R.ttf") format("truetype"); }
 
17
  .page { min-height:100%; max-width:1400px; margin:0 auto; padding:clamp(16px,3vw,32px) clamp(16px,3vw,32px) 20px;
18
  display:flex; flex-direction:column; gap:16px; }
19
  header { display:flex; align-items:baseline; justify-content:space-between; gap:12px 24px; flex-wrap:wrap; }
20
+ h1 { font:400 clamp(28px,4.2vw,46px)/1.05 var(--lead); letter-spacing:.02em; margin:0; }
21
  #status { flex:1 1 320px; max-width:520px; font:13px/1.4 var(--mono); color:var(--mute); }
22
  #status .bar { height:4px; background:var(--off); border:1px solid var(--ink); margin-top:6px; overflow:hidden; }
23
  #status .bar i { display:block; height:100%; width:0; background:var(--ink); transition:width .2s; }
 
45
  button.ghost { color:var(--ink); background:var(--paper); width:42px; padding:0; font:400 20px var(--lead); }
46
  button:disabled, input:disabled { opacity:.45; cursor:default; }
47
  input:focus-visible, button:focus-visible { outline:2px solid var(--accent); outline-offset:2px; }
48
+ #why { font:14px/1.5 var(--mono); color:var(--mute); min-height:63px; padding:10px 14px; border-bottom:1px solid var(--hair); }
49
+ .trace { overflow:hidden; }
50
  #why b { color:var(--ink); }
51
  #map { flex:1; min-height:0; width:100%; }
52
  .legend { display:flex; flex-wrap:wrap; gap:6px 18px; font:13px var(--mono); color:var(--mute); padding:8px 14px 12px; border-top:1px solid var(--hair); }
 
67
  <body>
68
  <div class="page">
69
  <header>
70
+ <h1>PyBot: Can Python be a chatbot?</h1>
71
  <div id="status" role="status" aria-live="polite"><span id="status-text">Starting…</span><div class="bar busy"><i></i></div></div>
72
  </header>
73
 
 
94
  </section>
95
  </div>
96
 
97
+ <p class="foot">PyBot runs in your browser with <a href="https://pyodide.org" target="_blank" rel="noopener">Pyodide</a>. Code: <a href="https://github.com/huggingface/pybot" target="_blank" rel="noopener">github.com/huggingface/pybot</a>. Click a file to read it on GitHub.</p>
98
  </div>
99
 
100
  <script src="https://cdn.jsdelivr.net/npm/plotly.js-dist-min@2.35.2/plotly.min.js"></script>
 
147
 
148
  // ---- the file map ----
149
  let TREE = null, dirs, ids, labels, parents, values, last = null; // last: the last reply's trace
150
+ const url = (p) => `${TREE.url}/blob/${TREE.ref}/${p}`;
151
  function roleOf(id) {
152
  if (!last || dirs.has(id)) return null;
153
  const mod = (m) => `bot/modules/${m}.py`;
 
172
  hovertemplate:"<b>%{id}</b><br>%{value:,} lines<br>%{customdata}<extra></extra>"}],
173
  {margin:{l:0, r:0, t:26, b:0}, paper_bgcolor:PAPER, font:{family:MONO, color:INK},
174
  hoverlabel:{bgcolor:PAPER, bordercolor:INK, font:{family:MONO, size:13, color:INK}}},
175
+ {responsive:true, displaylogo:false, displayModeBar:false})
176
+ .then(() => Plotly.Plots.resize("map")); // the trace line above may have changed height
177
  }
178
  fetch("tree.json").then((r) => r.json()).then((tree) => {
179
  TREE = tree;
 
180
  dirs = new Map();
181
  for (const [p, n] of TREE.files) { const parts = p.split("/"); for (let i = 1; i < parts.length; i++) { const d = parts.slice(0, i).join("/"); dirs.set(d, (dirs.get(d) || 0) + n); } }
182
  ids = [...dirs.keys(), ...TREE.files.map(([p]) => p)];
tree.json CHANGED
@@ -1 +1 @@
1
- {"repo":"HuggingFaceSwarms/SwarmChat-v8","sha":"3185a7a9bc50491205b19f64839f8c70962c4369","files":[["bot/__init__.py",1],["bot/__main__.py",19],["bot/compose/__init__.py",523],["bot/compose/a_place_nobody_can_see.py",439],["bot/compose/badnews.py",1272],["bot/compose/breakup.py",74],["bot/compose/checking.py",966],["bot/compose/childwords.py",163],["bot/compose/circumstance.py",156],["bot/compose/doubt.py",138],["bot/compose/draft.py",718],["bot/compose/facts.py",96],["bot/compose/fallback.py",15517],["bot/compose/fallback_chain.py",5117],["bot/compose/fallback_data.py",8200],["bot/compose/fallback_pools.py",691],["bot/compose/fallback_words.py",514],["bot/compose/find_a_place.py",352],["bot/compose/finding_out.py",806],["bot/compose/findout.py",526],["bot/compose/fit.py",3892],["bot/compose/gap.py",388],["bot/compose/goodnews.py",1548],["bot/compose/handoff.py",149],["bot/compose/harm.py",334],["bot/compose/how_it_went.py",325],["bot/compose/invitation.py",134],["bot/compose/judgement.py",41],["bot/compose/lead.py",249],["bot/compose/leaving.py",776],["bot/compose/limit.py",248],["bot/compose/liveask.py",93],["bot/compose/loss.py",4955],["bot/compose/missing_half.py",296],["bot/compose/moving.py",119],["bot/compose/no_eyes.py",479],["bot/compose/nottheirbest.py",117],["bot/compose/occasionplan.py",460],["bot/compose/onething.py",462],["bot/compose/only_they_know.py",563],["bot/compose/onscreen.py",504],["bot/compose/own_facts.py",198],["bot/compose/place_facts.py",138],["bot/compose/plans.py",212],["bot/compose/pleased.py",103],["bot/compose/postcode.py",392],["bot/compose/prices.py",262],["bot/compose/quantity.py",1242],["bot/compose/reaction.py",291],["bot/compose/reading.py",1778],["bot/compose/recall.py",112],["bot/compose/receiving_end.py",207],["bot/compose/remark.py",1952],["bot/compose/repair.py",418],["bot/compose/rotten_luck.py",313],["bot/compose/routes.py",538],["bot/compose/rule.py",224],["bot/compose/ruledout.py",680],["bot/compose/safetyask.py",193],["bot/compose/saidby.py",203],["bot/compose/setting_off.py",241],["bot/compose/still.py",290],["bot/compose/talkto.py",170],["bot/compose/taste.py",436],["bot/compose/the_rule_for_it.py",322],["bot/compose/the_turn_after.py",157],["bot/compose/their_day.py",436],["bot/compose/theirperson.py",225],["bot/compose/trouble.py",1203],["bot/compose/unseen.py",208],["bot/compose/urgent.py",646],["bot/compose/verdict.py",5788],["bot/compose/waited_for.py",236],["bot/compose/who.py",329],["bot/compose/who_to_see.py",307],["bot/compose/whole.py",57],["bot/compose/why.py",2072],["bot/compose/worn.py",226],["bot/knowledge/__init__.py",157],["bot/knowledge/affording.py",96],["bot/knowledge/animals.py",900],["bot/knowledge/appointments.py",285],["bot/knowledge/babyfood.py",2136],["bot/knowledge/bake_faults.py",221],["bot/knowledge/bikes.py",1096],["bot/knowledge/body.py",4450],["bot/knowledge/body_energy.py",79],["bot/knowledge/business.py",494],["bot/knowledge/cakes.py",298],["bot/knowledge/caring.py",255],["bot/knowledge/cars.py",4231],["bot/knowledge/chilli.py",267],["bot/knowledge/cleaning.py",4848],["bot/knowledge/clothing.py",4485],["bot/knowledge/comeback.py",188],["bot/knowledge/complaints.py",1066],["bot/knowledge/conditions.py",203],["bot/knowledge/consumer.py",5081],["bot/knowledge/cook_kit.py",493],["bot/knowledge/cooking.py",12280],["bot/knowledge/cooking_entries.py",11145],["bot/knowledge/cooking_gaps.py",2356],["bot/knowledge/cooking_more.py",2197],["bot/knowledge/cooking_tables.py",3171],["bot/knowledge/costs.py",1345],["bot/knowledge/creative.py",96],["bot/knowledge/crisis_replies.py",2054],["bot/knowledge/decorating.py",228],["bot/knowledge/devices.py",319],["bot/knowledge/differences.py",304],["bot/knowledge/dish_verdicts.py",437],["bot/knowledge/dishes.py",5960],["bot/knowledge/drinks.py",240],["bot/knowledge/eithers.py",474],["bot/knowledge/entertainment.py",9526],["bot/knowledge/explains.py",2943],["bot/knowledge/family.py",13174],["bot/knowledge/family_more.py",1057],["bot/knowledge/fitness.py",1669],["bot/knowledge/fitweek.py",240],["bot/knowledge/freshness.py",1127],["bot/knowledge/friends.py",1099],["bot/knowledge/fruit.py",413],["bot/knowledge/fun.py",713],["bot/knowledge/garden.py",6685],["bot/knowledge/garden_tools.py",429],["bot/knowledge/geography.py",1710],["bot/knowledge/habits.py",848],["bot/knowledge/health.py",10567],["bot/knowledge/history.py",2030],["bot/knowledge/home.py",8069],["bot/knowledge/home_craft.py",10052],["bot/knowledge/house_odds.py",438],["bot/knowledge/how_it_works.py",151],["bot/knowledge/idioms.py",465],["bot/knowledge/ingredient_swaps.py",63],["bot/knowledge/joint_time.py",131],["bot/knowledge/joints.py",556],["bot/knowledge/keeping.py",1892],["bot/knowledge/keeping_cooked.py",115],["bot/knowledge/kit_lists.py",69],["bot/knowledge/kitchen.py",146],["bot/knowledge/kitchen_odds.py",529],["bot/knowledge/kitchen_prep.py",43],["bot/knowledge/language.py",3486],["bot/knowledge/left_on.py",266],["bot/knowledge/lifeadmin.py",4448],["bot/knowledge/lookup.py",6012],["bot/knowledge/machine_door.py",90],["bot/knowledge/materials.py",666],["bot/knowledge/maths.py",5766],["bot/knowledge/meals.py",2602],["bot/knowledge/measures.py",636],["bot/knowledge/meat_in_a_card.py",72],["bot/knowledge/microwave_methods.py",80],["bot/knowledge/money.py",10232],["bot/knowledge/money_words.py",362],["bot/knowledge/music.py",398],["bot/knowledge/nature.py",855],["bot/knowledge/no_kit.py",335],["bot/knowledge/notable.py",765],["bot/knowledge/nursing.py",54],["bot/knowledge/nutrition.py",2691],["bot/knowledge/occasions.py",202],["bot/knowledge/odours.py",283],["bot/knowledge/opinions.py",1508],["bot/knowledge/panic_talk.py",211],["bot/knowledge/parking.py",45],["bot/knowledge/pasta.py",303],["bot/knowledge/pensions.py",114],["bot/knowledge/pets.py",11217],["bot/knowledge/pharmacy.py",414],["bot/knowledge/photography.py",186],["bot/knowledge/picking.py",422],["bot/knowledge/picks.py",164],["bot/knowledge/plans.py",2612],["bot/knowledge/power_heat.py",43],["bot/knowledge/pregnancy.py",1302],["bot/knowledge/prices.py",186],["bot/knowledge/quantity.py",37],["bot/knowledge/rice.py",350],["bot/knowledge/routines.py",552],["bot/knowledge/rubbish.py",750],["bot/knowledge/sauces.py",196],["bot/knowledge/schoolmaths.py",217],["bot/knowledge/science.py",11486],["bot/knowledge/seasoning.py",277],["bot/knowledge/shopping.py",4141],["bot/knowledge/sleep.py",1046],["bot/knowledge/spice_heat.py",246],["bot/knowledge/sport.py",3981],["bot/knowledge/still_ok.py",913],["bot/knowledge/study.py",4795],["bot/knowledge/swaps.py",1042],["bot/knowledge/takes.py",329],["bot/knowledge/technology.py",7770],["bot/knowledge/travel.py",11322],["bot/knowledge/units.py",3420],["bot/knowledge/vegetables.py",961],["bot/knowledge/warm_food.py",161],["bot/knowledge/whenbuy.py",403],["bot/knowledge/wording.py",2806],["bot/knowledge/work.py",8132],["bot/memory/__init__.py",1309],["bot/memory/a_year_of_birth.py",122],["bot/memory/aboutthem.py",121],["bot/memory/ack.py",6079],["bot/memory/again.py",866],["bot/memory/already.py",906],["bot/memory/amounts.py",260],["bot/memory/another.py",480],["bot/memory/asleep.py",263],["bot/memory/baking.py",107],["bot/memory/carried_on.py",289],["bot/memory/carry.py",783],["bot/memory/cause.py",672],["bot/memory/change.py",153],["bot/memory/choice.py",663],["bot/memory/company.py",340],["bot/memory/condition.py",364],["bot/memory/corrected.py",1921],["bot/memory/counts.py",882],["bot/memory/deadline.py",103],["bot/memory/decided.py",697],["bot/memory/detail.py",1182],["bot/memory/doubt.py",155],["bot/memory/enough.py",666],["bot/memory/facts.py",10397],["bot/memory/favourite.py",519],["bot/memory/filler.py",36],["bot/memory/guest.py",218],["bot/memory/healing.py",331],["bot/memory/history.py",494],["bot/memory/hope.py",144],["bot/memory/hours.py",150],["bot/memory/household.py",191],["bot/memory/kidcount.py",131],["bot/memory/limit.py",860],["bot/memory/limits.py",288],["bot/memory/lineback.py",445],["bot/memory/matters.py",308],["bot/memory/meant.py",687],["bot/memory/more.py",220],["bot/memory/named.py",2610],["bot/memory/narrow.py",2652],["bot/memory/newborn.py",90],["bot/memory/not_a_trip.py",127],["bot/memory/not_this.py",235],["bot/memory/obstacle.py",644],["bot/memory/onset.py",378],["bot/memory/outfit.py",346],["bot/memory/passing_the_time.py",210],["bot/memory/pending.py",172],["bot/memory/people.py",249],["bot/memory/pile.py",124],["bot/memory/places.py",249],["bot/memory/plan.py",468],["bot/memory/plans.py",450],["bot/memory/prefer.py",190],["bot/memory/price.py",600],["bot/memory/purse.py",173],["bot/memory/quotes.py",71],["bot/memory/rates.py",289],["bot/memory/recall.py",590],["bot/memory/reject.py",681],["bot/memory/relations.py",1766],["bot/memory/remedy.py",184],["bot/memory/reminded.py",155],["bot/memory/rename.py",108],["bot/memory/repair.py",938],["bot/memory/repeat.py",4737],["bot/memory/resize.py",379],["bot/memory/returned.py",215],["bot/memory/returns.py",286],["bot/memory/saving.py",1899],["bot/memory/setback.py",318],["bot/memory/size.py",232],["bot/memory/spent.py",685],["bot/memory/spoken.py",137],["bot/memory/stands.py",235],["bot/memory/store_lines.py",1035],["bot/memory/store_replies.py",12266],["bot/memory/stuck.py",447],["bot/memory/surname.py",321],["bot/memory/swap.py",766],["bot/memory/taking.py",409],["bot/memory/taste.py",507],["bot/memory/the_years.py",213],["bot/memory/thread.py",1786],["bot/memory/times.py",223],["bot/memory/told.py",1552],["bot/memory/too_late.py",174],["bot/memory/topics.py",7810],["bot/memory/tried.py",1665],["bot/memory/trips.py",1518],["bot/memory/warmth.py",479],["bot/memory/when.py",1694],["bot/memory/whereabout.py",140],["bot/memory/whose_body.py",76],["bot/memory/workplace.py",198],["bot/memory/years_in.py",309],["bot/modules/__init__.py",1],["bot/modules/a_count_said.py",40],["bot/modules/a_day_somebody_else_keeps.py",121],["bot/modules/aboutachild.py",39],["bot/modules/already.py",26],["bot/modules/answers.py",11236],["bot/modules/arbiter.py",4029],["bot/modules/attribute_said_again.py",603],["bot/modules/bulky.py",153],["bot/modules/carers_turn.py",422],["bot/modules/chat.py",16948],["bot/modules/done_ask.py",240],["bot/modules/doubt.py",24],["bot/modules/favourites.py",161],["bot/modules/figure_asked_again.py",40],["bot/modules/greeting.py",901],["bot/modules/grief.py",818],["bot/modules/household.py",47],["bot/modules/how_long_a_stay.py",205],["bot/modules/intent.py",38],["bot/modules/invitation.py",48],["bot/modules/judge_ask.py",131],["bot/modules/keeping.py",137],["bot/modules/kid_tally.py",28],["bot/modules/live_source.py",294],["bot/modules/live_times.py",241],["bot/modules/loss.py",140],["bot/modules/memory_store.py",5955],["bot/modules/memory_tables.py",469],["bot/modules/my_work.py",26],["bot/modules/name_taken_back.py",107],["bot/modules/night.py",29],["bot/modules/nudge.py",56],["bot/modules/recap.py",150],["bot/modules/receiving_end.py",23],["bot/modules/record_due.py",171],["bot/modules/ruled_out.py",42],["bot/modules/safety.py",10139],["bot/modules/safety_cards.py",2126],["bot/modules/safety_phrases.py",1169],["bot/modules/safety_tables.py",7231],["bot/modules/said_back.py",28],["bot/modules/saving_followup.py",288],["bot/modules/steps.py",23],["bot/modules/taking_asked_again.py",45],["bot/modules/talkto.py",140],["bot/modules/their_life.py",285],["bot/modules/their_pastime.py",358],["bot/modules/theirperson.py",31],["bot/modules/thing_i_did_with.py",194],["bot/modules/trip_date_said_again.py",88],["bot/modules/understand.py",16],["bot/modules/urgent.py",30],["bot/modules/where_it_answers.py",47],["bot/modules/who_to_see.py",40],["bot/modules/words.py",197],["bot/modules/years_in.py",46],["bot/runtime.py",120],["bot/understanding/__init__.py",1761],["bot/understanding/body.py",566],["bot/understanding/breeds.py",171],["bot/understanding/kinds.py",6582],["bot/understanding/lexicon.py",1949],["bot/understanding/normalize.py",6657],["bot/understanding/references.py",419],["bot/understanding/senses.py",178],["bot/understanding/topics.py",3744]]}
 
1
+ {"url":"https://github.com/huggingface/pybot","ref":"main","files":[["bot/__init__.py",1],["bot/__main__.py",19],["bot/compose/__init__.py",523],["bot/compose/a_place_nobody_can_see.py",439],["bot/compose/badnews.py",1272],["bot/compose/breakup.py",74],["bot/compose/checking.py",966],["bot/compose/childwords.py",163],["bot/compose/circumstance.py",156],["bot/compose/doubt.py",138],["bot/compose/draft.py",718],["bot/compose/facts.py",96],["bot/compose/fallback.py",15517],["bot/compose/fallback_chain.py",5117],["bot/compose/fallback_data.py",8200],["bot/compose/fallback_pools.py",691],["bot/compose/fallback_words.py",514],["bot/compose/find_a_place.py",352],["bot/compose/finding_out.py",806],["bot/compose/findout.py",526],["bot/compose/fit.py",3892],["bot/compose/gap.py",388],["bot/compose/goodnews.py",1548],["bot/compose/handoff.py",149],["bot/compose/harm.py",334],["bot/compose/how_it_went.py",325],["bot/compose/invitation.py",134],["bot/compose/judgement.py",41],["bot/compose/lead.py",249],["bot/compose/leaving.py",776],["bot/compose/limit.py",248],["bot/compose/liveask.py",93],["bot/compose/loss.py",4955],["bot/compose/missing_half.py",296],["bot/compose/moving.py",119],["bot/compose/no_eyes.py",479],["bot/compose/nottheirbest.py",117],["bot/compose/occasionplan.py",460],["bot/compose/onething.py",462],["bot/compose/only_they_know.py",563],["bot/compose/onscreen.py",504],["bot/compose/own_facts.py",198],["bot/compose/place_facts.py",138],["bot/compose/plans.py",212],["bot/compose/pleased.py",103],["bot/compose/postcode.py",392],["bot/compose/prices.py",262],["bot/compose/quantity.py",1242],["bot/compose/reaction.py",291],["bot/compose/reading.py",1778],["bot/compose/recall.py",112],["bot/compose/receiving_end.py",207],["bot/compose/remark.py",1952],["bot/compose/repair.py",418],["bot/compose/rotten_luck.py",313],["bot/compose/routes.py",538],["bot/compose/rule.py",224],["bot/compose/ruledout.py",680],["bot/compose/safetyask.py",193],["bot/compose/saidby.py",203],["bot/compose/setting_off.py",241],["bot/compose/still.py",290],["bot/compose/talkto.py",170],["bot/compose/taste.py",436],["bot/compose/the_rule_for_it.py",322],["bot/compose/the_turn_after.py",157],["bot/compose/their_day.py",436],["bot/compose/theirperson.py",225],["bot/compose/trouble.py",1203],["bot/compose/unseen.py",208],["bot/compose/urgent.py",646],["bot/compose/verdict.py",5788],["bot/compose/waited_for.py",236],["bot/compose/who.py",329],["bot/compose/who_to_see.py",307],["bot/compose/whole.py",57],["bot/compose/why.py",2072],["bot/compose/worn.py",226],["bot/knowledge/__init__.py",157],["bot/knowledge/affording.py",96],["bot/knowledge/animals.py",900],["bot/knowledge/appointments.py",285],["bot/knowledge/babyfood.py",2136],["bot/knowledge/bake_faults.py",221],["bot/knowledge/bikes.py",1096],["bot/knowledge/body.py",4450],["bot/knowledge/body_energy.py",79],["bot/knowledge/business.py",494],["bot/knowledge/cakes.py",298],["bot/knowledge/caring.py",255],["bot/knowledge/cars.py",4231],["bot/knowledge/chilli.py",267],["bot/knowledge/cleaning.py",4848],["bot/knowledge/clothing.py",4485],["bot/knowledge/comeback.py",188],["bot/knowledge/complaints.py",1066],["bot/knowledge/conditions.py",203],["bot/knowledge/consumer.py",5081],["bot/knowledge/cook_kit.py",493],["bot/knowledge/cooking.py",12280],["bot/knowledge/cooking_entries.py",11145],["bot/knowledge/cooking_gaps.py",2356],["bot/knowledge/cooking_more.py",2197],["bot/knowledge/cooking_tables.py",3171],["bot/knowledge/costs.py",1345],["bot/knowledge/creative.py",96],["bot/knowledge/crisis_replies.py",2054],["bot/knowledge/decorating.py",228],["bot/knowledge/devices.py",319],["bot/knowledge/differences.py",304],["bot/knowledge/dish_verdicts.py",437],["bot/knowledge/dishes.py",5960],["bot/knowledge/drinks.py",240],["bot/knowledge/eithers.py",474],["bot/knowledge/entertainment.py",9526],["bot/knowledge/explains.py",2943],["bot/knowledge/family.py",13174],["bot/knowledge/family_more.py",1057],["bot/knowledge/fitness.py",1669],["bot/knowledge/fitweek.py",240],["bot/knowledge/freshness.py",1127],["bot/knowledge/friends.py",1099],["bot/knowledge/fruit.py",413],["bot/knowledge/fun.py",713],["bot/knowledge/garden.py",6685],["bot/knowledge/garden_tools.py",429],["bot/knowledge/geography.py",1710],["bot/knowledge/habits.py",848],["bot/knowledge/health.py",10567],["bot/knowledge/history.py",2030],["bot/knowledge/home.py",8069],["bot/knowledge/home_craft.py",10052],["bot/knowledge/house_odds.py",438],["bot/knowledge/how_it_works.py",151],["bot/knowledge/idioms.py",465],["bot/knowledge/ingredient_swaps.py",63],["bot/knowledge/joint_time.py",131],["bot/knowledge/joints.py",556],["bot/knowledge/keeping.py",1892],["bot/knowledge/keeping_cooked.py",115],["bot/knowledge/kit_lists.py",69],["bot/knowledge/kitchen.py",146],["bot/knowledge/kitchen_odds.py",529],["bot/knowledge/kitchen_prep.py",43],["bot/knowledge/language.py",3486],["bot/knowledge/left_on.py",266],["bot/knowledge/lifeadmin.py",4448],["bot/knowledge/lookup.py",6012],["bot/knowledge/machine_door.py",90],["bot/knowledge/materials.py",666],["bot/knowledge/maths.py",5766],["bot/knowledge/meals.py",2602],["bot/knowledge/measures.py",636],["bot/knowledge/meat_in_a_card.py",72],["bot/knowledge/microwave_methods.py",80],["bot/knowledge/money.py",10232],["bot/knowledge/money_words.py",362],["bot/knowledge/music.py",398],["bot/knowledge/nature.py",855],["bot/knowledge/no_kit.py",335],["bot/knowledge/notable.py",765],["bot/knowledge/nursing.py",54],["bot/knowledge/nutrition.py",2691],["bot/knowledge/occasions.py",202],["bot/knowledge/odours.py",283],["bot/knowledge/opinions.py",1508],["bot/knowledge/panic_talk.py",211],["bot/knowledge/parking.py",45],["bot/knowledge/pasta.py",303],["bot/knowledge/pensions.py",114],["bot/knowledge/pets.py",11217],["bot/knowledge/pharmacy.py",414],["bot/knowledge/photography.py",186],["bot/knowledge/picking.py",422],["bot/knowledge/picks.py",164],["bot/knowledge/plans.py",2612],["bot/knowledge/power_heat.py",43],["bot/knowledge/pregnancy.py",1302],["bot/knowledge/prices.py",186],["bot/knowledge/quantity.py",37],["bot/knowledge/rice.py",350],["bot/knowledge/routines.py",552],["bot/knowledge/rubbish.py",750],["bot/knowledge/sauces.py",196],["bot/knowledge/schoolmaths.py",217],["bot/knowledge/science.py",11486],["bot/knowledge/seasoning.py",277],["bot/knowledge/shopping.py",4141],["bot/knowledge/sleep.py",1046],["bot/knowledge/spice_heat.py",246],["bot/knowledge/sport.py",3981],["bot/knowledge/still_ok.py",913],["bot/knowledge/study.py",4795],["bot/knowledge/swaps.py",1042],["bot/knowledge/takes.py",329],["bot/knowledge/technology.py",7770],["bot/knowledge/travel.py",11322],["bot/knowledge/units.py",3420],["bot/knowledge/vegetables.py",961],["bot/knowledge/warm_food.py",161],["bot/knowledge/whenbuy.py",403],["bot/knowledge/wording.py",2806],["bot/knowledge/work.py",8132],["bot/memory/__init__.py",1309],["bot/memory/a_year_of_birth.py",122],["bot/memory/aboutthem.py",121],["bot/memory/ack.py",6079],["bot/memory/again.py",866],["bot/memory/already.py",906],["bot/memory/amounts.py",260],["bot/memory/another.py",480],["bot/memory/asleep.py",263],["bot/memory/baking.py",107],["bot/memory/carried_on.py",289],["bot/memory/carry.py",783],["bot/memory/cause.py",672],["bot/memory/change.py",153],["bot/memory/choice.py",663],["bot/memory/company.py",340],["bot/memory/condition.py",364],["bot/memory/corrected.py",1921],["bot/memory/counts.py",882],["bot/memory/deadline.py",103],["bot/memory/decided.py",697],["bot/memory/detail.py",1182],["bot/memory/doubt.py",155],["bot/memory/enough.py",666],["bot/memory/facts.py",10397],["bot/memory/favourite.py",519],["bot/memory/filler.py",36],["bot/memory/guest.py",218],["bot/memory/healing.py",331],["bot/memory/history.py",494],["bot/memory/hope.py",144],["bot/memory/hours.py",150],["bot/memory/household.py",191],["bot/memory/kidcount.py",131],["bot/memory/limit.py",860],["bot/memory/limits.py",288],["bot/memory/lineback.py",445],["bot/memory/matters.py",308],["bot/memory/meant.py",687],["bot/memory/more.py",220],["bot/memory/named.py",2610],["bot/memory/narrow.py",2652],["bot/memory/newborn.py",90],["bot/memory/not_a_trip.py",127],["bot/memory/not_this.py",235],["bot/memory/obstacle.py",644],["bot/memory/onset.py",378],["bot/memory/outfit.py",346],["bot/memory/passing_the_time.py",210],["bot/memory/pending.py",172],["bot/memory/people.py",249],["bot/memory/pile.py",124],["bot/memory/places.py",249],["bot/memory/plan.py",468],["bot/memory/plans.py",450],["bot/memory/prefer.py",190],["bot/memory/price.py",600],["bot/memory/purse.py",173],["bot/memory/quotes.py",71],["bot/memory/rates.py",289],["bot/memory/recall.py",590],["bot/memory/reject.py",681],["bot/memory/relations.py",1766],["bot/memory/remedy.py",184],["bot/memory/reminded.py",155],["bot/memory/rename.py",108],["bot/memory/repair.py",938],["bot/memory/repeat.py",4737],["bot/memory/resize.py",379],["bot/memory/returned.py",215],["bot/memory/returns.py",286],["bot/memory/saving.py",1899],["bot/memory/setback.py",318],["bot/memory/size.py",232],["bot/memory/spent.py",685],["bot/memory/spoken.py",137],["bot/memory/stands.py",235],["bot/memory/store_lines.py",1035],["bot/memory/store_replies.py",12266],["bot/memory/stuck.py",447],["bot/memory/surname.py",321],["bot/memory/swap.py",766],["bot/memory/taking.py",409],["bot/memory/taste.py",507],["bot/memory/the_years.py",213],["bot/memory/thread.py",1786],["bot/memory/times.py",223],["bot/memory/told.py",1552],["bot/memory/too_late.py",174],["bot/memory/topics.py",7810],["bot/memory/tried.py",1665],["bot/memory/trips.py",1518],["bot/memory/warmth.py",479],["bot/memory/when.py",1694],["bot/memory/whereabout.py",140],["bot/memory/whose_body.py",76],["bot/memory/workplace.py",198],["bot/memory/years_in.py",309],["bot/modules/__init__.py",1],["bot/modules/a_count_said.py",40],["bot/modules/a_day_somebody_else_keeps.py",121],["bot/modules/aboutachild.py",39],["bot/modules/already.py",26],["bot/modules/answers.py",11236],["bot/modules/arbiter.py",4029],["bot/modules/attribute_said_again.py",603],["bot/modules/bulky.py",153],["bot/modules/carers_turn.py",422],["bot/modules/chat.py",16948],["bot/modules/done_ask.py",240],["bot/modules/doubt.py",24],["bot/modules/favourites.py",161],["bot/modules/figure_asked_again.py",40],["bot/modules/greeting.py",901],["bot/modules/grief.py",818],["bot/modules/household.py",47],["bot/modules/how_long_a_stay.py",205],["bot/modules/intent.py",38],["bot/modules/invitation.py",48],["bot/modules/judge_ask.py",131],["bot/modules/keeping.py",137],["bot/modules/kid_tally.py",28],["bot/modules/live_source.py",294],["bot/modules/live_times.py",241],["bot/modules/loss.py",140],["bot/modules/memory_store.py",5955],["bot/modules/memory_tables.py",469],["bot/modules/my_work.py",26],["bot/modules/name_taken_back.py",107],["bot/modules/night.py",29],["bot/modules/nudge.py",56],["bot/modules/recap.py",150],["bot/modules/receiving_end.py",23],["bot/modules/record_due.py",171],["bot/modules/ruled_out.py",42],["bot/modules/safety.py",10139],["bot/modules/safety_cards.py",2126],["bot/modules/safety_phrases.py",1169],["bot/modules/safety_tables.py",7231],["bot/modules/said_back.py",28],["bot/modules/saving_followup.py",288],["bot/modules/steps.py",23],["bot/modules/taking_asked_again.py",45],["bot/modules/talkto.py",140],["bot/modules/their_life.py",285],["bot/modules/their_pastime.py",358],["bot/modules/theirperson.py",31],["bot/modules/thing_i_did_with.py",194],["bot/modules/trip_date_said_again.py",88],["bot/modules/understand.py",16],["bot/modules/urgent.py",30],["bot/modules/where_it_answers.py",47],["bot/modules/who_to_see.py",40],["bot/modules/words.py",197],["bot/modules/years_in.py",46],["bot/runtime.py",120],["bot/understanding/__init__.py",1761],["bot/understanding/body.py",566],["bot/understanding/breeds.py",171],["bot/understanding/kinds.py",6582],["bot/understanding/lexicon.py",1949],["bot/understanding/normalize.py",6657],["bot/understanding/references.py",419],["bot/understanding/senses.py",178],["bot/understanding/topics.py",3744]]}