Spaces:
Paused
Paused
Commit History
-
fix(zerogpu): persist quota ledger so a restart stops claiming phantom minutes
The adaptive lease sizing added in b5a8e39 clamps the requested GPU lease to the remaining daily allowance, but the tracker behind it was in-memory only. Every Space reload therefore reported a full 40 minutes while Hugging Face was already refusing leases, so the clamp saw headroom that did not exist and re-requested the full window: exactly the denial it was meant to avoid, and the reason the UI could show '31/40 min left' next to a GPU-limit 429. Persist the ledger to the Space's writable data directory (opt out with FLOW_QUOTA_LEDGER_PATH, disabled under pytest) and report zero remaining while a fresh platform refusal is on record, since an observed refusal outranks a ledger that only knows the leases this process watched.db08952 -
fix(zerogpu): size GPU lease to remaining quota instead of a fixed 120s
Hugging Face bills the whole requested lease and denies any request larger than the remaining daily allowance. Every chat call asked for a fixed 120s, so once the day was nearly spent the platform refused the lease outright even though a short completion would have fit comfortably. That denial was reported upstream as a bare failure, which downstream routers then mislabeled as a per-credential/model cooldown. Clamp the requested lease to the actual remaining headroom (with a floor so an exhausted day still attempts one real lease, since a denied lease does not consume quota) and report the quota ceiling as a structured 429 carrying requested/remaining/daily seconds. Duration is now a per-invocation callable across all ZeroGPU entry points.b5a8e39 -
fix(api): expose /v1/warmup on the served Gradio app
AndrianBalanescuProduction serves demo.app, which builds its own route table by hand. /v1/warmup only existed on fastapi_app, so the endpoint every test mounts answered 200 locally and 404 on the live Space. Register it alongside the other REST routes and add a parity test that fails whenever the two route tables drift apart.c91a92a -
feat(models): add Qwen3.8-27B Turbo Coder to the ZeroGPU catalog
AndrianBalanescuAdds the DavidAU TURBO NEO-CODER MAX build as a 27B option. The regular Q4_K_M quant is picked over the MTP variant on purpose: this integration never enables draft decoding, so MTP heads would only add weight. Also moves GGUF fetching out of the GPU lease. A cold 17 GB download far exceeds the 120 s budget, so a first call could time out and burn quota; weights are now fetched on CPU before gpu_tracked_call opens the lease. Fixes a test that touched the live Space: the remote MiniMax mock read .full_url unconditionally, so the string download leg raised, the route fell through to ZeroGPU, and the test depended on the daily quota.b08fc22
-
fix(api): harden empty-content handling for ZeroGPU chat
AndrianBalanescullama-cpp returns content=None whenever it resolves a native tool call, and some GGUF chat templates emit an empty string instead of null. The UI handler, warmup probe, and chat endpoint all assumed a string and could crash or echo "None" back. Coerce the value once per call site and cover the empty-content and nested-JSON-arguments paths with regression tests.a86614a -
fix(api): recover Qwen tool calls on ZeroGPU
AndrianBalanescuThe XML/think regexes required literal spaces around the tags, but Qwen emits newlines, so agentic calls were dropped and returned as plain text with finish_reason=stop. llama-cpp native message.tool_calls were also ignored because only message.content was parsed. Match arbitrary whitespace in both tool_call formats, split reasoning on the bare closing tag, and prefer structured native tool calls, converting arguments back to JSON strings. Adds regression tests for both paths.09957a9
-
fix(cron): reserve ten ZeroGPU minutes for interactive use
AndrianBalanescu6b2fd64 -
test: send FLOW_API_KEY bearer in phonetic e2e client fixture
AndrianBalanescuThe studio auth middleware (P0-1) returns 401 for unauthenticated requests. test_phonetic_e2e.py lives in tests/ (integration), so the unit-fixture sweep missed it. Add the conditional Authorization header matching the other studio test fixtures. verify_all.sh now fully green.8ec66e3 -
security+perf: enforce studio auth and cache singletons
AndrianBalanescuP0-1: add FLOW_API_KEY bearer-token middleware to studio_server.py (parity with app.py), with static/OPTIONS exemption and ?key= fallback. P1: cache DictionaryManager + ModelDispatcher via mtime/settings invalidation instead of per-request instantiation. Tests: update fixtures to send Authorization; add test_studio_auth_enforcement.py (7 tests). Closes P0-1 and P1 from audit.1a4837b -
fix(farm): derive transcript genre/persona from corpus category
AndrianBalanescuTranscript topics hardcoded the news persona for every transcript, but the corpus already carries an authoritative category per video and the established design is category-first (CATEGORY_STYLE). A comedy video's transcript would have reached the farm as protv_anchor instead of the standup persona. Transcripts now join the corpus by video_id: category maps through CATEGORY_STYLE, published_at comes from the corpus record, and the hardcoded pair remains only as the fallback for videos that left the corpus. Both paths are covered by tests, and hardcoding the category again fails the comedy-join test.cc2fce9 -
feat(farm): feed harvested transcript content into live topics
AndrianBalanescuTranscription was write-only: the pipeline saved transcripts under data/transcripts/ but live topics came only from video titles, so the actual spoken material never reached the song farm. The bulletin's real content ("prețul motorinei s-a majorat cu aproape 2 RON") was harvested and then ignored. live_topics now reads transcript files as a first-class source (youtube_transcript, quota 3) and extracts one representative sentence per transcript. Extraction is data-driven per the no-hardcoded-lists rule: - document frequency across harvested transcripts down-weights boilerplate (greetings, "vă prezint știrile") without any stopword list, and - sentences must anchor on a specific title term (7+ chars, longer terms weigh more), so an unrelated transcript contributes nothing rather than an arbitrary sentence. Measured on real data: the PRO TV bulletin transcript yields "Republica Moldova este dependentă în totalitate de importurile de produse petroliere..." as a farm …1af93fd -
fix(harvest): use YouTube captions instead of GPU-bound transcription
AndrianBalanescuTranscription was reported as an unfixable external blocker. It was not. Measured on a real 12k-view PRO TV bulletin (Chfv2fMJ-mk): the audio download returns HTTP 403 (YouTube bot wall) and the homelab Whisper service returns CUDA OOM because its 8 GB GPU is oversubscribed (TTS 2414 MiB + whisper 5222 MiB = 7636 of 8151 MiB used). Both paths that existed failed, so the whole harvest produced nothing. The video's own ASR caption track, however, downloads fine and yielded 5,527 words of real broadcast Romanian in ~4s with no GPU and no media download. Captions are now the primary source; audio+Whisper is the fallback: 1. youtube-captions -- yt-dlp --write-auto-subs, json3/vtt parser 2. homelab-http -- existing homelab Whisper service 3. local-cpu -- local faster-whisper int8 on CPU The json3 payload emits overlapping rolling windows, so consecutive duplicate lines are dropped instead of emitted several times. For videos without captions, scripts/setup_local_whis…ec9315c
-
fix(studio): keep song structure when trimming, add remote MiniMax route
AndrianBalanescuTwo defects found while wiring the farm, neither in the harvesting path: - lyricist_engine: _cap_lyric_sections deleted whole structural sections to save a single line, so songs could lose their Outro entirely. Trimming now keeps at least one line per section and only drops trailing non-core sections if still over budget. This also fixes the pre-existing red test test_bake_multilevel_lyrics_structure. - model_dispatcher: implement the remote MiniMax Music 3 route that an orphaned TDD spec (5 failing tests) already described, tried before ZeroGPU so the free endpoint costs no quota and falls back on any error. This commit also carries an in-flight lyric-metadata sanitization change in lyricist_engine.py from a concurrent writer in the same checkout (its own test file is still untracked upstream of this commit). It was staged together inadvertently while this file was being edited. The combined state is coherent: 331 tests pass at this commit.f688cb3 -
fix(pipeline): stop reporting success over broken harvest stages
AndrianBalanescuThe weekly harvest reported "COMPLETED SUCCESSFULLY" while transcription had been producing nothing for weeks: 8 of the 12 recorded runs transcribed zero videos, and 15 of 16 runs printed the success banner anyway. - transcribe: return attempted/processed/failed counts and exit 1 when work was attempted but nothing was produced, so a total failure is visible. - transcribe: the configured endpoint pointed at homelab:8086, where nothing listens; Whisper is served via Caddy at /api/v1/whisper/v1/audio/ transcriptions, and requires the multipart part to be named "file". - transcribe: select the real downloaded media file. The old check accepted any non-".part" file, which matched yt-dlp's ".ytdl" metadata JSON and made Whisper answer HTTP 500 "Invalid data". - transcribe: drop --impersonate (combined with browser cookies it removes audio-only formats, so the fallback downloaded a 475 MB 1080p video) and normalize everything to 16 kHz mono WAV with ffmpeg. - transcribe: enfor…58cb127 -
feat(farm): wire harvested Moldovan content into song topics
AndrianBalanescuLive topics were sourced from stale or mis-parsed material, so the farm's "real-time" topics were not real: the news digest was picked by reverse filename sort (always the legacy digest_*.json), the YouTube corpus was ranked by all-time view_count (decade-old viral videos), and Harbuz TV was parsed from the PRO TV news rundown instead of its own satire section, so dedup always erased it. - live_topics: select digests by mtime, rank corpus by publish date with a freshness window anchored on the corpus, per-source quotas instead of a global cap, and a Bresenham accumulator so the 15% live ratio spreads evenly instead of bursting into the first indices. - live_topics: map genre/persona from the corpus's authoritative `category` field. Title-keyword matching missed real comedy ("ABS #53"), making the Comedy Rap / Standup genre and standup persona unreachable. - farm_songs: fix --loop spinning forever on a dead endpoint (it only broke the inner loop while logging "Stopping") an…cdafb70 -
Fix song farm duration: size lyrics to hit 2:30-3:30
AndrianBalanescuMiniMax Music 3 sings the lyrics through ONCE at ~15s/line, so track duration = line count, NOT the audio_duration param (which it ignores). Earlier farm songs came out 66-115s because the LLM baked 30-50 line telenovela lyrics. - bake_multilevel_lyrics: compute target_lines from duration_seconds (180s -> 12 lines), inject a hard length rule into the prompt, and cap parsed sections as a backstop (LLM ignored the prompt alone) - _cap_lyric_sections: trim to target, preserving intro/verse/chorus spine - tests: 281 passed (cap unit test + target_lines scaling)ac4a7ec -
Add Song Farm control center widget + remote MiniMax retry
AndrianBalanescu- farm_songs.py: UUID song ids (collision fix), on-disk vault sidecars (WAV + JSON) so the studio app inventories farm output, MiniMax generate_remote retry + generous timeout - studio_server.py: /api/farm/{status,start,stop,log} control endpoints (pid probe, disk vault counters, subprocess lifecycle) - index.html: new Song Farm tab (live status, start/stop, tunable songs/concurrency/duration/model/endpoint, recent songs, log tail, 5s auto-poll) - tests/unit/test_song_farm.py: 6 offline route-contract tests iBrowse QA: PASS (Farm tab renders all sections, 0 console errors).b162b1b
-
chore(security): set visibility to private, sanitize internal Tailscale IPs, and drop qa_evidence tracking
AndrianBalanescu4fb8728
-
fix(hub): add model alias resolution and persist canonical ibrowse qa evidence
AndrianBalanescuf725c6a
-
feat(lyrics-baker): streaming SSE arena, Pydantic schemas, dictionary expansion
AndrianBalanescu- Add BakeMultilevelLyricsRequest Pydantic schema for validated input - Stream arena endpoint /api/media/lyrics/baker/stream-arena with SSE - Frontend: real-time streaming display with fallback to batch - Expand moldovan_master_dictionary.json (+309 entries) - Dialect converter: cleaner level transitions - Refactor test_lyrics_baker.py: reduce duplication, align with new schemas - lyrics.html: streaming reader + tab rendering per draft8e0d687 -
test: cron-level regression for quota stop saving resume state and aborting album
AndrianBalanescuSimulates the real Space behaviour where the lease attempt itself raises ZeroGPUQuotaError ('exceeded your Pro ZeroGPU quota (180s requested vs 64s left)') while the /v1/gpu/status counter stays blind. Asserts the album aborts at the failing track, marks it deferred_quota, sets interrupted_by_quota, and persists resume state with next_track_index and the exact planned track order.443904f -
fix: classify ZeroGPU quota stops surfaced via Gradio queue output errors and async-jobs failed status
AndrianBalanescuThe cron treated hard account-level quota stops as generic track failures: Try 1 (Gradio SSE) printed 'Gradio queue output error: You have exceeded your Pro ZeroGPU quota (180s requested vs 64s left)' but returned None, and Try 2 (async jobs) did the same with 'GPU task aborted'. generate_music only classified the final aggregated gpu_error, and only for two specific strings. Result: track marked audio_status=failed, resume state wiped, album 'finished'. Now both failure branches raise ZeroGPUQuotaError on quota text, and both generic except handlers re-raise it, so the cron saves resume state and stops the album immediately. Regression test added.9d67601 -
fix(cron): cap Albina album at 6 tracks (subset rotatie)
AndrianBalanescu_build_album_tracks('ALBINA_BONDAR') intoarnea toate cele 24 de concepte din catalog -> album planificat ~4h care arde toata cota ZeroGPU zilnica (observat live: 9 piese pana la epuizare). Acum foloseste build_albina_tracks(count=6): subset rotit, fara repetare. Test de regresie adaugat (cap + fara duplicate).6e3c35f -
fix(cron): persist exact track order in resume state
AndrianBalanescuResume rebuilds the track list via _build_album_tracks which now shuffles — so resumed track #N could be a different song than originally planned. Resume state now carries track_order (persisted from _planned_tracks, stripped from album_manifest.json serialization) and the restore path replays the exact saved sequence with a mismatch warning fallback. Verified by integration test: save -> reload -> rebuild -> reorder restores the exact original sequence.e8bddb0 -
albina bondar character + genre plan + lyrics diversity fixes
AndrianBalanescu- engine/albina_bondar.py: 24 track concepts, family-friendly character sheet, weighted genre distribution (45% Albina Bondar) - daily_album_cron.py: wire ALBINA_BONDAR genre (picker, shuffled tracks, persona pass-through, MiniMax happy-family prompt, --genre CLI override) - lyricist_engine.py: fix lyrics saving bug (full_lyrics key), OmniRoute empty-200 retry with nudge, dynamic dictionary-driven fallback (no canned template), family-friendly prompt mode, inline meta-marker strip - personas_registry: albina_bondar persona (family_friendly=true) - tests: test_albina_bondar.py (6), dom_closure updated to 11 personas - live verified: OmniRoute retry 200-empty -> real lyrics, fallback uniqueness 3/3, zero banned words in family moded770801
-
fix(dispatcher): preserve first quota error over generic HTTP 500
AndrianBalanescuWhen all three ZeroGPU transport routes fail, gpu_error kept the LAST exception (usually a generic 'HTTP Error 500' from the REST route) and masked the account-level quota text from Try 1/2. That prevented ZeroGPUQuotaError from firing, so the cron never saved resume state and track 6 failures were misclassified as hard engine failures. Now the first error wins (gpu_error = gpu_error or e), quota classification works, and album resume persists correctly. 2 unit tests.fb6bb80 -
fix(quota): expire stale quota_exhausted_observed flag via TTL
AndrianBalanescuOne quota error used to stick the exhausted flag for the whole UTC day even when HF's rolling-24h window had actually freed up. Now the flag expires after FLOW_QUOTA_FLAG_TTL_S (default 2700s), mirroring the client-side guard in model_dispatcher.check_gpu_quota. A real generation attempt always arbitrates. Includes 2 new unit tests (15 pass).a29d413
-
feat(karaoke): anti-drift monotonic alignment, confidence scoring and 3 display modes (word, line, scroll)
AndrianBalanescuf222dd5 -
feat(moldovan-qwen): cron quota guard + resume, junk audit, baker alternatives fix
AndrianBalanescu- daily_album_cron: ZeroGPUQuotaError handling stops album + saves resume state; next-day resume continues interrupted albums (same dir/manifest, deferred placeholder entries dropped on reuse); pre-warm Space via /v1/health; quota pre-flight at album start and before every 120s segment - model_dispatcher: ZeroGPUQuotaError raised on Space quota-exhaustion text; check_gpu_quota() read-only /v1/gpu/status pre-flight (degrades permissive); warm_up() health probe loop; dead ask-llm branch removed - lyricist_engine: Baker lines with inline #chips no longer ship empty alternatives - synthesize Tier 1/2 on demand (fixes bake test contract) - junk audit: 30+ unused imports, dead vars, f-strings, undefined logger bug in studio_server removed; 953MB intermediate WAVs archived to data/archive/zerogpu_segments (gitignored) - data: moldovan_master_dictionary + regionalisme + master lexicon persona - tests: new test_lyrics_baker suite (10 tests); cron/llm tests updated to current c…a003137
-
fix(vault): derive audio_file from audio_filename/audio_url for legacy song manifests
AndrianBalanescuLegacy song JSONs store audio under audio_filename + audio_url keys while vault/music and the manifest dedup pass only read audio_file/audio_path, so 20 songs with real on-disk audio showed as audio-less in the UI. Both readers now fall back to audio_filename and derive the filename from audio_url. Adds unit test test_vault_music_schema_drift_audio_filename. Also records the 3 MiniMax backlog renders (botanica_808, hora_de_la_butuceni, miros_de_pâine_coapta) that completed in the 18:15 UTC ZeroGPU window.0926ba3 -
fix(burst): route UNET through ModelSamplingSD3 shift=8 per official Comfy-Org Wan2.1 template
AndrianBalanescuc03e859 -
feat(burst): --max-cost hard cap refuses VM creation when estimate exceeds budget
AndrianBalanescu56dbca9 -
Add burst --detach mode, macOS notify, and manifest auto-generation
AndrianBalanescu--detach spawns a fully detached --go run (survives terminal/agent exit), logs to ~/.flomaster/scratch/hyperstack_burst/burst_run.log, and posts a macOS notification on completion. --from-artwork-dir builds a scene manifest from a directory of png/jpg/webp covers.e1e8939 -
Add Hyperstack burst I2V scene renderer with offline unit tests
AndrianBalanescuSpot A100-80G lifecycle: provision -> ComfyUI + Wan2.1-I2V-14B bootstrap -> artwork upload -> per-scene render -> download -> teardown. Defaults to dry-run; --go required to create a VM. Reuses proven constants from the hyperstack-qwen38-vllm skill (infrahub-api base, n3-A100x1-spot).30be5ec -
feat(vault): orphan karaoke video reconciliation and sidecar audio fallback
AndrianBalanescu- list_vault_music now surfaces {sid}_karaoke.mp4 files that exist on disk but whose manifest lacks the karaoke_video link (e.g. song_1788557867_878) - _find_track_audio falls back to the track sidecar (audio_file/audio_path/ audio_url) so POST /karaoke-video works for songs whose audio is stored under a studio_track_* filename (fixes "Audio not found for track") - Vault Workstation layout refresh in static/index.html (asset grid, stats badge, richer music cards) - embedded JS validated via node --check - tests: orphan reconciliation + sidecar audio resolution (218 passed, 1 skipped; verify_all.sh green) Live validation: song_1788557509_354 rendered word-synced karaoke video (whisper timeline, 900 frames, 30s) via REST; vault now shows 4 karaoke tracks; video stream returns 206 with Range header.53e33d5 -
feat(ui): add karaoke video playback modal and render triggers to track cards
AndrianBalanescu- Display emerald microphone badge on music track cards with existing karaoke video - Add emerald microphone button to launch responsive karaoke video playback modal - Add amber microphone-plus button for songs with audio to render word-synced karaoke via /karaoke-video - Add dedicated unit and integration tests in test_ui_karaoke_integration.pya762fd5 -
fix(vault): persist karaoke video fields into song manifest on standalone render
AndrianBalanescuPOST /api/media/song/{id}/karaoke-video wrote the MP4 but never linked it into the song manifest, leaving vault/music with karaoke_video: null for manually rendered videos. Now persists karaoke_video + karaoke_video_file after successful render (song manifest or audio sidecar). Empirical: live re-render on song_1788141035_887 -> vault exposes fields; new unit test covers endpoint -> manifest -> vault chain (213 passed).f92e066
-
fix(lyricist): dual anti-prompt-leak defense (prompt rule 0 + parser filter)
AndrianBalanescuhermes-405b sporadically echoed meta-prompt lines into lyrics (e.g. 'REGULI CRUCIALE DE COMPOZITIE', 'Titlu:', 'Versuri:', 'Producer Brief'). Defense in depth: - system prompt rule 0: response contains ONLY the song; echoing rules is a failure - parser: deterministic filter strips meta-prompt echo lines and stray meta-headers before sections are built - 2 new unit tests cover both layers (9 lyricist tests total)a4393ad -
lyricist: uncensored-first LLM chain + short punchy composition rules
AndrianBalanescu- _call_llm now tries openrouter/nousresearch/hermes-3-llama-3.1-405b BEFORE paid-premium combos (empirical: combos currently return empty content via glm-5.3-flash; hermes-405b produced solid AABB Moldovan lyrics in live test) - ask-llm bridge guarded with shutil.which (fail fast, no subprocess) - system prompt: 'less is more' short 6-11 syllable punchy lines; bounded mature language 10-20%, no prompt leak rule - unit tests: bridge skip guard, uncensored-first ordering, prompt rules Live E2E: compose_lyrics('seceris in satul natal') -> 22 lines, AABB rhymes (rul/rul, are/are), authentic slang, structured sections.c957f1a -
studio: expose karaoke_video in vault/music + flag karaoke videos in vault/videos
AndrianBalanescu- vault/music items now carry karaoke_video/karaoke_video_file so the Music Studio vault browser can present song+video as one entity - vault/videos marks _karaoke.mp4 entries with topic 'Auto karaoke lyrics video', style '16:9 Karaoke' and karaoke:true - unit test covers both listing integration boundaries Live-verified on :8090 (28 songs, 1 linked; 13 videos, 3 flagged).fa05447 -
feat(karaoke): link rendered karaoke video into song manifest
AndrianBalanescu- _link_karaoke_to_song(): on successful background render, writes karaoke_video (stream URL), karaoke_video_file and karaoke_rendered_at into data/generated_music/<id>.json so the UI can present song+video as one entity - Dedup accidental double KARAOKE_PYTHON definition - New unit test verifies manifest linking after real background render (198 total)2e90b9c -
feat(karaoke): default-on auto karaoke video for every new song
AndrianBalanescu- _kick_off_karaoke(): background thread renderer, fire-and-forget, never blocks song creation - Wired into POST /api/media/song/create, /api/media/song/update and regenerate_audio - Response embeds karaoke.status (rendering/skipped/disabled) + stream video_url - Env toggle KARAOKE_AUTO=0 to disable; KARAOKE_PYTHON selects whisper venv - 4 new unit tests incl. full TestClient E2E with background render polling - Live verified: 30s MiniMax track rendered 900 whisper-timed frames in 13s, stream 200, vault visiblef9efdd3 -
Merge remote-tracking branch 'origin/main' into deploy_main
AndrianBalanescu# Conflicts: # requirements.txt2a5feaa -
feat(karaoke): word-synced lyrics video engine + vault sidecar features
AndrianBalanescu- engine/karaoke_video.py: Pillow frame renderer -> ffmpeg image2pipe (bypasses missing local libass/drawtext), faster-whisper word timestamps with uniform fallback timing, Moldovan tricolor accent, progress bar - studio_server: POST /api/media/song/{id}/karaoke-video + stream route - vault: dedup music manifests vs raw audio, sidecar auto-init, favorites toggle+filter, comments CRUD, lyrics endpoint, project bundle, prune unlinked FLUX images, images hidden in ALL mode - tests: +5 karaoke unit tests, 192 total passing0e8ff26 -
fix(deps): unpin qwen-tts family; feature-gate Breeze TTS 2
AndrianBalanescuqwen-tts==0.1.1 pins transformers==4.57.3 which requires huggingface-hub<1.0, mathematically incompatible with the MiniMax Music 3 diffusers pin (requires huggingface-hub>=1.23). This broke the Space build (ResolutionImpossible) since 4a8de45. - requirements.txt: restore transformers>=4.47.0 float, drop qwen-tts/torchaudio/librosa/einops/onnxruntime - app.py: add _breeze_available() gate (breeze_infer + qwen_tts spec check); /v1/audio/speech Breeze route returns 503 when disabled; Gradio tab shows a disabled notice; startup pre-cache skipped - tests: BreezeRequirementsTests now assert the qwen-tts family stays OUT of requirements and the gate exists; catalog test is gate-aware412691f -
test: pass FLOW_API_KEY bearer header in space_client fixture when set
AndrianBalanescuec2b860 -
feat(zerogpu): add Breeze TTS 2 experimental voice + remove image gen by policy
AndrianBalanescuBreeze TTS 2 (BreezeBlue/Breeze-TTS-2) on ZeroGPU: - Vendor breezeblue-ai/breeze-tts inference code under zerogpu/ (eager mode) - Add GPU worker (voice design + reference voice direction) with instruction presets, seed control, CFG scale, 24kHz PCM16 WAV output - New Audio Lab sub-tab with language/emotion/custom voice direction - /v1/audio/speech routes breeze model names before MiniMax music routing - /v1/models exposes BreezeBlue/Breeze-TTS-2 - CPU startup pre-cache of 7.3GB weights so ZeroGPU lease is never spent on downloads - requirements: qwen-tts==0.1.1, transformers==4.57.3 pin, torchaudio, librosa, einops, onnxruntime - Weights are RESEARCH AND NON-COMMERCIAL: art experiments only (documented) Policy: Space scope is Music + Music Videos only - Remove FLUX/image generation: Tab 5 UI, /v1/images/generations endpoint and route, IMAGE_MODELS/FLUX_MODEL catalog, voice_to_art FLUX stage (pipeline now stops at expanded creative prompt) - Update auth test route list; add 2…4a8de45 -
freight: QLoRA pilot complete - 98.1% holdout CE improvement, adapter on private HF repo
AndrianBalanescurun_pilot.py: Qwen2.5-1.5B-Instruct 4-bit NF4 QLoRA, LoRA r=16 alpha=32 all-linear, 3 epochs on 298 redacted freight records in 223s on rented L40 spot (~$0.50 total). Fixed TRL 1.12 API drift (max_length instead of max_seq_length, no warmup_ratio). Holdout eval (identical batched CE, 38 records): base 3.60651 -> adapter 0.06859. Adapter + metrics + model card w/ rollback live on private abalanescu/loadeta-freight-pilot. GOAL.md M4 lines 63/64/66 checked; verdict: revisit training at >=1k records or measurable business eval; VM destroyed immediately after run.65c07a4 -
feat(freight): dataset pipeline — clean, dedup, redact, split, version
AndrianBalanescuMilestone 4 (GOAL.md line 59): private dataset pipeline for HF Datasets. - Stages: load/clean (schema+size validation, auto-ids), dedup (exact hash + Jaccard>=0.92 near-dup within opening groups), pattern redaction (email/phone/MC#/street -> [*_REDACTED] tokens, incl. tool_calls arguments), stratified split by intent (seeded), manifest with content fingerprints. - 9 offline unit tests (tmp_path only, no real data dirs). - Real run: 503 -> 373 unique (47 exact + 80 near dups), 210 PII hits redacted, 298/37/38 splits, zero leaks verified post-redaction. - Versioned v1.0.0 pushed to private dataset repo abalanescu/flow-freight-dataset with dataset card.a4761e3 -
feat(telemetry): record completion tokens for GPU throughput metric
AndrianBalanesculease_end now carries completion_tokens extracted from chat usage, so chat_throughput_tokens_per_gpu_second becomes live. Adds quota-error exhaustion test for the 429 mapping path.11732b0