はじめに

2月から3ヶ月かけて、ローカルLLMとデータ基盤をつなぐマルチエージェント開発基盤 familiar を実装しました。名前は家族と使い魔に由来します。内部aliasは、フクロウの grandpa、子猫の frisky、子狐の naughty です。

familiarのロゴ
familiar のロゴ。内部aliasの grandpa / frisky / naughty。インスピレーションからチャッピーに作ってもらった。

55分のデモをYouTubeに残しました。

動画リンク: https://www.youtube.com/watch?v=tSAguJzTINs

デモでは、人の介入なしでDjangoの飲食店予約システムを計画、実装、テスト、レビューしました。33コミット、約11Mトークンを使い、13テスト全パス、全レビューアーapprovedまで進みました。

Reactも軽い検証では動きました。Tauri、Flutter、Hugoなど仕事や個人開発で使う構成も用意しています。X-Role Headerには企画(Strategist)、投資(Analyst)、PR(Spokesman)の内部変数を加えました。orchestratorとworkerは役割を追加し、モデルを差し替えられます。

この基盤の開発経緯と、実装で決めたことを記録します。

familiar とは何なのか

familiarは複数のローカルLLMへ作業を分け、実行、再試行、統合まで管理します。観測と学習パイプラインも組み合わせたオンプレミスの基盤です。

人間は最初に要求を渡し、最後に確認します。将来は systemctl start familiar.service だけで開始する形を目指しています。orchestratorは計画、割当て、結果の判断、workerは実装、テスト、レビュー、視覚的デザイン、場合によっては統合を担当します。通信を依頼として扱い、完了報告、確認材料、成果物、レビュー判定を保存します。

開発では、モデルだけに任せず、実行基盤とツールで苦手な処理を補いました。失敗後も作業を続けられることを重視しています。

Familiar Workflow & Replay dashboard showing one autonomous development session
Workflow & Replay。55分デモの session を request、turn、token、chat flow として後から再生できるようにした。

判断とworkerの結果を同じ時系列で追います。成功、失敗、依存の詰まり、再試行、その再現性を見ることで、指示、実行順序、ツールのどこを直すか決めます。

Familiar Orchestrator Decisions dashboard showing worker outcomes and dependency graph
Orchestrator Decisions。worker の pass/fail、depends_on graph、decision events を同じ画面で追う。
Familiar Orchestrator Decisions dashboard for a DeepSeek V4 Flash session
DeepSeek V4 Flash を orchestrator model にした session。turn、planned workers、dependency edges、recovery signals を見る。

モデル自体の開発は費用とデータ権利の面で難しいため、ライセンスを確認したOSSを保存しています。grandpaはGLM-5.1、Kimi-K2.5、DeepSeek V4 Flashなどに置換できます。新しいモデルへ替え、蓄積したデータセットで経験を補う考えです。当時はライセンスと安定性から、orchestratorにGLM-5.1、workerにMTP対応が進むQwen3.6やgemma4を置きました。2月〜4月に候補が増えたことも助けになりました。

DwarfStar and DeepSeek V4 Flash grandpa backend running beside Zed and GPU monitoring
DwarfStar/DeepSeek V4 Flash を grandpa backend として起動しながら、Zed、aichat、DCGM を同時に見ていた検証環境。

観測も実装に合わせて増えました。Grafana Familiar folderをバックアップし、54世代のdashboardを同期した記録があります。Orchestrator Decisions、Workflow & Replay、MOLsEV、C&F Latency、Arch Stats、Tool Calls、Guard Calls、LoRA/Prompt ROI、Model/Quant Failure Heatmapなどで確認します。

Familiar MOLsEV dashboard showing outcome and environment value trends
MOLsEV。task ごとの outcome と environment value を見て、低スコアの role/talent を追う。
Familiar C&F Latency dashboard showing token workload, latency, and worker pool pressure
C&F Latency。task kind ごとの token workload、latency、worker pool pressure を見る。

promptとモデル選択に加え、OSSの観測・検索・実行ツールが必要でした。

発端は Qwen Next だった

きっかけは去年7月頃のQwen Nextでした。

MoE、長いcontext、複数モデルを使うには、GPUだけでなくCPU、メモリ帯域、L3 cache、ストレージ、ネットワークを合わせて設計する必要があると感じました。CPU推論の比重が増すと考えたためです。

半導体不足も気になり、8月頃にマシン構成を検討しました。

自作PCは趣味ですが、今回は費用とリスクが大きく、希望するHPC構成を発注して3ヶ月待ちました。EPYC 9175Fは16C/16T、L3 512MBです。CPU推論を重視して選びました。

compute、storage、desktop、edgeに分けました。

  • compute.home.arpa:EPYC 9175F、大容量DDR5、NVIDIA GPU 2枚の推論ノードです。
  • storage.home.arpa:PostgreSQL、NATS JetStream、MinIO、Gitea、OCI Registry、Prometheus、Loki、Vector、Caddyを置きます。Mac mini Late 2018(x86)をLinuxに替え、24/7で運用しています。中古約3万円で、Arm対応の手間がなく、メルカリでスペアも集めています。
  • desktop.home.arpa:日常作業、UI、外部ネットワークとの接点です。
  • edge.home.arpa:RouterOS、Step-CA、Caddyで内部TLSとネットワーク境界を扱います。

法人ではありますが、実態はフリーランスエンジニアなので、大きな投資でした。

ノウハウが少なく何度も実験するため、手元の機材に合わせて設計しました。プロトタイプを作った今なら、中古3万程度のx86 Mac miniとクラウドGPUでもできると思いますが、事前には判断できませんでした。

使う時間も必要なので、長く担当した案件を減らし、12月から集中する計画を立てました。案件を離れる準備も進めました。

12月に長い取引先の技術者が大病を患い、時間を空けられなくなりました。2月に落ち着いてから、細かな作業を進めています。

先にネットワーク、サービス配置、推論、永続化、観測、開発環境を分けました。長く動かし、故障を追えるインフラを用意してからエージェントへ進みました。

最初は LLM 利用を観測するための proxy だった

最初は、LLM利用を観測する軽いbackendでした。

Rust + axumのAPIでLLMへproxyし、Knowledge.Gateでprompt、response、tool call、失敗を集めました。Dagster、MLflow、NATS、Prometheus、Grafanaも置きました。

クラウドAPIでもローカルでも、出力だけでは改善点が分かりません。履歴、失敗、token消費、モデルの癖を残すことが目的でした。

実装を進めると、判断と復旧も同じ基盤で扱いたくなりました。

観測する対象、自律させる範囲、判断の置き場所、失敗後の戻り方、学習へ使うログを整理しました。

Rust + axumの実装をGoへ替えました。goroutineとchannelで並列実行、状態、scheduling、subscriptionを扱いやすかったためです。外部MCPやPythonツールへの依存を減らし、単一binaryに近い常駐基盤を目指しています。

動画の最後ではsessionを止めますが、外部pub/subから依頼を受けられます。所定directoryのtaskを取り出し、KVをevictしながら success | fail | loop へ進む仕組みも設計しました。待機と再開のコストが低いGoが合いました。

短いタスクでモデルを選ぶ

1月頃からモデルを選び始めました。

大きな機能を作る時間がなかったため、モデルを取得して短いtaskを渡しました。promptの崩れ、tool call、長文、空出力、XML、toolの閉じ忘れ、CPU offloadの待ち時間、量子化の限界を観察しています。

当時のHugging Face archiveは、この試行の記録です。

  ksh3@storage-server:~$ ls -ltr /srv/archive/cold/hf/hub/
total 0
drwxr-xr-x 5 ksh3 ksh3 64 Jan  4 19:44 models--Qwen--Qwen3-VL-32B-Instruct
drwxr-xr-x 5 ksh3 ksh3 64 Jan  4 20:21 models--AaryanK--IQuest-Coder-V1-40B-Instruct-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Jan  4 23:30 models--NousResearch--Hermes-4.3-36B
drwxr-xr-x 5 ksh3 ksh3 64 Jan  5 00:11 models--unsloth--gpt-oss-120b-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Jan  5 01:56 models--NousResearch--Hermes-4-70B-FP8
drwxr-xr-x 5 ksh3 ksh3 64 Jan  5 08:23 models--lmstudio-community--Llama-4-Scout-17B-16E-Instruct-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Jan  9 10:23 models--nvidia--Llama-3.3-70B-Instruct-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Jan  9 11:33 models--nvidia--Llama-4-Scout-17B-16E-Instruct-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Jan  9 11:46 models--Firworks--command-a-reasoning-08-2025-nvfp4
drwxr-xr-x 5 ksh3 ksh3 64 Jan  9 19:59 models--Elias-Schwegler--IQuest-Coder-V1-40B-Loop-Instruct-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Jan  9 21:51 models--miromind-ai--MiroThinker-v1.5-30B
drwxr-xr-x 5 ksh3 ksh3 64 Jan  9 22:37 models--IQuestLab--IQuest-Coder-V1-40B-Loop-Instruct
drwxr-xr-x 5 ksh3 ksh3 64 Jan  9 22:37 models--IQuestLab--IQuest-Coder-V1-40B-Instruct
drwxr-xr-x 6 ksh3 ksh3 85 Jan 11 01:03 models--unsloth--Llama-4-Maverick-17B-128E-Instruct-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 01:47 models--pfnet--plamo-2-translate
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 02:15 models--google--functiongemma-270m-it
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 02:17 models--Firworks--gemma-3-270m-it-nvfp4
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 05:44 models--BCCard--gemma-3-27b-it-NVFP4A16
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 07:01 models--openai--gpt-oss-20b
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 07:27 models--google--gemma-3-27b-it
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 10:46 models--GAlex535--Qwen3-Coder-30B-A3B-Instruct-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 13:17 models--openai--gpt-oss-120b
drwxr-xr-x 5 ksh3 ksh3 64 Jan 11 15:20 models--mratsim--Monstral-123B-v2-NVFP4
drwxr-xr-x 6 ksh3 ksh3 85 Jan 11 15:37 models--Lightricks--LTX-2
drwxr-xr-x 5 ksh3 ksh3 64 Jan 12 01:04 models--ChristianAzinn--mixtral-8x22b-v0.1-imatrix
drwxr-xr-x 5 ksh3 ksh3 64 Jan 20 08:57 models--Firworks--NVIDIA-Nemotron-3-Nano-30B-A3B-nvfp4
drwxr-xr-x 5 ksh3 ksh3 64 Jan 20 10:13 models--Qwen--Qwen3-Coder-30B-A3B-Instruct-FP8
drwxr-xr-x 5 ksh3 ksh3 64 Jan 22 04:07 models--zai-org--GLM-4.7-Flash
drwxr-xr-x 5 ksh3 ksh3 64 Feb  5 15:11 models--nvidia--NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Feb 13 22:57 models--unsloth--Qwen3-Next-80B-A3B-Thinking-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 14 00:46 models--AesSedai--Step-3.5-Flash-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 15 06:15 models--unsloth--GLM-5-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 15 11:44 models--ubergarm--GLM-4.7-Flash-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 15 18:10 models--DavidAU--GLM-4.7-Flash-Uncensored-Heretic-NEO-CODE-Imatrix-MAX-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 15 19:11 models--bartowski--Qwen_Qwen3-Coder-Next-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 16 00:52 models--ubergarm--DeepSeek-V3.2-Speciale-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 16 03:44 models--DavidAU--Openai_gpt-oss-120b-NEO-Imatrix-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 17 08:49 models--ubergarm--MiniMax-M2.5-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 17 19:40 models--GadflyII--Qwen3-Coder-Next-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Feb 18 15:12 models--ACE-Step--Ace-Step1.5
drwxr-xr-x 5 ksh3 ksh3 64 Feb 18 15:41 models--mistralai--Voxtral-Mini-4B-Realtime-2602
drwxr-xr-x 5 ksh3 ksh3 64 Feb 18 17:18 models--black-forest-labs--FLUX.2-klein-9B
drwxr-xr-x 5 ksh3 ksh3 64 Feb 18 23:14 models--LiquidAI--LFM2-8B-A1B
drwxr-xr-x 5 ksh3 ksh3 64 Feb 19 00:09 models--LiquidAI--LFM2-8B-A1B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 19 05:58 models--LiquidAI--LFM2.5-1.2B-Thinking
drwxr-xr-x 5 ksh3 ksh3 64 Feb 19 06:03 models--LiquidAI--LFM2.5-VL-1.6B
drwxr-xr-x 5 ksh3 ksh3 64 Feb 19 06:07 models--LiquidAI--LFM2.5-1.2B-Instruct
drwxr-xr-x 5 ksh3 ksh3 64 Feb 19 19:49 models--ubergarm--Devstral-2-123B-Instruct-2512-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 23 20:30 models--AesSedai--MiniMax-M2.5-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 24 06:41 models--nvidia--Qwen3-Next-80B-A3B-Instruct-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Feb 24 06:47 models--nvidia--Qwen3-Next-80B-A3B-Thinking-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Feb 25 01:54 models--AesSedai--Qwen3.5-35B-A3B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 25 03:16 models--AesSedai--Qwen3.5-122B-A10B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Feb 25 16:57 models--Sehyo--Qwen3.5-122B-A10B-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Feb 25 19:39 models--Qwen--Qwen3.5-27B
drwxr-xr-x 5 ksh3 ksh3 64 Mar  2 04:18 models--mmnga-o--NVIDIA-Nemotron-Nano-9B-v2-Japanese-gguf
drwxr-xr-x 5 ksh3 ksh3 64 Mar  2 06:23 models--nvidia--NVIDIA-Nemotron-Nano-9B-v2-Japanese
drwxr-xr-x 5 ksh3 ksh3 64 Mar  3 02:56 models--bartowski--Qwen_Qwen3.5-27B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Mar  3 03:53 models--ubergarm--Qwen3.5-27B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Mar  6 05:21 models--perplexity-ai--pplx-embed-context-v1-0.6b
drwxr-xr-x 5 ksh3 ksh3 64 Mar  6 05:24 models--perplexity-ai--pplx-embed-v1-0.6b
drwxr-xr-x 5 ksh3 ksh3 64 Mar  6 08:22 models--perplexity-ai--pplx-embed-context-v1-4b
drwxr-xr-x 5 ksh3 ksh3 64 Mar  6 08:23 models--perplexity-ai--pplx-embed-v1-4b
drwxr-xr-x 5 ksh3 ksh3 64 Mar 14 00:30 models--AesSedai--NVIDIA-Nemotron-3-Super-120B-A12B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Mar 14 11:03 models--nvidia--NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Mar 17 23:30 models--fishaudio--s2-pro
drwxr-xr-x 5 ksh3 ksh3 64 Mar 17 23:36 models--mradermacher--Qwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled-i1-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Mar 18 00:00 models--bartowski--Qwen_Qwen3.5-4B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Mar 18 16:24 models--AesSedai--Mistral-Small-4-119B-2603-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Mar 23 04:31 models--AesSedai--Nemotron-Cascade-2-30B-A3B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Mar 27 03:02 models--mconcat--Qwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Mar 27 03:37 models--Qwen--Qwen3.5-9B
drwxr-xr-x 5 ksh3 ksh3 64 Mar 27 04:54 models--chankhavu--Nemotron-Cascade-2-30B-A3B-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Mar 27 21:50 models--Jackrong--Qwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled
drwxr-xr-x 5 ksh3 ksh3 64 Mar 27 21:57 datasets--OpenMOSS-Team--OmniAction
drwxr-xr-x 5 ksh3 ksh3 64 Mar 27 21:59 datasets--Roman1111111--claude-opus-4.6-10000x
drwxr-xr-x 5 ksh3 ksh3 64 Mar 27 22:11 datasets--nvidia--Nemotron-Terminal-Corpus
drwxr-xr-x 5 ksh3 ksh3 64 Mar 28 05:43 models--nvidia--Nemotron-Cascade-2-30B-A3B
drwxr-xr-x 5 ksh3 ksh3 64 Mar 28 09:17 datasets--nvidia--Nemotron-Terminal-Synthetic-Tasks
drwxr-xr-x 6 ksh3 ksh3 85 Mar 29 14:33 models--HauhauCS--Qwen3.5-35B-A3B-Uncensored-HauhauCS-Aggressive
drwxr-xr-x 5 ksh3 ksh3 64 Mar 29 17:33 models--Qwen--Qwen3.5-4B-Base
drwxr-xr-x 5 ksh3 ksh3 64 Mar 29 18:47 models--Qwen--Qwen3.5-35B-A3B-Base
drwxr-xr-x 5 ksh3 ksh3 64 Mar 29 18:55 models--mistralai--Mistral-Small-4-119B-2603-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Mar 30 08:24 models--Qwen--Qwen3.5-9B-Base
drwxr-xr-x 5 ksh3 ksh3 64 Mar 30 08:24 models--zed-industries--zeta-2
drwxr-xr-x 5 ksh3 ksh3 64 Mar 30 11:24 models--nvidia--MiniMax-M2.5-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 Mar 30 12:59 models--sentence-transformers--all-MiniLM-L6-v2
drwxr-xr-x 5 ksh3 ksh3 64 Mar 30 13:02 models--datalab-to--chandra-ocr-2
drwxr-xr-x 5 ksh3 ksh3 64 Apr  2 14:29 datasets--ianncity--KIMI-K2.5-450000x
drwxr-xr-x 5 ksh3 ksh3 64 Apr  2 14:42 datasets--open-index--hacker-news
drwxr-xr-x 5 ksh3 ksh3 64 Apr  3 00:49 models--bartowski--google_gemma-4-26B-A4B-it-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr  3 02:31 models--lightonai--LateOn-Code-edge
drwxr-xr-x 5 ksh3 ksh3 64 Apr  3 02:32 models--mixedbread-ai--mxbai-edge-colbert-v0-17m
drwxr-xr-x 5 ksh3 ksh3 64 Apr  3 11:33 models--google--gemma-4-26B-A4B-it
drwxr-xr-x 5 ksh3 ksh3 64 Apr  3 17:15 models--ubergarm--Step-3.5-Flash-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr  6 07:00 models--bartowski--Qwen_Qwen3.5-9B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr  8 15:31 datasets--nohurry--Opus-4.6-Reasoning-3000x-filtered
drwxr-xr-x 5 ksh3 ksh3 64 Apr  8 16:17 datasets--ianncity--KIMI-K2.5-1000000x
drwxr-xr-x 6 ksh3 ksh3 85 Apr  8 16:38 models--ubergarm--Qwen3-Coder-Next-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr 11 05:57 models--google--translategemma-4b-it
drwxr-xr-x 5 ksh3 ksh3 64 Apr 11 06:20 models--llm-jp--llm-jp-4-32b-a3b-base
drwxr-xr-x 5 ksh3 ksh3 64 Apr 12 18:35 models--MiniMaxAI--MiniMax-M2.7
drwxr-xr-x 6 ksh3 ksh3 85 Apr 13 02:52 models--ubergarm--MiniMax-M2.7-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr 14 09:24 models--llm-jp--llm-jp-4-32b-a3b-thinking
drwxr-xr-x 5 ksh3 ksh3 64 Apr 16 09:22 models--AesSedai--Qwen3.5-397B-A17B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr 17 08:51 models--AesSedai--Qwen3.6-35B-A3B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr 20 09:02 models--cyberagent--CAT-Translate-7b
drwxr-xr-x 5 ksh3 ksh3 64 Apr 20 14:25 datasets--Jackrong--GLM-5.1-Reasoning-1M-Cleaned
drwxr-xr-x 5 ksh3 ksh3 64 Apr 23 00:11 models--openai--privacy-filter
drwxr-xr-x 5 ksh3 ksh3 64 Apr 23 15:41 models--Qwen--Qwen3.6-27B
drwxr-xr-x 5 ksh3 ksh3 64 Apr 23 16:36 models--Qwen--Qwen3.6-27B-FP8
drwxr-xr-x 5 ksh3 ksh3 64 Apr 24 00:41 models--huihui-ai--Huihui-GLM-5.1-abliterated-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr 24 11:19 models--deepseek-ai--DeepSeek-V4-Flash
drwxr-xr-x 5 ksh3 ksh3 64 Apr 24 15:24 datasets--Modotte--CodeX-2M-Thinking
drwxr-xr-x 5 ksh3 ksh3 64 Apr 27 01:44 models--nsparks--DeepSeek-V4-Flash-FP4-FP8-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr 27 16:02 models--zai-org--GLM-5.1
drwxr-xr-x 5 ksh3 ksh3 64 Apr 29 16:51 models--Qwen--Qwen3.6-35B-A3B-FP8
drwxr-xr-x 5 ksh3 ksh3 64 Apr 29 17:22 models--Qwen--Qwen3.6-35B-A3B
drwxr-xr-x 5 ksh3 ksh3 64 Apr 29 17:43 models--AesSedai--Kimi-K2.6-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 Apr 30 18:40 models--RedHatAI--DeepSeek-V4-Flash-NVFP4-FP8
drwxr-xr-x 5 ksh3 ksh3 64 May  1 16:03 datasets--AlicanKiraz0--Cybersecurity-Dataset-Fenrir-v2.1
drwxr-xr-x 5 ksh3 ksh3 64 May  1 22:50 models--ubergarm--GLM-5.1-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 May  2 09:46 models--mistralai--Mistral-Medium-3.5-128B
drwxr-xr-x 5 ksh3 ksh3 64 May  2 09:55 models--mistralai--Mistral-Medium-3.5-128B-EAGLE
drwxr-xr-x 5 ksh3 ksh3 64 May  2 14:43 models--RedHatAI--Qwen3.6-35B-A3B-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 May  3 14:55 models--ubergarm--Qwen3.6-27B-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 May  4 03:57 models--sakamakismile--Qwen3.6-27B-Text-NVFP4-MTP
drwxr-xr-x 5 ksh3 ksh3 64 May  4 15:06 datasets--Kassadin88--GLM-5.1-OpenThoughts3-Distill
drwxr-xr-x 5 ksh3 ksh3 64 May  7 14:01 models--LilaRest--gemma-4-31B-it-NVFP4-turbo
drwxr-xr-x 5 ksh3 ksh3 64 May  7 14:04 models--nvidia--Gemma-4-31B-IT-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 May  7 14:05 models--google--gemma-4-31B-it-assistant
drwxr-xr-x 5 ksh3 ksh3 64 May  9 01:20 models--RecViking--Mistral-Medium-3.5-128B-NVFP4
drwxr-xr-x 5 ksh3 ksh3 64 May 10 02:52 models--ubergarm--Kimi-K2.6-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 May 10 07:18 models--google--gemma-4-31B-it
drwxr-xr-x 5 ksh3 ksh3 64 May 10 10:25 models--Zyphra--ZAYA1-74B-preview
drwxr-xr-x 5 ksh3 ksh3 64 May 12 16:37 models--AesSedai--MiMo-V2.5-Pro-GGUF
drwxr-xr-x 5 ksh3 ksh3 64 May 12 17:21 models--antirez--deepseek-v4-gguf
ksh3@storage-server:~$
  

uncensored、ストーリーテラー、画像・動画生成、security、coding、OCRなどを試しました。役割、量子化、挙動の違いを探るためです。

Claudeを開発へ取り入れる

コードを書くのが好きです。

AI支援はinline autocompleteだけにしていました。Copilotは便利でも、書く作業は自分で続けたかったためです。

今年2月、戦争利用への反対表明を見てClaudeを使いました。使ってみると、もっと早く始めればよかったと感じました。

肩こりと腱鞘炎が続き、数年で引退するかとも考えていました。Claudeは開発を続ける助けになり、自分の癖、ノウハウ、設計方針、捨てる基準を補う仕組みを作りたいと思いました。

3月頃からClaudeを開発へ使いました。claude -p やCodexへ小さな依存としてpromptを渡し、orchestrator候補と同じ仕事を観察します。その知見を、CPUでも動く100B超のローカルモデルへ移す計画でした。

4月に外部モデル連携を削除する

4月のAnthropicの方針転換で、計画を変えました。

subprocessから claude -p を自律的に呼ぶ方法に不安があり、RedditでもBANの投稿を見ました。そこでClaude / Codex連携の実装を削除しました。これは当時の私の判断です。

動いた実装を捨てるのは惜しかったものの、必要なのはorchestrationの知見だと整理しました。

taskの粒度、workerへ渡す情報、再試行で戻る失敗、設計変更が必要な失敗、reviewの時点、並列変更の統合を、自分の基盤で観測して蓄積する方針です。

Vector、Tempo、Alloy、PostgreSQLの観測テーブルへ集中しました。

同じcorrelationでplan、dispatch、worker result、tool call、token usage、task failure、review verdict、recoveryを追えるようにしました。

Grafanaでrole、task、tool call、latencyごとに表示を切り替え、処理の経緯を読むようになりました。

Grafana dashboard list for Familiar observability dashboards
Familiar 用の Grafana dashboard 群。runtime、latency、guard、tool call、MOLsEV、workflow replay などに分かれていった。
Familiar Arch Stats dashboard showing task, fulfillment, evidence, artifact, and acceptance metrics
Arch Stats。task fulfillment、evidence、artifact、acceptance pass rate を俯瞰する。

GrafanaとPostgreSQLで失敗sessionを読み、散歩中に考えた仮説を実装へ戻して再実行しました。

外部モデル連携を外したことで、実行の流れを理解し、繰り返す実験の手順を作れました。

苦手な処理をツールで補う

3月頃から、観察で見つけた苦手な処理をツールで補いました。

長いcontextの記憶、曖昧なファイル検索、実行結果の解釈、失敗の状態、次turnへ渡す情報は、モデルだけに任せると崩れやすい部分でした。

共通する問題にツールを作る方針にしました。

MCP、管理、debugを約15個作りました。作業の体感はfamiliar本体2割、ツール8割です。観測、検索、構造化、検証、復旧を補う開発でした。

モデルの内部状態は見えず、同じ入力でもcontext、temperature、直前の失敗、tool利用で結果が変わります。複数モデルの連鎖では、その違いも追う必要があります。

成功か失敗かだけでなく、toolを呼んだ理由、負荷になった情報、再試行と恒久修正の境界を確認しました。

曖昧な処理をruntime側の一定した関数へ分ける考えは、MCPツールにも使いました。

この作業で、普段の書き方も見直しました。

私は説明よりsymbol名とoutlineを重視し、テスト名からも意図が読めるコードを好みます。

名前と構成を何度も直し、読む量を減らすことを心がけています。

一方、familiarを実装するLLMにはコメントと検索用labelが必要でした。使う側に合わせてコードを整える方針です。

LLMへ渡すcontextでは、型で構造を固定することが常に有効とは限りませんでした。

繰り返す型がノイズになる場合は、動的な形で不要な情報を隠します。普段は避ける形でも、この用途では関心を分けられました。

Gitea activity view showing familiar SDK repositories and agent commits
Gitea activity.
Gitea contributors view for the familiar repository
Contributors。agent、ksh3、Claude、familiar の commit 分布。後半はほとんどがclaude|codexでレビュー検証が僕の役割だった。
Gitea code frequency chart for the familiar repository
Code Frequency。5月に仕組み、構造が確立して、PDCAが周り始めた。 additions/deletions が大きく跳ねた。
Gitea recent commits chart for the familiar repository
Recent Commits。3月以降に commit activity が立ち上がり、5月にピークを迎えた。

学習と世代管理は今後の作業です。数ヶ月の開発を一区切りとして記録しました。ローカルLLMを使うAIシステム開発の基盤として、引き続き整備する予定です。