picoclaw/pkg
xiaoen 1943c3e660 feat(routing): add language-agnostic model complexity scorer
Add three new files to pkg/routing/:

features.go — ExtractFeatures(msg, history) → Features
  Computes five structural dimensions with zero keyword matching:
  - TokenEstimate: rune_count/3 (CJK-safe token proxy)
  - CodeBlockCount: ``` pairs in the message
  - RecentToolCalls: tool call count in the last 6 history entries
  - ConversationDepth: total messages in session
  - HasAttachments: data URIs or media file extensions

classifier.go — Classifier interface + RuleClassifier
  RuleClassifier uses a weighted sum that is capped at 1.0:
    code block      → +0.40  (triggers heavy model alone at 0.35 threshold)
    token > 200     → +0.35  (triggers heavy model alone)
    tool calls > 3  → +0.25
    token 50-200    → +0.15
    conversation depth > 10 → +0.10
    attachment      → 1.00 (hard gate, always heavy)

router.go — Router wraps config + Classifier
  Router.SelectModel(msg, history, primaryModel) returns either the
  configured light_model or the primary model depending on whether
  the complexity score clears the threshold. Threshold defaults to
  0.35 when zero/negative to prevent misconfiguration.

router_test.go — 34 tests covering all branches and edge cases
2026-03-02 22:42:20 +08:00
..
agent Merge pull request #535 from xiaket/ci-enable-dupl-linter 2026-03-02 18:55:35 +08:00
auth feat: add picoclaw-launcher with web UI for configuration and gateway management (#904) 2026-02-28 18:38:38 +08:00
bus chore: resolve conflicts with upstream/main 2026-02-28 12:21:54 +08:00
channels Merge pull request #893 from reevoid/rui-dev 2026-03-02 21:50:21 +08:00
config feat(config): add RoutingConfig to AgentDefaults 2026-03-02 22:40:52 +08:00
constants refactor: replace bool map with set-style map for internal channels (#472) 2026-02-19 11:48:17 +01:00
cron style: fix gci import grouping in config, cron, and skills installer 2026-02-26 20:38:11 +08:00
devices refactor: cleanup dead code and turn on dead code detection in CI (#515) 2026-02-24 21:52:25 +08:00
fileutil refactor(pkg): move atomic file write to dedicated fileutil package 2026-02-24 23:57:13 +08:00
health chore: resolve conflicts with upstream/main 2026-02-28 12:21:54 +08:00
heartbeat enable dupl check 2026-03-01 18:17:32 +11:00
identity feat(identity): add unified user identity with canonical platform:id format 2026-02-23 06:56:48 +08:00
logger enable prealloc 2026-02-25 21:31:07 +11:00
media chore: resolve conflicts with upstream/main 2026-02-28 12:21:54 +08:00
migrate enable dupl check 2026-03-01 18:17:32 +11:00
providers Merge pull request #535 from xiaket/ci-enable-dupl-linter 2026-03-02 18:55:35 +08:00
routing feat(routing): add language-agnostic model complexity scorer 2026-03-02 22:42:20 +08:00
session feat(fmt): Run formatters 2026-02-18 21:48:23 +02:00
skills Merge pull request #861 from p3ddd/refactor/modernize 2026-03-01 15:38:59 +08:00
state fix: error check on state (#864) 2026-03-02 11:59:26 +11:00
tools fix(tools): allow /dev/null redirection and add read/write sandbox split (#967) 2026-03-02 12:22:02 +08:00
utils fix(tools): close resp.Body on retry cancel and cache http.Client instances (#940) 2026-03-01 16:55:46 +11:00
voice feat(linter): Fix govet linter 2026-02-20 22:35:16 +02:00