Almide Agent Framework — 抽象スケッチ (仮)

[仮版・thin sketch] まだ実装に入らない。aitube-studio と homullus が並走で叩くであろう共通抽象を、抽出フェーズに入る前に薄く列挙しておく planning ノート。各抽象の境界・名前・粒度・存続可否はすべて検討中。意思決定の固定ではなく 「抽出時に何を見るか」のチェックリスト として書く。

Almide における Rails 等価物(名前 TBD)の構成要素を、現場 2 つの重力場の交点として薄くスケッチする。詳細設計には踏み込まない。

重力場の 2 軸

homullusAITubeStudio
形態CLI agent runtimeリアルタイム配信 + 制御サーフェス
駆動形単発リクエスト → ツール → 完了永続ループ + フレーム更新 + 外部 protocol
叩く層agent corecharacter + realtime
失敗単位コマンド失敗 → やり直しフレーム落ち / 接続切断 / 同期ズレ
状態寿命REPL session(短命)配信単位 + 永続 persona(長命)

両者の 交点 にある抽象だけを framework に昇格させる。片方にしか効かないものは domain code として留める。

候補抽象 7 つ

flowchart TB
    subgraph L["framework 候補抽象"]
      L0[L0. message envelope]
      L1[L1. provider abstraction]
      L2[L2. agent loop]
      L3[L3. dispatch surface]
      L4[L4. state model]
      L5[L5. permission / safety]
      L6[L6. observability]
      L7[L7. testing harness]
    end
    L --> Homu[homullus<br/>agent core 現場]
    L --> Studio[AITubeStudio<br/>character realtime 現場]

L0. message envelope

LLM 入出力を載せる型付きエンベロープ。Message / ToolCall / ToolResult / Event。

L1. provider abstraction

LLM プロバイダ(Anthropic / OpenAI / Groq / Bedrock / …)の差を吸収する層。

L2. agent loop

state → action → state の再帰関数。action は「LLM 呼び出し」「dispatch」「exit」のどれか。

L3. dispatch surface

名前 + 入力スキーマ + ハンドラ + 戻り値型のマッピング。

L4. state model

不変な状態スレッディング。グローバル変数なし、var 明示。

L5. permission / safety

action に対する認可と危険パターン検出。

L6. observability

構造化されたトレースイベント。

L7. testing harness

scripted provider + scripted dispatch によるオフライン再現テスト。

抽象が成立しない可能性のある緊張点(重要)

framework に昇格させる前に、現場 2 つで 本当に同じ shape か を確かめる必要がある。先回りで見えている怪しい点:

  1. loop の駆動源: pull(LLM 応答待ち)vs push(外部イベント駆動)。同じ loop primitive で吸収できるか不明
  2. 失敗の意味論: homullus の「失敗 = やり直し or ユーザーに返す」vs AITubeStudio の「失敗 = フレーム落ちでも続行 / 接続切断は復旧」。Result[T, E] で両方表現できるが、意味付けは異なる
  3. realtime 制約: GC なし・低レイテンシは Almide 基盤の強みだが、framework がそこを 横断的に保証 する API を持つかどうか(タイミング契約 / バックプレッシャ / ノンブロッキング保証)

これらが framework 抽出時に観察すべきチェックポイント。

名前を決めない

framework name は意図的に未定のまま据え置く。理由:

名前選定は AITubeStudio v0 が動き、homullus との共通抽象が実コードで見えた段階 に持ち越す。

組織構造(将来)— Rails の分離パターン

Rails は github.com/rails という 専用 organization を持つ(rails/rails をフラグシップ、sprockets / turbolinks / spring 等の component gem も同 org で運用)。Basecamp は別組織 github.com/basecamp。フレームワークと起源プロダクトで org が分離されている のが Rails が community framework として定着した条件の一つ。

Almide エコシステムでも、framework が名前を持つ段階で同じ分離が必要になる:

層Web 時代AI エージェント時代
言語の orggithub.com/rubygithub.com/almide(既存)
起源プロダクトの orggithub.com/basecampgithub.com/Aid-On(既存)
抽出された framework の orggithub.com/railsTBD(framework 名確定時に新設予定)

org 分離が概念的・実務的に持つ意味:

この分離は framework がコミュニティ財として機能するための前提条件。homullus が github.com/almide 配下にいる現状はあくまで testbed の位置づけで、抽出された framework は Aid-On でも almide でもない第三の org に置くのが Rails 流儀に沿う。

実装に入らない理由

このノートは設計仕様ではなく 観察ガイド。実コードでの抽象抽出は次の条件が揃った後に着手する:

  1. AITubeStudio v0 が現実に動いている(aitube-studio 参照)
  2. homullus が daily driver として安定(既に達成)
  3. 上記「緊張点」のうち少なくとも 1 つに、実コード由来の答えが出ている

planning ノートを実装に転化する圧力は意識的に避ける。抽象は早期に固定すると現場の都合に縛られる という Rails 抽出が示した教訓を、ここでも踏襲する。

押さえどころ(カード化候補)

Graph