Spaces:
Runtime error
Runtime error
Commit History
-
style(ui): add parent-friendly theme selector
Co-authored-by: Codex <codex@openai.com>cdc818d -
docs: point all dataset references at build-small-hackathon/fabella-traces
OpenCodeThe canonical public dataset is now at the hackathon org namespace, public, with a real card and 5 seed rows. Update every reference in the repo: - README.md YAML: add 'datasets: - build-small-hackathon/fabella-traces' so the dataset shows up in the Space's Datasets tab. - README.md body + files list: 4 references moved from Kiy-K to the build-small-hackathon namespace; the Sharing is Caring badge note now reads as 'claimed' with a link to the live dataset. - DATASET.md: default dataset path moved to the org namespace; the Kiy-K personal-namespace mention is downgraded to a 'local dev fallback' note. - app.py: the 'trace_publication' payload the parent sees in their Download my history bundle now points at the org dataset; the settings dialog link in INDEX_HTML points at the org dataset; the anonymization list gains a per-row UUID note. - trace.py: DATASET_REPO default switched from Kiy-K/fabella-traces to build-small-hackathon/fabella-traces so the live Space publis…d2ed801 -
chore: remove dead modal_app_gemma.py, gitignore working artifacts
OpenCode- Remove modal_app_gemma.py (legacy single-model Modal deploy, not the live deploy; both AGENTS.md and HANDOFF.md marked it 'Reference only. Do not redeploy from it.' Now noted as removed in both files). - Expand .gitignore to cover local agent / IDE / index / render artifacts that should never be part of the submission: .agents/, .codegraph/, .codex/, chrome-headless-shell/, kilo.jsonc, opencode.json, .kilocodeignore, skills-lock.json, video/, plus the usual build / cache / large-binary scrub. Repo goes from 18 to 17 tracked files. Working artifacts stay on disk for local use but no longer show up in 'git status' or risk accidental commit. The submission is now a clean source tree.54b50db -
fix(trace): race-free per-row publisher with atomic startup probe
OpenCodeThe previous publisher downloaded a single data/train-00000-of-00001.jsonl, appended locally, and re-uploaded the whole file on every flush. That is a read-modify-write cycle which (a) loses rows when two Space replicas flush concurrently, and (b) re-uploads the full file on every push (O(n^2) bandwidth as the dataset grows). Switch to per-row UUID files at data/<trace_id>.json, uploaded via a single HfApi.create_commit per flush batch. Each row is its own commit operation; the batch is one Hub commit. Race-free across replicas and across timer-thread vs. size-triggered async flushes within one process. Add a startup probe (_probe) that runs an atomic Add+Delete of a tiny data/.probe.json in one create_commit call. Catches (a) bad token, (b) missing repo-create rights, (c) missing repo-write rights at import time, so a misconfigured Space fails loudly instead of silently dropping rows for hours. The atomic pattern means a partial failure can never leave a sentinel .probe.json in the …38e55f0 -
Merge remote-tracking branch 'hf/main'
OpenCode6af7608 -
feat(asr): add optional Nemotron voice-note input
OpenCodedd6bf3b -
Upload README.md with huggingface_hub
Verified signature37cb102 -
Upload app.py with huggingface_hub
Verified signature9cfc7d0 -
chore(modal): drop warmup ping, document cold-start trade-off
OpenCodeThe warmup ping in app.py::_warm_modal_endpoints fired a /health request to each Modal endpoint as soon as the Space booted, so the first parent click would land on a warm container. We removed it: the Space restarts several times per day (code pushes, env-var changes, periodic HF rebalance), and each restart paid for an A10G cold start whether or not a parent ever arrived. With the ping gone, the first real request after a quiet period still pays a 30-60s cold start -- image-baked weights, eager mode, AOT compile cache, deep-gemm warmup skip -- and the 2-minute scaledown window keeps a parent who reads the welcome screen and clicks a chip on a warm container for free. docs: README and AGENTS updated to describe the no-warmup policy. docs: README Demo video section now links the X social post https://x.com/Kiy_K127/status/2066356328466202914 next to the YouTube link.839fa96
-
feat(privacy): parent self-export via Download my history
OpenCodeThe public trace dataset was removed by the maker for the demo. The trace publisher code is kept in the repo for re-deployment but is OFF by default (FABELLA_SHARE_TRACES=0). The only path to data now is the per-parent self-export. app.py - GET /api/history/download: returns a JSON bundle of this parent's history + memory + a 'trace_publication' statement that says exactly which dataset the redacted rows would go to, the URL, the per-session row estimate, and the same five anonymization passes. Content-Disposition: attachment so the frontend can trigger a file save via a hidden <a download>. - INDEX_HTML settings dialog now has a 'Download my history' button that hits the new endpoint, plus a 'Clear history' button mirroring the existing topbar clear. - Renamed the topbar clear button id from 'clear-history' to 'topbar-clear-history' to avoid a duplicate-id collision with the new dialog button. trace.py - SHARE_TRACES default flipped from '…6eb6f63 -
docs: add DATASET.md mirroring the fabella-traces card locally
OpenCodeReviewers reading the source repo now see the same schema and anonymization rules without having to round-trip to the Hugging Face dataset page. The HF dataset card at https://huggingface.co/datasets/Kiy-K/fabella-traces remains the source of truth; this is a convenience copy.fb5ecf0 -
perf(modal): bump per-server max_model_len to 8k/4k
OpenCodeDrafter 4096 -> 8192, judge 2048 -> 4096. The summarize-aggressive policy keeps the steady-state drafter input well below 4k tokens even for long conversations, so the extra headroom is a buffer against unusually long parent messages (multi-paragraph situations, very long follow-up questions, or a deep follow-up chain) without making the drafter pay for a 32k KV cache it never uses. Memory math on a 24 GB A10G with vLLM eager-mode: drafter 8k: 8 GB weights + ~3-4 GB KV cache + ~2 GB activations + 1 GB headroom = ~14-15 GB used, comfortable judge 4k: 8 GB weights + ~1-2 GB KV cache + ~1 GB activations + 1 GB headroom = ~11-12 GB used, comfortable Both endpoints stay well under the 24 GB GPU memory ceiling while giving the drafter and judge generous context for the actual workload shape.3fb0a0c -
fix(trace): point publisher at a writable dataset and self-create
OpenCodeThe dataset at build-small-hackathon/fabella-traces has been silently failing on every push because the Space's HF_TOKEN is contributor-level in that org and cannot create repos there. The publisher was calling upload_file against a non-existent repo and the rows were re-queued forever. Two fixes: 1. Default DATASET_REPO to Kiy-K/fabella-traces, where the contributor token does have create-repo rights. Pre-create the repo once via the CLI; the publisher can write to it from then on. The org-namespace path is still overridable via FABELLA_TRACE_REPO for when an admin pre-creates the org dataset. 2. Make the publisher idempotently self-create the dataset on first push via api.create_repo(exist_ok=True). A 403 still falls through to a clean WARNING; a successful create is silent. This protects against a future deployment that forgets to pre-create the repo. End-to-end verified: a synthetic trace row was built, the publisher flushed it, and the row appeared i…d1ebf9d -
perf(agent,modal): aggressive summarization + per-server max_model_len
OpenCodeThe drafter prompt is now aggressively summarized so we can run the servers with small max_model_len and pay only for the active context. agent.py::_build_user_prompt - Keeps the last 2 turns verbatim (recent context the parent is likely to follow up on). - Compresses everything older into a single short line capped at 320 chars via _summarize_turns(older_turns, max_chars=320). - Compression is deterministic and rule-based: each older turn is compressed to <=140 chars, with the oldest dropped on overflow. - On a 6-turn conversation: history input drops from ~800-1200 chars (verbatim) to ~589 chars. On a 50-turn conversation: older block is bounded at 320 chars vs ~5000+ verbatim -- savings scale with conversation length, which is exactly where KV-cache cost matters most. modal_app.py - Per-server max_model_len. Drafter 4096 (covers fixed overhead + summarized history + 4 drafter ReAct tool calls). Judge 2048 (covers rubric + draft + verdi…00b75ae -
perf(modal): bake weights, eager-load, drop max-model-len, AOT cache
OpenCodevLLM docs surveyed for cold-start levers; applied the ones that shave startup time without cratering throughput. Image-bake the model weights vllm_drafter_image and vllm_judge_image use Image.run_function( download_drafter / download_judge) so the shipped image already contains /models/<name>. Cold start drops the first-boot Volume read of ~10-20s. Same pattern for VoxCPM2 on the TTS image. Trim the vLLM server flags - --enforce-eager: skips CUDA-graph capture, saves 20-40s of cold start at a small per-token throughput cost. The right tradeoff for a demo where first-token latency matters more than tokens/sec. - --max-model-len 2048 (was 8192): the actual request payloads are short (parent situation + age/tone + a 4-call drafter + a single judge call). Smaller context shrinks the warmup profile. - --gpu-memory-utilization 0.85 (was 0.90): leaves room for AOT compile artifacts. - --safetensors-load-strategy eager: weights are local (image layer o…1aa5492 -
perf(modal): cold-start on demand with eager-mode and warmup ping
OpenCodeSwitch all three Modal containers to min_containers=0 with a 2-minute scaledown_window so the GPU bill is tied to actual traffic instead of wall-clock. The 3-day demo can't afford 3 always-on A10Gs. Cold-start cost on a fresh container is now ~60-120s for the LLM endpoints and ~30-60s for VoxCPM2. Two real mitigations: 1. --enforce-eager on the vLLM servers. Skips CUDA-graph capture at the cost of some steady-state throughput. Saves 20-40s of cold start. The right tradeoff for a demo where first-token latency matters more than tokens/sec. 2. Space-side warmup ping. app.py fires a non-blocking /health request to each endpoint from a daemon thread on Space import. The cold start happens while the parent is reading the welcome screen; the first real request lands on a warm container. Failures are silently logged; warmup is a hint, not a requirement. Smaller judge is not the lever (the bottleneck is vLLM's import + compile, not 4B vs 7B). Image-bake of weights is t…c7dc151 -
fix(trace): restore capture pipeline and surface Hub failures
OpenCodeThe trace publisher was silently dropping rows. Two real bugs: 1. The judge verdict was hard-coded to None in agent.py's _maybe_publish_trace. The comment claimed re-parsing would couple trace.py to judge.py's internals, but the verdict already lives in the validate_explanation ToolMessage. trace.py now extracts it from messages directly by matching the verdict JSON shape, not by ToolMessage.name (which LangChain 1.x does not auto-populate). 2. _anonymize_messages did str(content) for non-str content fields. In LangChain 1.x, AIMessage.content can be a list of content blocks like [{type: text, text: ...}]. The stringified list leaked into the public dataset. _stringify_message_content now joins just the text blocks. 3. The publisher's failure path is now loud and actionable: - HF_TOKEN / HF_HUB_TOKEN: accepts either name; logs WARNING (not INFO) when the token is missing so the disabled state is visible in Space logs. - On a failed Hub push…df69d2f -
Revert "docs: link demo video and ship HyperFrames composition source"
OpenCodeThis reverts commit ec821d9f3a95956aaf90a5204908f1450342d7af.652271b -
Delete video directory
Unverified signatured988bce -
docs: link demo video and ship HyperFrames composition source
OpenCode- README: add Demo video section pointing at https://youtu.be/dAoy1GRbEV8, document the ElevenLabs (Roger / multilingual_v2) + Whisper small.en caption pipeline, and add a video/ tree snippet showing the composition, narration, snapshots, and final render. - video/: ship the HyperFrames composition source (index.html, package.json, hyperframes.json, narration.txt, legacy beat compositions, capture assets, fonts) so the demo can be rebuilt from the repo. - video/.gitignore and root .gitignore: exclude HyperFrames intermediate renders, snapshots, chrome-headless-shell install, generated narration.wav, build caches, and tool config. - scripts/: add HF Job download scripts for Gemma 4 E4B-IT and Gemma 4 12B-IT.ec821d9 -
chore: boilerplate and bootstrapping
Co-authored-by: Codex <codex@openai.com>17aede9 -
chore: boilerplate and bootstrapping
Co-authored-by: Codex <codex@openai.com>74da6ec -
feat: sync final submission code
OpenCode8e12b6e -
docs: add sponsor prize notes and final submission cleanup
OpenCode77141b2 -
Fabella Phase 3: chat UI, HF Auth, bucket JSON history
Fabella Devd25c901 -
Fabella Phase 2: add read aloud and redesign frontend
OpenCode18729ef
-
Fabella Phase 1: Gradio app with mock + real model paths
OpenCodeb3818ca