Skip to content

Publish fine-tuned model to catalog and assign to a running app#7

Open
keypair34 wants to merge 7 commits into
developmentfrom
feature/publish-finetune-to-catalog
Open

Publish fine-tuned model to catalog and assign to a running app#7
keypair34 wants to merge 7 commits into
developmentfrom
feature/publish-finetune-to-catalog

Conversation

@keypair34

@keypair34 keypair34 commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • After a fine-tuned GGUF finishes uploading to Hugging Face (GgufDetail screen), pressing a now registers it into the GresIQ model catalog (private to the account, per smbcloud-api's new POST /v1/client/gresiq/models) and drops into a new PublishModel screen to assign it straight to a running app.
  • Assignment reuses the existing assign_model plumbing, so the app picks up the new model live via the SDK's load_assigned_model polling — no App Store update needed.
  • Requires smbcloud-gresiq-sdk 0.4.9 (published) and the matching smbcloud-api backend endpoint (merged to development and confirmed live in production).

Test plan

  • cargo build — clean, resolves smbcloud-gresiq-sdk 0.4.9 from crates.io
  • cargo clippy --all-targets — clean
  • cargo test — 25 passed, 2 ignored (heavy GGUF integration tests)
  • tmux smoke test confirming the TUI launches and renders correctly with the new screen wired in
  • Verified the backend endpoint is live in production via direct API check (POST /v1/client/gresiq/models returns 401 auth error, not 404)
  • Manual end-to-end run through a real fine-tune → upload → register → assign flow against a live account

keypair34 and others added 2 commits July 11, 2026 17:59
After a fine-tuned GGUF finishes uploading to Hugging Face, let the
user register it into the GresIQ model catalog and assign it straight
to a running app from the same screen, so a fine-tune can go live
without an App Store update.

Depends on smbcloud-gresiq-sdk 0.4.9's new create_model() (not yet
published to crates.io) and the matching backend endpoint in
smbcloud-api (not yet deployed) -- this branch will not build from
crates.io until 0.4.9 is published.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Confirms the publish-to-catalog branch now builds cleanly straight
from crates.io with no local patch needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@sigit-code sigit-code Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adds a post-upload flow to register a fine-tuned GGUF into the GresIQ catalog (gresiq::create_model) and a new PublishModel screen to assign it to a running app. app.rs wires the a key on GgufDetail, spawns the register task, and handles ModelRegistered/ModelRegisterFailed events; ui.rs renders the new picker and updated footers. derive_base_model_meta guesses family/parameter class from the base model id and has tests.

Reviewers should check the assign path in the new screen (it relies on assigning_for_app_index + models_cursor state being consistent) and the family-detection ordering in derive_base_model_meta.


Automated review by siGit Code · commit a248667

Comment thread src/app.rs Outdated
Comment thread src/app.rs
Comment thread src/app.rs
Comment thread src/app.rs
- Run cargo fmt to fix the CI Format check failures
- Hold the freshly registered model by id/name in dedicated fields
  instead of a models_cursor index, so assignment can't drift onto a
  different row if the models list is ever reloaded while the publish
  screen is open
- Fix parameter-class detection to require a digit boundary, so a
  size like 3B can no longer falsely match inside 13B or 43B
- Key the apps-list loading indicator off apps_loaded instead of busy,
  since busy can flip back to false from an unrelated event before the
  apps fetch actually finishes
- Add regression tests for the size-detection fix

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@sigit-code sigit-code Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adds a publish-to-catalog flow: after a fine-tuned GGUF uploads to HF, pressing a on GgufDetail registers it via the new gresiq::create_model (SDK 0.4.9) and transitions to a new PublishModel screen for immediate assignment to a running app.

Key pieces: new Screen::PublishModel, AuthEvent::ModelRegistered/ModelRegisterFailed, publish_model_id/name state held by id (not cursor) to survive model reloads, derive_base_model_meta for family/param-class inference with contains_size_token guarding against substring size mismatches, plus UI rendering and footer/loading-state fixes.

Reviewers should focus on the busy/loading interplay in trigger_publish_model (concurrent apps fetch vs. registration) and the size-token detection edge cases.


Automated review by siGit Code · commit a20fe81

Comment thread src/app.rs Outdated
Comment thread src/app.rs
Comment thread src/app.rs
Comment thread src/ui.rs Outdated
- Bound the size-token match on both sides, not just the leading
  digit check, so "3B" can no longer match inside "3Beta" or "3B2"
- Note why trigger_load_apps must run before app.busy is set to true
  in trigger_publish_model, since it early-returns when busy
- Give the apps-list empty state a per-screen hint, since "Press n to
  create one" was showing on the publish picker where n does nothing
- Add regression tests for the boundary fix

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@sigit-code sigit-code Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adds a publish-to-catalog flow: after a fine-tuned GGUF uploads to HF, pressing a on GgufDetail registers it via the new gresiq::create_model (bumped SDK 0.3.35→0.4.9) and transitions to a new PublishModel screen that reuses the apps picker to assign the model live. Includes helpers derive_base_model_meta/contains_size_token for inferring family/parameter class, plus unit tests. render_apps_list now takes a custom empty hint and keys its loading state on apps_loaded instead of busy.

Reviewers should check the busy-state interplay between the concurrent apps fetch and model registration, and the parameter_class matching against the SUPPORTED_MODEL_INFO name.


Automated review by siGit Code · commit 9f1b583

Comment thread src/app.rs
Comment thread src/app.rs Outdated
Comment thread src/app.rs
@setoelkahfi

Copy link
Copy Markdown
Collaborator

Pressing u doesn't do anything:

Screenshot 2026-07-12 at 11 30 48

paydii and others added 2 commits July 13, 2026 21:00
The GGUF detail status line advertised a "u" key that was never wired
up: upload has always been Enter, and only for local fine-tune outputs.
The status now matches the footer, pointing at Enter for uploadable
GGUFs and at the chat test for GGUFs that came from HF.

Also adds the missing parameter classes (0.6B, 1.7B, 8B, 30B, and
more of the Qwen2.5/Qwen3 lineups) and teaches contains_size_token to
reject matches preceded by a dot, so 7B can no longer match inside
1.7B.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@keypair34

Copy link
Copy Markdown
Collaborator Author

Fixed in c7744a4. The status line was advertising a u key that never existed: upload is wired to Enter, and only for GGUFs that came out of a local fine-tune. The file in your screenshot is the HF download sitting in the App Group container, so upload doesn't apply to it at all, and the upload keys are disabled there on purpose. The hint now says Enter · upload to HuggingFace on local fine-tune outputs and c · test in chat on downloaded ones, matching the footer. Verified in a tmux run against the same Qwen3-0.6B-q8_0.gguf from the screenshot.

Related catch while in there: that base model is Qwen3-0.6B, which catalog registration would have classified as parameter_class "unknown" because the size list only had eight entries. The same commit fills the list out and stops the token matcher from matching decimal tails (7B inside 1.7B).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants