MLX
mlx-lm
flowcast
loudink
loudink-v1.1
voice-agent
apple-silicon
compact-ir
dictation
computer-use
skills
record-and-replay
Instructions to use nsalerni/loudink-v1.1 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use nsalerni/loudink-v1.1 with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] huggingface-cli download --local-dir loudink-v1.1 nsalerni/loudink-v1.1
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
loudink-v1.1 1.1.0: skills PR-A–E canary (record/replay, slots, expanded daily-mac)
Browse files- README.md +107 -0
- SHA256SUMS +19 -0
- STATUS.md +71 -0
- V1_1_COMPLETE.md +62 -0
- client_contract.md +59 -0
- inference_config.json +52 -0
- ir/adapter_config.json +54 -0
- ir/adapters.safetensors +3 -0
- ir_honesty_fallback/adapter_config.json +54 -0
- ir_honesty_fallback/adapters.safetensors +3 -0
- manifest.json +63 -0
- product_scorecard.json +99 -0
- publish_report.json +28 -0
- router.json +54 -0
- skill_store/index.json +38 -0
- skill_store/skills/invoice_chase.json +40 -0
- skill_store/skills/morning_focus.json +35 -0
- skill_store/skills/standup_post.json +38 -0
- writer/promoted_core_100.safetensors +3 -0
- writer_unified/adapter_config.json +56 -0
- writer_unified/adapters.safetensors +3 -0
README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
tags:
|
| 4 |
+
- flowcast
|
| 5 |
+
- loudink
|
| 6 |
+
- loudink-v1.1
|
| 7 |
+
- voice-agent
|
| 8 |
+
- mlx
|
| 9 |
+
- apple-silicon
|
| 10 |
+
- compact-ir
|
| 11 |
+
- dictation
|
| 12 |
+
- computer-use
|
| 13 |
+
- skills
|
| 14 |
+
- record-and-replay
|
| 15 |
+
library_name: mlx-lm
|
| 16 |
+
---
|
| 17 |
+
|
| 18 |
+
# loudink-v1.1 v1.1.0 (canary)
|
| 19 |
+
|
| 20 |
+
On-device dual-stack for **LoudInk / Flowcast** on Apple Silicon, plus **user skills**:
|
| 21 |
+
|
| 22 |
+
1. **Writer** — LFM2.5-1.2B LoRA (dictation polish / messages / email / prompts)
|
| 23 |
+
2. **Planner** — FunctionGemma compact-IR LoRA (`run_skill` + freeform computer-use)
|
| 24 |
+
3. **Skill store** — local JSON skills (record → compile → voice replay)
|
| 25 |
+
|
| 26 |
+
**Stable GA line:** [`nsalerni/loudink-v1`](https://huggingface.co/nsalerni/loudink-v1) (0.4.0 freeze).
|
| 27 |
+
This package is the **v1.1 canary** (PR-A→E). Prefer dual-package client routing with kill-switch to v1.
|
| 28 |
+
|
| 29 |
+
## Product bars (v1.1)
|
| 30 |
+
|
| 31 |
+
| Slice | Shipped | Neural | Latency |
|
| 32 |
+
|-------|---------|--------|---------|
|
| 33 |
+
| Writing daily | **100%** | **92.0%** | p50 **171 ms** |
|
| 34 |
+
| Computer daily | **100%** | — | mostly fast-path |
|
| 35 |
+
| Multi-step | **100%** | — | mostly fast-path |
|
| 36 |
+
| **Daily-Mac overall (n=69)** | **100%** | — | — |
|
| 37 |
+
| Skill invoke (n=19) | **100%** | — | deterministic store |
|
| 38 |
+
| IR honesty (n=112, no FP) | — | **46.4%** | honesty lineage |
|
| 39 |
+
|
| 40 |
+
Holds loudink-v1 0.4 bars; writing neural improved on expanded suite (~92% vs ~86%).
|
| 41 |
+
|
| 42 |
+
## Bundle layout
|
| 43 |
+
|
| 44 |
+
```
|
| 45 |
+
writer/ # optional promoted_core_100.safetensors seed adapter
|
| 46 |
+
writer_unified/ # production writer LoRA
|
| 47 |
+
ir/ # skill-aware IR LoRA
|
| 48 |
+
ir_honesty_fallback/ # v0.4 honesty IR (optional rollback)
|
| 49 |
+
skill_store/ # example seed skills (not user data)
|
| 50 |
+
router.json
|
| 51 |
+
manifest.json
|
| 52 |
+
inference_config.json
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
**Bases are not vendored** (size). Pull 4-bit bases:
|
| 56 |
+
|
| 57 |
+
- Writer: `mlx-community/LFM2.5-1.2B-Instruct-4bit`
|
| 58 |
+
- IR: `mlx-community/functiongemma-270m-it-4bit`
|
| 59 |
+
|
| 60 |
+
## Skills (record → replay)
|
| 61 |
+
|
| 62 |
+
```python
|
| 63 |
+
from huggingface_hub import snapshot_download
|
| 64 |
+
from gemmaflow_tune.skills.store import SkillStore
|
| 65 |
+
from gemmaflow_tune.skills.invoke import try_skill_invoke_plan
|
| 66 |
+
|
| 67 |
+
bundle = snapshot_download("nsalerni/loudink-v1.1")
|
| 68 |
+
store = SkillStore(f"{bundle}/skill_store")
|
| 69 |
+
plan = try_skill_invoke_plan("run my invoice chase for Acme", skill_store=store)
|
| 70 |
+
```
|
| 71 |
+
|
| 72 |
+
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.
|
| 73 |
+
|
| 74 |
+
### IR extension
|
| 75 |
+
|
| 76 |
+
```json
|
| 77 |
+
{"intent": "run_skill", "skill_id": "invoice_chase", "slots": {"company": "Acme"}, "confidence": 0.92}
|
| 78 |
+
```
|
| 79 |
+
|
| 80 |
+
Unknown `skill_id` → null plan (never invent). Freeform (`open gmail`) never hijacks skills.
|
| 81 |
+
|
| 82 |
+
### Vision (PR-E)
|
| 83 |
+
|
| 84 |
+
`skills/vision.py` scaffold is in the training repo; default **disabled**. Client injects a resolver when ready.
|
| 85 |
+
|
| 86 |
+
## Integration
|
| 87 |
+
|
| 88 |
+
```python
|
| 89 |
+
# runner_kind: loudink_v1
|
| 90 |
+
# skill_store_path: {bundle}/skill_store # or user path
|
| 91 |
+
# ir_adapter_path: {bundle}/ir
|
| 92 |
+
# writer_unified_adapter_path: {bundle}/writer_unified
|
| 93 |
+
```
|
| 94 |
+
|
| 95 |
+
See `inference_config.json` and `client_contract.md`.
|
| 96 |
+
|
| 97 |
+
## Methods (v1.1)
|
| 98 |
+
|
| 99 |
+
- PR-A: Skill schema, store, recorder compiler, null-safe `run_skill`
|
| 100 |
+
- PR-B: Paraphrase invoke + skill_invoke bench + light IR SFT
|
| 101 |
+
- PR-C: Deterministic slot fill (`for` / `about` / named)
|
| 102 |
+
- PR-D: Expanded daily-Mac computer + writing cases
|
| 103 |
+
- PR-E: Vision fallback scaffold (noop until client wires resolver)
|
| 104 |
+
|
| 105 |
+
## License
|
| 106 |
+
|
| 107 |
+
Apache-2.0 (adapters + example skills). Base model licenses apply to community 4-bit bases. **User-recorded skills are user data.**
|
SHA256SUMS
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
c20806b8e4dfc28e162efd1bc3d4cae42e8e5224aaeda7722562bf2b9539acf5 README.md
|
| 2 |
+
cf88d3c382ec0deaa9a89bb682da29bbf8822191c97d5da784de38bd3e817344 STATUS.md
|
| 3 |
+
887cad558e8fde9d4c357f2cdae4507e4e614b1f0dbad190d1fa9d21714ad92f V1_1_COMPLETE.md
|
| 4 |
+
3965991f7c62bfb29001f9b19f704deefbc890dc85649e4d72fd57243ab317f0 client_contract.md
|
| 5 |
+
4710b258140647aee5399ce3158da7f1f29bea5cb8bb6ed3541be122d5e53064 inference_config.json
|
| 6 |
+
4159a5a3cd7ed71c4da7a6712b2ec5049d7c1ec2e84cbe538178136e5e99d4f3 ir/adapter_config.json
|
| 7 |
+
868d11b4360748cb3c493e26e2ee4cf4eef937eb0c9755988c364a741e5d3a82 ir/adapters.safetensors
|
| 8 |
+
69abbc73e77287e6646bbc323a3fd6869218124b12512cd262a40d0b034ddda2 ir_honesty_fallback/adapter_config.json
|
| 9 |
+
02b521c2348477cf03f667c7b500f0be82bfb937277806e3f4e562b9593a1bbe ir_honesty_fallback/adapters.safetensors
|
| 10 |
+
4290d51b5ad2ffc89ff22086d2d6aede91485ea4c4f1ecbe2ecd122520a05e4a manifest.json
|
| 11 |
+
b3b4a8eaa9bef08c32c608f538c1e176acc41f49d18d66aa7c36673123746af9 product_scorecard.json
|
| 12 |
+
8856981bbea72862e2d44a6d5f4de9e540e1793ed1674fcc0dd7ace2364be5f0 router.json
|
| 13 |
+
12db4143f37da30858061eb64bf3fb645d15e195bb18b9274f3620640eb63f37 skill_store/index.json
|
| 14 |
+
f18e2b92a8264142df82780fa0757c5c6aa60569e364a824a1e2029787a81378 skill_store/skills/invoice_chase.json
|
| 15 |
+
55715a59fbdc06b0656d20ace72181dda4142d6c8edbe791b3752c71f4510566 skill_store/skills/morning_focus.json
|
| 16 |
+
a025338ad42f4fee0725f6e8bbd5bf2384a42973ab847838bd9a54526f64ac22 skill_store/skills/standup_post.json
|
| 17 |
+
ceb709ccf7a40ea608c5cc74c247071bbcb0980017f1811f7c55604b4241ab7c writer/promoted_core_100.safetensors
|
| 18 |
+
734e75c575696d88ec67283d23f8dbeb87a03c3c0e45e0da6b4cfa531036cb4e writer_unified/adapter_config.json
|
| 19 |
+
2db8a19242ab84fb4b64820528509c3eb842c998f53247e6cf13999b0651b955 writer_unified/adapters.safetensors
|
STATUS.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# loudink-v1.1 status — **PR-A→E complete**
|
| 2 |
+
|
| 3 |
+
Last updated: 2026-07-08
|
| 4 |
+
|
| 5 |
+
## Hugging Face
|
| 6 |
+
|
| 7 |
+
| Line | Repo | Role |
|
| 8 |
+
|------|------|------|
|
| 9 |
+
| **Stable GA** | [nsalerni/loudink-v1](https://huggingface.co/nsalerni/loudink-v1) | **0.4.0** freeze |
|
| 10 |
+
| **Canary** | [nsalerni/loudink-v1.1](https://huggingface.co/nsalerni/loudink-v1.1) | **1.1.0** skills + expanded daily-mac |
|
| 11 |
+
|
| 12 |
+
Rebuild canary:
|
| 13 |
+
|
| 14 |
+
```bash
|
| 15 |
+
python -m gemmaflow_tune.cli.build_loudink_v1_1_publish --force
|
| 16 |
+
python -m gemmaflow_tune.cli.publish_sota --model loudink-v1.1 \
|
| 17 |
+
--commit-message "loudink-v1.1 1.1.0: skills PR-A–E canary"
|
| 18 |
+
```
|
| 19 |
+
|
| 20 |
+
## PR board
|
| 21 |
+
|
| 22 |
+
| PR | Deliverable | Status |
|
| 23 |
+
|----|-------------|--------|
|
| 24 |
+
| **PR-A** | Skill store + recorder schema + compiler + null-safe IR | **done** |
|
| 25 |
+
| **PR-B** | Paraphrase invoke + skill bench + IR labels + runner wiring | **done** (19/19) |
|
| 26 |
+
| **PR-C** | Slot fill (`for` / `about` / named) | **done** |
|
| 27 |
+
| **PR-D** | Daily-mac expand (Focus/DND, Reminders, reply, tabs, Notion/Linear, writing) | **done** (69/69) |
|
| 28 |
+
| **PR-E** | Vision fallback scaffold (disabled by default) | **done** |
|
| 29 |
+
|
| 30 |
+
## Headline metrics (canary)
|
| 31 |
+
|
| 32 |
+
| Metric | Bar | Result |
|
| 33 |
+
|--------|-----|--------|
|
| 34 |
+
| Skill invoke (n=19) | ≥95% named / ≥85% paraphrase | **100%** shipped |
|
| 35 |
+
| Daily-Mac overall (n=69) | no drop vs 0.4 | **100%** shipped |
|
| 36 |
+
| Writing neural | hold ≥80% | **92%** |
|
| 37 |
+
| Writing p50 | ≤250 ms | **171 ms** |
|
| 38 |
+
| Computer / multi-step | hold 100% | **100%** |
|
| 39 |
+
| IR honesty (n=112) | ≥45% neural | **46.4%** (v0.4 lineage) |
|
| 40 |
+
|
| 41 |
+
### Daily-Mac scorecard (v1.1 expanded)
|
| 42 |
+
|
| 43 |
+
| Slice | Shipped | Neural | p50 |
|
| 44 |
+
|-------|---------|--------|-----|
|
| 45 |
+
| Writing (n=25) | **100%** | **92%** | **171 ms** |
|
| 46 |
+
| Computer (n=44) | **100%** | — | ~0 ms FP |
|
| 47 |
+
| Multi-step (n=25) | **100%** | — | ~0 ms FP |
|
| 48 |
+
| **Overall (n=69)** | **100%** | — | mean ~60 ms |
|
| 49 |
+
|
| 50 |
+
Scorecard: `artifacts/loudink_v1/product_scorecard.json`
|
| 51 |
+
Skill bench: `artifacts/benchmarks/loudink_v1_1/skill_invoke/`
|
| 52 |
+
|
| 53 |
+
## Production stack (v1.1 canary)
|
| 54 |
+
|
| 55 |
+
```
|
| 56 |
+
writer: artifacts/sft_loudink_v1_rft_daily/adapters
|
| 57 |
+
polish: structural (+ daily rules)
|
| 58 |
+
ir: artifacts/sft_loudink_v1_1_skill_invoke_ir/adapters
|
| 59 |
+
ir_fallback: artifacts/sft_loudink_v1_ir_honesty/adapters
|
| 60 |
+
skills: SkillStore (example seed in publish bundle)
|
| 61 |
+
runner: loudink_v1 + skill_store_path
|
| 62 |
+
bench: configs/benchmark_loudink_v1_daily_mac.yaml
|
| 63 |
+
configs/benchmark_loudink_v1_1_skill_invoke.yaml
|
| 64 |
+
```
|
| 65 |
+
|
| 66 |
+
## Out of scope (later product)
|
| 67 |
+
|
| 68 |
+
- Client recorder UI (Flowcast owns capture UX)
|
| 69 |
+
- Optional real vision weights/resolver
|
| 70 |
+
- AirDrop / Bluetooth / long-horizon 1:1 prep suites (roadmap backlog)
|
| 71 |
+
- Training cloud models on private user recordings (forbidden by default)
|
V1_1_COMPLETE.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# loudink-v1.1 complete (PR-A → PR-E)
|
| 2 |
+
|
| 3 |
+
**Version:** 1.1.0 canary
|
| 4 |
+
**Date:** 2026-07-08
|
| 5 |
+
**Stable freeze left intact:** loudink-v1 **0.4.0** at `nsalerni/loudink-v1`
|
| 6 |
+
|
| 7 |
+
## Delivered
|
| 8 |
+
|
| 9 |
+
### PR-A — Skill substrate
|
| 10 |
+
- `src/gemmaflow_tune/skills/{schema,store,recorder,compile}.py`
|
| 11 |
+
- Null-safe `run_skill` compile + sanitize (never invent skill_id)
|
| 12 |
+
- Unit tests: `tests/test_skills_pra.py`
|
| 13 |
+
|
| 14 |
+
### PR-B — Invoke surface
|
| 15 |
+
- Paraphrase + exact alias match in `skills/invoke.py`
|
| 16 |
+
- Freeform disambiguation (open gmail ≠ skill hijack)
|
| 17 |
+
- Bench suite n=19 + IR SFT corpus
|
| 18 |
+
- Runner wiring: `skill_store_path` via `runner_factory`
|
| 19 |
+
- Unit tests: `tests/test_skills_prb.py`
|
| 20 |
+
|
| 21 |
+
### PR-C — Slot fill
|
| 22 |
+
- Deterministic extract in `skills/slots.py`
|
| 23 |
+
- Seed skills: Invoice Chase (`company`), Standup Post (`update`)
|
| 24 |
+
- Scorer: `slot_values` / `skill_id`
|
| 25 |
+
- Unit tests: `tests/test_skills_prc_slots.py`
|
| 26 |
+
|
| 27 |
+
### PR-D — Daily-Mac expand
|
| 28 |
+
- Computer: Focus/DND, Reminders, Messages/Mail reply, Chrome tabs, Notion+Linear, Wi‑Fi
|
| 29 |
+
- Writing: reply iMessage, email subject, code cell
|
| 30 |
+
- Resolvers: focus/DND, browser tabs, reply context
|
| 31 |
+
- **69/69** overall on expanded suite
|
| 32 |
+
|
| 33 |
+
### PR-E — Vision scaffold
|
| 34 |
+
- `skills/vision.py`: `ScreenObservation`, `VisionFallbackConfig`, `try_vision_fallback`
|
| 35 |
+
- Default **disabled**; client injects resolver when ready
|
| 36 |
+
|
| 37 |
+
## Verification commands
|
| 38 |
+
|
| 39 |
+
```bash
|
| 40 |
+
.venv/bin/python -m pytest tests/test_skills_pra.py tests/test_skills_prb.py tests/test_skills_prc_slots.py -q
|
| 41 |
+
.venv/bin/python -m gemmaflow_tune.cli.prepare_skill_invoke_benchmarks
|
| 42 |
+
.venv/bin/python -m gemmaflow_tune.cli.prepare_daily_mac_benchmarks
|
| 43 |
+
GEMMAFLOW_GPU_MODE=shared .venv/bin/python -m gemmaflow_tune.cli.benchmark \
|
| 44 |
+
--config configs/benchmark_loudink_v1_1_skill_invoke.yaml --variant loudink_v1_1_skill_invoke
|
| 45 |
+
GEMMAFLOW_GPU_MODE=shared .venv/bin/python -m gemmaflow_tune.cli.benchmark \
|
| 46 |
+
--config configs/benchmark_loudink_v1_daily_mac.yaml --variant loudink_v1_daily_mac
|
| 47 |
+
.venv/bin/python -m gemmaflow_tune.cli.build_loudink_v1_product_scorecard \
|
| 48 |
+
--measurement artifacts/benchmarks/loudink_v1/daily_mac/loudink_v1_daily_mac_measurement.json \
|
| 49 |
+
--output artifacts/loudink_v1/product_scorecard.json
|
| 50 |
+
.venv/bin/python -m gemmaflow_tune.cli.build_loudink_v1_1_publish --force
|
| 51 |
+
.venv/bin/python -m gemmaflow_tune.cli.publish_sota --model loudink-v1.1
|
| 52 |
+
```
|
| 53 |
+
|
| 54 |
+
## Success metrics (all met)
|
| 55 |
+
|
| 56 |
+
| Metric | Bar | Result |
|
| 57 |
+
|--------|-----|--------|
|
| 58 |
+
| Skill invoke accuracy | ≥95% | **100%** (19/19) |
|
| 59 |
+
| Skill paraphrase | ≥85% | **100%** (suite includes paraphrase) |
|
| 60 |
+
| Freeform regression | no drop vs 0.4 | **100%** daily-mac |
|
| 61 |
+
| Writing neural / p50 | hold 0.4 bars | **92%** / **171 ms** |
|
| 62 |
+
| IR honesty | ≥45% | **46.4%** |
|
client_contract.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# loudink-v1 Flowcast client contract (PR13)
|
| 2 |
+
|
| 3 |
+
External dependency: Flowcast/GemmaFlow client must support dual packages before canary traffic.
|
| 4 |
+
|
| 5 |
+
## Package selection
|
| 6 |
+
|
| 7 |
+
| Field | Type | Description |
|
| 8 |
+
|-------|------|-------------|
|
| 9 |
+
| `model_package` | enum | `v5_lite` (default production) \| `loudink_v1` |
|
| 10 |
+
| `kill_switch` | bool | Force `v5_lite` regardless of remote config |
|
| 11 |
+
|
| 12 |
+
## Manifest fields the client must read
|
| 13 |
+
|
| 14 |
+
From `artifacts/manifests/loudink_v1.json` / published `manifest.json`:
|
| 15 |
+
|
| 16 |
+
- `runner_kind`: `loudink_v1`
|
| 17 |
+
- `writer_model_config` / adapter paths / `writer_chat_template_family`
|
| 18 |
+
- `ir_model_config` / adapter paths / `ir_chat_template_family`
|
| 19 |
+
- `polish_mode` (default `minimal`)
|
| 20 |
+
- `structural_polish_on_markers`
|
| 21 |
+
- `learned_router_path`
|
| 22 |
+
- `transcript_first_ir`, `intent_fast_path` (production true)
|
| 23 |
+
- `hot_download_mb_primary` / `hot_download_mb_hard`
|
| 24 |
+
|
| 25 |
+
## Telemetry (optional but recommended)
|
| 26 |
+
|
| 27 |
+
| Event field | Description |
|
| 28 |
+
|-------------|-------------|
|
| 29 |
+
| `finish_reason` | Include polish/IR/intent tags |
|
| 30 |
+
| `neural_text_present` | bool — whether raw draft was produced |
|
| 31 |
+
| `polish_mode` | effective mode after markers |
|
| 32 |
+
| `package_version` | loudink-v1 semver |
|
| 33 |
+
| `latency_ms` | e2e |
|
| 34 |
+
| `model_invoked` | false when transcript polish/IR/intent FP skipped models |
|
| 35 |
+
|
| 36 |
+
## Rollback
|
| 37 |
+
|
| 38 |
+
1. Set `model_package=v5_lite` or `kill_switch=true`.
|
| 39 |
+
2. Client must keep last-known-good v5-lite package on disk for offline rollback.
|
| 40 |
+
3. Training repo does not own client release; this file is the interface contract.
|
| 41 |
+
|
| 42 |
+
## Canary traffic gate
|
| 43 |
+
|
| 44 |
+
Do **not** route production users to loudink-v1 until:
|
| 45 |
+
|
| 46 |
+
1. `gate_loudink_v1 --tier canary --gate-mode enforce` is green
|
| 47 |
+
2. Client dual-package flag is shipped
|
| 48 |
+
3. Package SHA256SUMS verified
|
| 49 |
+
|
| 50 |
+
## loudink-v1.1 skills (canary package)
|
| 51 |
+
|
| 52 |
+
| Field | Type | Description |
|
| 53 |
+
|-------|------|-------------|
|
| 54 |
+
| `model_package` | enum | add `loudink_v1_1` canary; kill-switch → `loudink_v1` or `v5_lite` |
|
| 55 |
+
| `skill_store_path` | path | User-writable SkillStore root (do not overwrite with HF seed blindly) |
|
| 56 |
+
| `run_skill` IR | intent | `{"intent":"run_skill","skill_id":"…","slots":{…}}` — unknown id → null plan |
|
| 57 |
+
| `vision_fallback` | optional | Disabled by default; client injects resolver for non-AX UIs |
|
| 58 |
+
|
| 59 |
+
HF canary: `nsalerni/loudink-v1.1`. Example seed skills in bundle `skill_store/` are demos only.
|
inference_config.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"model_name": "loudink-v1.1",
|
| 3 |
+
"model_tag": "loudink-v1.1",
|
| 4 |
+
"product": "loudink-v1.1",
|
| 5 |
+
"version": "1.1.0",
|
| 6 |
+
"runner_kind": "loudink_v1",
|
| 7 |
+
"hf_repo": "nsalerni/loudink-v1.1",
|
| 8 |
+
"predecessor": "nsalerni/loudink-v1",
|
| 9 |
+
"writer_base_model": "mlx-community/LFM2.5-1.2B-Instruct-4bit",
|
| 10 |
+
"ir_base_model": "mlx-community/functiongemma-270m-it-4bit",
|
| 11 |
+
"writer_adapter_path": "writer",
|
| 12 |
+
"writer_checkpoint": "promoted_core_100.safetensors",
|
| 13 |
+
"writer_unified_adapter_path": "writer_unified",
|
| 14 |
+
"ir_adapter_path": "ir",
|
| 15 |
+
"ir_adapter_fallback": "ir_honesty_fallback",
|
| 16 |
+
"learned_router_path": "router.json",
|
| 17 |
+
"skill_store_path": "skill_store",
|
| 18 |
+
"use_learned_router": true,
|
| 19 |
+
"polish_mode": "structural",
|
| 20 |
+
"structural_polish_on_markers": true,
|
| 21 |
+
"transcript_first_ir": true,
|
| 22 |
+
"intent_fast_path": true,
|
| 23 |
+
"disable_fast_paths": false,
|
| 24 |
+
"writer_chat_template_family": "lfm25",
|
| 25 |
+
"ir_chat_template_family": "functiongemma",
|
| 26 |
+
"writer_use_prompt_kv_cache": true,
|
| 27 |
+
"json_early_stop": true,
|
| 28 |
+
"prompt_mode": "verbose",
|
| 29 |
+
"hot_download_mb_primary": 850,
|
| 30 |
+
"hot_download_mb_hard": 900,
|
| 31 |
+
"skill_features": {
|
| 32 |
+
"record_and_replay": true,
|
| 33 |
+
"paraphrase_invoke": true,
|
| 34 |
+
"slot_fill": true,
|
| 35 |
+
"vision_fallback_scaffold": true,
|
| 36 |
+
"vision_fallback_default_enabled": false
|
| 37 |
+
},
|
| 38 |
+
"metrics_v11": {
|
| 39 |
+
"daily_mac_overall_shipped": 1.0,
|
| 40 |
+
"daily_mac_writing_shipped": 1.0,
|
| 41 |
+
"daily_mac_writing_neural": 0.92,
|
| 42 |
+
"daily_mac_writing_p50_ms": 171,
|
| 43 |
+
"daily_mac_computer_shipped": 1.0,
|
| 44 |
+
"daily_mac_multi_step_shipped": 1.0,
|
| 45 |
+
"daily_mac_n": 69,
|
| 46 |
+
"skill_invoke_shipped": 1.0,
|
| 47 |
+
"skill_invoke_n": 19,
|
| 48 |
+
"ir_honesty_neural_n112": 0.4643
|
| 49 |
+
},
|
| 50 |
+
"stable_line": "loudink-v1",
|
| 51 |
+
"line": "canary"
|
| 52 |
+
}
|
ir/adapter_config.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"adapter_path": "artifacts/sft_loudink_v1_1_skill_invoke_ir/adapters",
|
| 3 |
+
"batch_size": 1,
|
| 4 |
+
"clear_cache_threshold": 0,
|
| 5 |
+
"config": null,
|
| 6 |
+
"data": "data/sft_loudink_v1_1_skill_invoke_ir",
|
| 7 |
+
"fine_tune_type": "lora",
|
| 8 |
+
"gpu_mode": "shared",
|
| 9 |
+
"grad_accumulation_steps": 8,
|
| 10 |
+
"grad_checkpoint": true,
|
| 11 |
+
"iters": 80,
|
| 12 |
+
"learning_rate": 1.2e-05,
|
| 13 |
+
"lora_parameters": {
|
| 14 |
+
"dropout": 0.05,
|
| 15 |
+
"keys": [
|
| 16 |
+
"self_attn.q_proj",
|
| 17 |
+
"self_attn.k_proj",
|
| 18 |
+
"self_attn.v_proj",
|
| 19 |
+
"self_attn.o_proj",
|
| 20 |
+
"mlp.gate_proj",
|
| 21 |
+
"mlp.up_proj",
|
| 22 |
+
"mlp.down_proj"
|
| 23 |
+
],
|
| 24 |
+
"rank": 16,
|
| 25 |
+
"scale": 32.0
|
| 26 |
+
},
|
| 27 |
+
"lr_schedule": null,
|
| 28 |
+
"mask_prompt": true,
|
| 29 |
+
"max_seq_length": 2048,
|
| 30 |
+
"model": "/Users/nilptr/dev/open-source/finetune-rl-gemma/artifacts/models/functiongemma-270m-it-4bit",
|
| 31 |
+
"model_config": "configs/model_v4_functiongemma.yaml",
|
| 32 |
+
"model_hf_repo": "mlx-community/functiongemma-270m-it-4bit",
|
| 33 |
+
"model_local_path": "artifacts/models/functiongemma-270m-it-4bit",
|
| 34 |
+
"num_layers": 8,
|
| 35 |
+
"optimizer": "adamw",
|
| 36 |
+
"optimizer_config": {
|
| 37 |
+
"adam": {},
|
| 38 |
+
"adamw": {},
|
| 39 |
+
"muon": {},
|
| 40 |
+
"sgd": {},
|
| 41 |
+
"adafactor": {}
|
| 42 |
+
},
|
| 43 |
+
"project_name": null,
|
| 44 |
+
"report_to": null,
|
| 45 |
+
"resume_adapter_file": "artifacts/sft_loudink_v1_ir_honesty/adapters/adapters.safetensors",
|
| 46 |
+
"save_every": 20,
|
| 47 |
+
"seed": 17,
|
| 48 |
+
"steps_per_eval": 20,
|
| 49 |
+
"steps_per_report": 10,
|
| 50 |
+
"test": false,
|
| 51 |
+
"test_batches": 500,
|
| 52 |
+
"train": true,
|
| 53 |
+
"val_batches": 8
|
| 54 |
+
}
|
ir/adapters.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:868d11b4360748cb3c493e26e2ee4cf4eef937eb0c9755988c364a741e5d3a82
|
| 3 |
+
size 3386915
|
ir_honesty_fallback/adapter_config.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"adapter_path": "artifacts/sft_loudink_v1_ir_honesty/adapters",
|
| 3 |
+
"batch_size": 1,
|
| 4 |
+
"clear_cache_threshold": 0,
|
| 5 |
+
"config": null,
|
| 6 |
+
"data": "data/sft_loudink_v1_ir_honesty",
|
| 7 |
+
"fine_tune_type": "lora",
|
| 8 |
+
"gpu_mode": "shared",
|
| 9 |
+
"grad_accumulation_steps": 8,
|
| 10 |
+
"grad_checkpoint": true,
|
| 11 |
+
"iters": 120,
|
| 12 |
+
"learning_rate": 1.5e-05,
|
| 13 |
+
"lora_parameters": {
|
| 14 |
+
"dropout": 0.05,
|
| 15 |
+
"keys": [
|
| 16 |
+
"self_attn.q_proj",
|
| 17 |
+
"self_attn.k_proj",
|
| 18 |
+
"self_attn.v_proj",
|
| 19 |
+
"self_attn.o_proj",
|
| 20 |
+
"mlp.gate_proj",
|
| 21 |
+
"mlp.up_proj",
|
| 22 |
+
"mlp.down_proj"
|
| 23 |
+
],
|
| 24 |
+
"rank": 16,
|
| 25 |
+
"scale": 32.0
|
| 26 |
+
},
|
| 27 |
+
"lr_schedule": null,
|
| 28 |
+
"mask_prompt": true,
|
| 29 |
+
"max_seq_length": 2048,
|
| 30 |
+
"model": "/Users/nilptr/dev/open-source/finetune-rl-gemma/artifacts/models/functiongemma-270m-it-4bit",
|
| 31 |
+
"model_config": "configs/model_v4_functiongemma.yaml",
|
| 32 |
+
"model_hf_repo": "mlx-community/functiongemma-270m-it-4bit",
|
| 33 |
+
"model_local_path": "artifacts/models/functiongemma-270m-it-4bit",
|
| 34 |
+
"num_layers": 8,
|
| 35 |
+
"optimizer": "adamw",
|
| 36 |
+
"optimizer_config": {
|
| 37 |
+
"adam": {},
|
| 38 |
+
"adamw": {},
|
| 39 |
+
"muon": {},
|
| 40 |
+
"sgd": {},
|
| 41 |
+
"adafactor": {}
|
| 42 |
+
},
|
| 43 |
+
"project_name": null,
|
| 44 |
+
"report_to": null,
|
| 45 |
+
"resume_adapter_file": "artifacts/sft_v5_functiongemma_ir_v5/adapters/adapters.safetensors",
|
| 46 |
+
"save_every": 20,
|
| 47 |
+
"seed": 41,
|
| 48 |
+
"steps_per_eval": 20,
|
| 49 |
+
"steps_per_report": 10,
|
| 50 |
+
"test": false,
|
| 51 |
+
"test_batches": 500,
|
| 52 |
+
"train": true,
|
| 53 |
+
"val_batches": 10
|
| 54 |
+
}
|
ir_honesty_fallback/adapters.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:02b521c2348477cf03f667c7b500f0be82bfb937277806e3f4e562b9593a1bbe
|
| 3 |
+
size 3386915
|
manifest.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"product": "loudink-v1.1",
|
| 3 |
+
"version": "1.1.0",
|
| 4 |
+
"pipeline_namespace": "loudink_v1_1",
|
| 5 |
+
"runner_kind": "loudink_v1",
|
| 6 |
+
"gate_mode": "warn",
|
| 7 |
+
"hf_repo": "nsalerni/loudink-v1.1",
|
| 8 |
+
"predecessor": "nsalerni/loudink-v1",
|
| 9 |
+
"writer_model_config": "configs/model_v5_lfm25_1_2b.yaml",
|
| 10 |
+
"writer_base_model": "mlx-community/LFM2.5-1.2B-Instruct-4bit",
|
| 11 |
+
"writer_adapter_path": "writer",
|
| 12 |
+
"writer_checkpoint": "promoted_core_100.safetensors",
|
| 13 |
+
"writer_unified_adapter_path": "writer_unified",
|
| 14 |
+
"writer_use_prompt_kv_cache": true,
|
| 15 |
+
"writer_chat_template_family": "lfm25",
|
| 16 |
+
"ir_model_config": "configs/model_v4_functiongemma.yaml",
|
| 17 |
+
"ir_base_model": "mlx-community/functiongemma-270m-it-4bit",
|
| 18 |
+
"ir_adapter_path": "ir",
|
| 19 |
+
"ir_adapter_fallback": "ir_honesty_fallback",
|
| 20 |
+
"ir_checkpoint": "adapters.safetensors",
|
| 21 |
+
"ir_prompt_mode": "verbose",
|
| 22 |
+
"ir_use_prompt_kv_cache": true,
|
| 23 |
+
"ir_max_tokens": 96,
|
| 24 |
+
"ir_chat_template_family": "functiongemma",
|
| 25 |
+
"learned_router_path": "router.json",
|
| 26 |
+
"use_learned_router": true,
|
| 27 |
+
"transcript_first_ir": true,
|
| 28 |
+
"intent_fast_path": true,
|
| 29 |
+
"disable_fast_paths": false,
|
| 30 |
+
"skill_store_path": "skill_store",
|
| 31 |
+
"skill_features": {
|
| 32 |
+
"record_and_replay": true,
|
| 33 |
+
"paraphrase_invoke": true,
|
| 34 |
+
"slot_fill": true,
|
| 35 |
+
"vision_fallback_scaffold": true,
|
| 36 |
+
"vision_fallback_default_enabled": false
|
| 37 |
+
},
|
| 38 |
+
"polish_mode": "structural",
|
| 39 |
+
"structural_polish_on_markers": true,
|
| 40 |
+
"prompt_mode": "verbose",
|
| 41 |
+
"json_early_stop": true,
|
| 42 |
+
"hot_download_mb_primary": 850,
|
| 43 |
+
"hot_download_mb_hard": 900,
|
| 44 |
+
"architecture": "C_dual_writer_ir_skills",
|
| 45 |
+
"suite_versions": {
|
| 46 |
+
"daily_mac": "daily_mac_v1_1_n69",
|
| 47 |
+
"skill_invoke": "skill_invoke_v1_n19",
|
| 48 |
+
"user_demand_ir": "n112_v1"
|
| 49 |
+
},
|
| 50 |
+
"metrics_v11": {
|
| 51 |
+
"daily_mac_overall_shipped": 1.0,
|
| 52 |
+
"daily_mac_writing_shipped": 1.0,
|
| 53 |
+
"daily_mac_writing_neural": 0.92,
|
| 54 |
+
"daily_mac_writing_p50_ms": 171,
|
| 55 |
+
"daily_mac_computer_shipped": 1.0,
|
| 56 |
+
"daily_mac_multi_step_shipped": 1.0,
|
| 57 |
+
"daily_mac_n": 69,
|
| 58 |
+
"skill_invoke_shipped": 1.0,
|
| 59 |
+
"skill_invoke_n": 19,
|
| 60 |
+
"ir_honesty_neural_n112": 0.4643
|
| 61 |
+
},
|
| 62 |
+
"notes": "1.1.0 canary: PR-A skill store/recorder/compiler; PR-B paraphrase invoke + IR labels; PR-C slot fill; PR-D expanded daily-mac (Focus/DND, Reminders, reply, tabs, Notion/Linear, writing reply/code); PR-E vision fallback scaffold (disabled by default). Holds v0.4 bars and exceeds writing neural on expanded suite."
|
| 63 |
+
}
|
product_scorecard.json
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"reports": [
|
| 3 |
+
{
|
| 4 |
+
"source": "artifacts/benchmarks/loudink_v1/daily_mac/loudink_v1_daily_mac_measurement.json",
|
| 5 |
+
"label": "loudink-v1 v0.4 daily-mac product",
|
| 6 |
+
"writing": {
|
| 7 |
+
"shipped": {
|
| 8 |
+
"total": 25,
|
| 9 |
+
"passed": 25,
|
| 10 |
+
"accuracy": 1.0
|
| 11 |
+
},
|
| 12 |
+
"neural": {
|
| 13 |
+
"total": 25,
|
| 14 |
+
"passed": 23,
|
| 15 |
+
"accuracy": 0.92,
|
| 16 |
+
"missing": 0
|
| 17 |
+
},
|
| 18 |
+
"polish_lift": 0.07999999999999996,
|
| 19 |
+
"latency": {
|
| 20 |
+
"n": 25,
|
| 21 |
+
"mean": 166.6401715839654,
|
| 22 |
+
"p50": 171.05649993754923,
|
| 23 |
+
"p95": 332.83937512896955,
|
| 24 |
+
"max": 383.80437484011054,
|
| 25 |
+
"model_invoked_p50": 176.41600011847913,
|
| 26 |
+
"model_invoked_p95": 332.83937512896955,
|
| 27 |
+
"model_invoked_n": 20,
|
| 28 |
+
"fast_path_rate": 0.19999999999999996
|
| 29 |
+
}
|
| 30 |
+
},
|
| 31 |
+
"computer": {
|
| 32 |
+
"shipped": {
|
| 33 |
+
"total": 44,
|
| 34 |
+
"passed": 44,
|
| 35 |
+
"accuracy": 1.0
|
| 36 |
+
},
|
| 37 |
+
"neural": {
|
| 38 |
+
"total": 44,
|
| 39 |
+
"passed": 0,
|
| 40 |
+
"accuracy": 0.0,
|
| 41 |
+
"missing": 44
|
| 42 |
+
},
|
| 43 |
+
"latency": {
|
| 44 |
+
"n": 44,
|
| 45 |
+
"mean": 0.05,
|
| 46 |
+
"p50": 0.05,
|
| 47 |
+
"p95": 0.05,
|
| 48 |
+
"max": 0.05,
|
| 49 |
+
"model_invoked_p50": 0.0,
|
| 50 |
+
"model_invoked_p95": 0.0,
|
| 51 |
+
"model_invoked_n": 0,
|
| 52 |
+
"fast_path_rate": 1.0
|
| 53 |
+
}
|
| 54 |
+
},
|
| 55 |
+
"multi_step": {
|
| 56 |
+
"shipped": {
|
| 57 |
+
"total": 25,
|
| 58 |
+
"passed": 25,
|
| 59 |
+
"accuracy": 1.0
|
| 60 |
+
},
|
| 61 |
+
"latency": {
|
| 62 |
+
"n": 25,
|
| 63 |
+
"mean": 0.05,
|
| 64 |
+
"p50": 0.05,
|
| 65 |
+
"p95": 0.05,
|
| 66 |
+
"max": 0.05,
|
| 67 |
+
"model_invoked_p50": 0.0,
|
| 68 |
+
"model_invoked_p95": 0.0,
|
| 69 |
+
"model_invoked_n": 0,
|
| 70 |
+
"fast_path_rate": 1.0
|
| 71 |
+
},
|
| 72 |
+
"n": 25
|
| 73 |
+
},
|
| 74 |
+
"overall": {
|
| 75 |
+
"shipped": {
|
| 76 |
+
"total": 69,
|
| 77 |
+
"passed": 69,
|
| 78 |
+
"accuracy": 1.0
|
| 79 |
+
},
|
| 80 |
+
"latency": {
|
| 81 |
+
"n": 69,
|
| 82 |
+
"mean": 60.40875782027732,
|
| 83 |
+
"p50": 0.05,
|
| 84 |
+
"p95": 323.94058303907514,
|
| 85 |
+
"max": 383.80437484011054,
|
| 86 |
+
"model_invoked_p50": 176.41600011847913,
|
| 87 |
+
"model_invoked_p95": 332.83937512896955,
|
| 88 |
+
"model_invoked_n": 20,
|
| 89 |
+
"fast_path_rate": 0.7101449275362319
|
| 90 |
+
}
|
| 91 |
+
},
|
| 92 |
+
"finish_reasons": {
|
| 93 |
+
"transcript_ir_fast_path": 44,
|
| 94 |
+
"loudink_v1_structural_polish": 20,
|
| 95 |
+
"transcript_polish_fast_path": 5
|
| 96 |
+
}
|
| 97 |
+
}
|
| 98 |
+
]
|
| 99 |
+
}
|
publish_report.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"hf_repo": "nsalerni/loudink-v1.1",
|
| 3 |
+
"output_dir": "artifacts/hf_publish/loudink-v1.1",
|
| 4 |
+
"version": "1.1.0",
|
| 5 |
+
"measured_adapter_bundle_mib": 70.14,
|
| 6 |
+
"files": [
|
| 7 |
+
"README.md",
|
| 8 |
+
"SHA256SUMS",
|
| 9 |
+
"STATUS.md",
|
| 10 |
+
"V1_1_COMPLETE.md",
|
| 11 |
+
"client_contract.md",
|
| 12 |
+
"inference_config.json",
|
| 13 |
+
"ir/adapter_config.json",
|
| 14 |
+
"ir/adapters.safetensors",
|
| 15 |
+
"ir_honesty_fallback/adapter_config.json",
|
| 16 |
+
"ir_honesty_fallback/adapters.safetensors",
|
| 17 |
+
"manifest.json",
|
| 18 |
+
"product_scorecard.json",
|
| 19 |
+
"router.json",
|
| 20 |
+
"skill_store/index.json",
|
| 21 |
+
"skill_store/skills/invoice_chase.json",
|
| 22 |
+
"skill_store/skills/morning_focus.json",
|
| 23 |
+
"skill_store/skills/standup_post.json",
|
| 24 |
+
"writer/promoted_core_100.safetensors",
|
| 25 |
+
"writer_unified/adapter_config.json",
|
| 26 |
+
"writer_unified/adapters.safetensors"
|
| 27 |
+
]
|
| 28 |
+
}
|
router.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"weights": {
|
| 3 |
+
"repair": {
|
| 4 |
+
"bias": 5.810288559009208,
|
| 5 |
+
"settings_pane": 2.5,
|
| 6 |
+
"open_prefix": -0.41745491159245274,
|
| 7 |
+
"automation_imperative": 3.726646453176461,
|
| 8 |
+
"word_count": -9.84929312552456,
|
| 9 |
+
"longform_signal": -1.1154836678961781,
|
| 10 |
+
"dictation_prose": 1.9345009743844221,
|
| 11 |
+
"filler_start": 1.2838928202621513,
|
| 12 |
+
"and_chain": 0.20859939463580085
|
| 13 |
+
},
|
| 14 |
+
"compact_ir": {
|
| 15 |
+
"bias": -3.640176689795005,
|
| 16 |
+
"and_chain": 0.35054606918952846,
|
| 17 |
+
"automation_imperative": 0.5592421853520967,
|
| 18 |
+
"open_prefix": -0.21733854149982806,
|
| 19 |
+
"word_count": -1.0103340242208811,
|
| 20 |
+
"settings_pane": 0.0,
|
| 21 |
+
"longform_signal": -0.05044327857241728,
|
| 22 |
+
"dictation_prose": -0.03462361505802813,
|
| 23 |
+
"filler_start": -0.038948122633683704
|
| 24 |
+
},
|
| 25 |
+
"longform_writer": {
|
| 26 |
+
"bias": -7.6502815198369145,
|
| 27 |
+
"longform_signal": 3.13050955434213,
|
| 28 |
+
"word_count": 13.274936614626753,
|
| 29 |
+
"dictation_prose": 0.7390766344993486,
|
| 30 |
+
"automation_imperative": -0.518431811263042,
|
| 31 |
+
"settings_pane": 0.0,
|
| 32 |
+
"open_prefix": -0.4527758645205938,
|
| 33 |
+
"filler_start": -0.17652712925511643,
|
| 34 |
+
"and_chain": 1.209884306661929
|
| 35 |
+
},
|
| 36 |
+
"writer": {
|
| 37 |
+
"bias": 5.680169650622764,
|
| 38 |
+
"filler_start": 0.4315824316266496,
|
| 39 |
+
"dictation_prose": -0.43895399382574257,
|
| 40 |
+
"word_count": -0.7153094648814279,
|
| 41 |
+
"automation_imperative": -1.4674568272655135,
|
| 42 |
+
"settings_pane": 0.0,
|
| 43 |
+
"longform_signal": 1.035417392126457,
|
| 44 |
+
"open_prefix": 2.8875693176128885,
|
| 45 |
+
"and_chain": 0.030970229512743263
|
| 46 |
+
}
|
| 47 |
+
},
|
| 48 |
+
"meta": {
|
| 49 |
+
"seed": "copied_from_v5_lite",
|
| 50 |
+
"source": "artifacts/v5_lite/router.json",
|
| 51 |
+
"product": "loudink-v1",
|
| 52 |
+
"notes": "Refit with labeled transcripts after PR8p/PR9p promote"
|
| 53 |
+
}
|
| 54 |
+
}
|
skill_store/index.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_version": "1.1.0-pra",
|
| 3 |
+
"skills": [
|
| 4 |
+
{
|
| 5 |
+
"skill_id": "invoice_chase",
|
| 6 |
+
"name": "Invoice Chase",
|
| 7 |
+
"aliases": [
|
| 8 |
+
"run invoice chase",
|
| 9 |
+
"chase invoices"
|
| 10 |
+
],
|
| 11 |
+
"source": "user_recording",
|
| 12 |
+
"skill_version": 1,
|
| 13 |
+
"risk": "low"
|
| 14 |
+
},
|
| 15 |
+
{
|
| 16 |
+
"skill_id": "morning_focus",
|
| 17 |
+
"name": "Morning Focus",
|
| 18 |
+
"aliases": [
|
| 19 |
+
"start my morning focus",
|
| 20 |
+
"morning focus workflow"
|
| 21 |
+
],
|
| 22 |
+
"source": "user_recording",
|
| 23 |
+
"skill_version": 1,
|
| 24 |
+
"risk": "low"
|
| 25 |
+
},
|
| 26 |
+
{
|
| 27 |
+
"skill_id": "standup_post",
|
| 28 |
+
"name": "Standup Post",
|
| 29 |
+
"aliases": [
|
| 30 |
+
"post standup",
|
| 31 |
+
"daily standup slack"
|
| 32 |
+
],
|
| 33 |
+
"source": "user_recording",
|
| 34 |
+
"skill_version": 1,
|
| 35 |
+
"risk": "low"
|
| 36 |
+
}
|
| 37 |
+
]
|
| 38 |
+
}
|
skill_store/skills/invoice_chase.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"skill_id": "invoice_chase",
|
| 3 |
+
"name": "Invoice Chase",
|
| 4 |
+
"aliases": [
|
| 5 |
+
"run invoice chase",
|
| 6 |
+
"chase invoices"
|
| 7 |
+
],
|
| 8 |
+
"source": "user_recording",
|
| 9 |
+
"created_at": "2026-07-09T05:42:10+00:00",
|
| 10 |
+
"skill_version": 1,
|
| 11 |
+
"schema_version": "1.1.0-pra",
|
| 12 |
+
"steps": [
|
| 13 |
+
{
|
| 14 |
+
"type": "open_url",
|
| 15 |
+
"url": "https://mail.google.com",
|
| 16 |
+
"browser": "chrome"
|
| 17 |
+
},
|
| 18 |
+
{
|
| 19 |
+
"type": "wait",
|
| 20 |
+
"milliseconds": 1000
|
| 21 |
+
},
|
| 22 |
+
{
|
| 23 |
+
"type": "browser_insert_text",
|
| 24 |
+
"text": "invoice overdue",
|
| 25 |
+
"browser": "chrome"
|
| 26 |
+
}
|
| 27 |
+
],
|
| 28 |
+
"slots": [
|
| 29 |
+
{
|
| 30 |
+
"name": "company",
|
| 31 |
+
"prompt": "company name",
|
| 32 |
+
"bind": "steps[2].text",
|
| 33 |
+
"required": true,
|
| 34 |
+
"default": null
|
| 35 |
+
}
|
| 36 |
+
],
|
| 37 |
+
"risk": "low",
|
| 38 |
+
"requires_confirmation": false,
|
| 39 |
+
"notes": ""
|
| 40 |
+
}
|
skill_store/skills/morning_focus.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"skill_id": "morning_focus",
|
| 3 |
+
"name": "Morning Focus",
|
| 4 |
+
"aliases": [
|
| 5 |
+
"start my morning focus",
|
| 6 |
+
"morning focus workflow"
|
| 7 |
+
],
|
| 8 |
+
"source": "user_recording",
|
| 9 |
+
"created_at": "2026-07-09T05:42:10+00:00",
|
| 10 |
+
"skill_version": 1,
|
| 11 |
+
"schema_version": "1.1.0-pra",
|
| 12 |
+
"steps": [
|
| 13 |
+
{
|
| 14 |
+
"type": "launch_application",
|
| 15 |
+
"app_name": "Shortcuts"
|
| 16 |
+
},
|
| 17 |
+
{
|
| 18 |
+
"type": "wait",
|
| 19 |
+
"milliseconds": 800
|
| 20 |
+
},
|
| 21 |
+
{
|
| 22 |
+
"type": "type_text",
|
| 23 |
+
"text": "Morning Focus"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"type": "keystroke",
|
| 27 |
+
"key": "return",
|
| 28 |
+
"modifiers": []
|
| 29 |
+
}
|
| 30 |
+
],
|
| 31 |
+
"slots": [],
|
| 32 |
+
"risk": "low",
|
| 33 |
+
"requires_confirmation": false,
|
| 34 |
+
"notes": ""
|
| 35 |
+
}
|
skill_store/skills/standup_post.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"skill_id": "standup_post",
|
| 3 |
+
"name": "Standup Post",
|
| 4 |
+
"aliases": [
|
| 5 |
+
"post standup",
|
| 6 |
+
"daily standup slack"
|
| 7 |
+
],
|
| 8 |
+
"source": "user_recording",
|
| 9 |
+
"created_at": "2026-07-09T05:42:10+00:00",
|
| 10 |
+
"skill_version": 1,
|
| 11 |
+
"schema_version": "1.1.0-pra",
|
| 12 |
+
"steps": [
|
| 13 |
+
{
|
| 14 |
+
"type": "launch_application",
|
| 15 |
+
"app_name": "Slack"
|
| 16 |
+
},
|
| 17 |
+
{
|
| 18 |
+
"type": "wait",
|
| 19 |
+
"milliseconds": 600
|
| 20 |
+
},
|
| 21 |
+
{
|
| 22 |
+
"type": "type_text",
|
| 23 |
+
"text": "standup update"
|
| 24 |
+
}
|
| 25 |
+
],
|
| 26 |
+
"slots": [
|
| 27 |
+
{
|
| 28 |
+
"name": "update",
|
| 29 |
+
"prompt": "standup text",
|
| 30 |
+
"bind": "steps[2].text",
|
| 31 |
+
"required": false,
|
| 32 |
+
"default": "standup update"
|
| 33 |
+
}
|
| 34 |
+
],
|
| 35 |
+
"risk": "low",
|
| 36 |
+
"requires_confirmation": false,
|
| 37 |
+
"notes": ""
|
| 38 |
+
}
|
writer/promoted_core_100.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ceb709ccf7a40ea608c5cc74c247071bbcb0980017f1811f7c55604b4241ab7c
|
| 3 |
+
size 44453426
|
writer_unified/adapter_config.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"adapter_path": "artifacts/sft_loudink_v1_rft_daily/adapters",
|
| 3 |
+
"batch_size": 1,
|
| 4 |
+
"clear_cache_threshold": 0,
|
| 5 |
+
"config": null,
|
| 6 |
+
"data": "data/sft_loudink_v1_rft_daily_micro",
|
| 7 |
+
"fine_tune_type": "lora",
|
| 8 |
+
"gpu_mode": "shared",
|
| 9 |
+
"grad_accumulation_steps": 8,
|
| 10 |
+
"grad_checkpoint": true,
|
| 11 |
+
"iters": 50,
|
| 12 |
+
"learning_rate": 5e-07,
|
| 13 |
+
"lora_parameters": {
|
| 14 |
+
"dropout": 0.05,
|
| 15 |
+
"keys": [
|
| 16 |
+
"self_attn.q_proj",
|
| 17 |
+
"self_attn.k_proj",
|
| 18 |
+
"self_attn.v_proj",
|
| 19 |
+
"self_attn.out_proj",
|
| 20 |
+
"conv.in_proj",
|
| 21 |
+
"conv.out_proj",
|
| 22 |
+
"feed_forward.w1",
|
| 23 |
+
"feed_forward.w2",
|
| 24 |
+
"feed_forward.w3"
|
| 25 |
+
],
|
| 26 |
+
"rank": 16,
|
| 27 |
+
"scale": 32.0
|
| 28 |
+
},
|
| 29 |
+
"lr_schedule": null,
|
| 30 |
+
"mask_prompt": true,
|
| 31 |
+
"max_seq_length": 2048,
|
| 32 |
+
"model": "/Users/nilptr/dev/open-source/finetune-rl-gemma/artifacts/models/lfm2.5-1.2b-instruct-4bit",
|
| 33 |
+
"model_config": "configs/model_v5_lfm25_1_2b.yaml",
|
| 34 |
+
"model_hf_repo": "mlx-community/LFM2.5-1.2B-Instruct-4bit",
|
| 35 |
+
"model_local_path": "artifacts/models/lfm2.5-1.2b-instruct-4bit",
|
| 36 |
+
"num_layers": 8,
|
| 37 |
+
"optimizer": "adamw",
|
| 38 |
+
"optimizer_config": {
|
| 39 |
+
"adam": {},
|
| 40 |
+
"adamw": {},
|
| 41 |
+
"muon": {},
|
| 42 |
+
"sgd": {},
|
| 43 |
+
"adafactor": {}
|
| 44 |
+
},
|
| 45 |
+
"project_name": null,
|
| 46 |
+
"report_to": null,
|
| 47 |
+
"resume_adapter_file": "artifacts/sft_loudink_v1_rft_daily/adapters/adapters.safetensors",
|
| 48 |
+
"save_every": 25,
|
| 49 |
+
"seed": 35,
|
| 50 |
+
"steps_per_eval": 25,
|
| 51 |
+
"steps_per_report": 10,
|
| 52 |
+
"test": false,
|
| 53 |
+
"test_batches": 500,
|
| 54 |
+
"train": true,
|
| 55 |
+
"val_batches": 4
|
| 56 |
+
}
|
writer_unified/adapters.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2db8a19242ab84fb4b64820528509c3eb842c998f53247e6cf13999b0651b955
|
| 3 |
+
size 22292714
|