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
---
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`](https://huggingface.co/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)
```python
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
```json
{"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
```python
# 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.**