loudink-v1.1 / README.md
nsalerni's picture
loudink-v1.1 1.1.0: skills PR-A–E canary (record/replay, slots, expanded daily-mac)
d506628 verified
|
Raw
History Blame
3.53 kB
metadata
license: apache-2.0
tags:
  - flowcast
  - loudink
  - loudink-v1.1
  - voice-agent
  - mlx
  - apple-silicon
  - compact-ir
  - dictation
  - computer-use
  - skills
  - record-and-replay
library_name: mlx-lm

loudink-v1.1 v1.1.0 (canary)

On-device dual-stack for LoudInk / Flowcast on Apple Silicon, plus user skills:

  1. Writer β€” LFM2.5-1.2B LoRA (dictation polish / messages / email / prompts)
  2. Planner β€” FunctionGemma compact-IR LoRA (run_skill + freeform computer-use)
  3. Skill store β€” local JSON skills (record β†’ compile β†’ voice replay)

Stable GA line: nsalerni/loudink-v1 (0.4.0 freeze).
This package is the v1.1 canary (PR-A→E). Prefer dual-package client routing with kill-switch to v1.

Product bars (v1.1)

Slice Shipped Neural Latency
Writing daily 100% 92.0% p50 171 ms
Computer daily 100% β€” mostly fast-path
Multi-step 100% β€” mostly fast-path
Daily-Mac overall (n=69) 100% β€” β€”
Skill invoke (n=19) 100% β€” deterministic store
IR honesty (n=112, no FP) β€” 46.4% honesty lineage

Holds loudink-v1 0.4 bars; writing neural improved on expanded suite (~92% vs ~86%).

Bundle layout

writer/                 # optional promoted_core_100.safetensors seed adapter
writer_unified/         # production writer LoRA
ir/                     # skill-aware IR LoRA
ir_honesty_fallback/    # v0.4 honesty IR (optional rollback)
skill_store/            # example seed skills (not user data)
router.json
manifest.json
inference_config.json

Bases are not vendored (size). Pull 4-bit bases:

  • Writer: mlx-community/LFM2.5-1.2B-Instruct-4bit
  • IR: mlx-community/functiongemma-270m-it-4bit

Skills (record β†’ replay)

from huggingface_hub import snapshot_download
from gemmaflow_tune.skills.store import SkillStore
from gemmaflow_tune.skills.invoke import try_skill_invoke_plan

bundle = snapshot_download("nsalerni/loudink-v1.1")
store = SkillStore(f"{bundle}/skill_store")
plan = try_skill_invoke_plan("run my invoice chase for Acme", skill_store=store)

Client should point skill_store_path at a user-writable directory and merge or replace example seeds. Private recordings stay local; do not train cloud models on them by default.

IR extension

{"intent": "run_skill", "skill_id": "invoice_chase", "slots": {"company": "Acme"}, "confidence": 0.92}

Unknown skill_id β†’ null plan (never invent). Freeform (open gmail) never hijacks skills.

Vision (PR-E)

skills/vision.py scaffold is in the training repo; default disabled. Client injects a resolver when ready.

Integration

# runner_kind: loudink_v1
# skill_store_path: {bundle}/skill_store  # or user path
# ir_adapter_path: {bundle}/ir
# writer_unified_adapter_path: {bundle}/writer_unified

See inference_config.json and client_contract.md.

Methods (v1.1)

  • PR-A: Skill schema, store, recorder compiler, null-safe run_skill
  • PR-B: Paraphrase invoke + skill_invoke bench + light IR SFT
  • PR-C: Deterministic slot fill (for / about / named)
  • PR-D: Expanded daily-Mac computer + writing cases
  • PR-E: Vision fallback scaffold (noop until client wires resolver)

License

Apache-2.0 (adapters + example skills). Base model licenses apply to community 4-bit bases. User-recorded skills are user data.