Agent Framework — スコープ概念設計 (仮)

[仮版・concept design] almide-agent-framework の候補抽象 7 つのうち、どこまでを「Almide 版 Rails」として bundle するか を決めるための概念設計ノート。スコープ判断が後の抽出・命名・パッケージ分割すべての境界条件を決めるので、実コードに入る前にここを固める。

Rails が 2004 年に「Web アプリに必要なもの全部入り」を選んだのと同じ位置で、Almide 版 framework は AI エージェントに必要な何をどこまで含めるか を選ぶ必要がある。本ノートはその選択肢と判断の根拠。

なぜスコープから始めるのか

スコープが先に決まらないと:

Rails が 12 年経って後から Doctrine を書けたのは、最初に 「Web アプリ全部入り」というスコープ判断を腹を括って下した からこそ。

歴史的スコープ判断 — どこにポジションするか

FW領域含めるもの性質
Sinatra (2007)Webrouting + controller のみ最小核。DSL の薄さで勝負
Rails (2004)Webrouting / MVC / ORM / view / mail / jobs / asset / test全部入り。CoC + 統合で勝負
LangGraph (2023)AI agentstate machine + tools + persistence + checkpointsloop の構造特化
Mastra (2024)AI agentagent / workflow / memory / RAG / eval / telemetry / deployTS 陣営の Rails ポジション
? (TBD)AI agent + realtime↓本ノートで決めるAlmide 基盤からしか出せない位置

Sinatra 路線(薄い core のみ)と Rails 路線(厚い全部入り)の選択は、framework の文化を決定的に分ける。Almide 版がコミュニティ財として育つには、Rails 寄りの opinionated full-stack がふさわしいと考えている(the-almide-doctrine 全体がそれを支持する)。

スコープ候補 3 つ

A. 汎用 agent framework(Mastra と機能的に同等)

含める:

含めない: realtime / character / avatar / streaming

評価:

B. realtime agent framework(構造的差別化)

含める: A の全部 + realtime primitives

含めない: character / avatar specifics(VRM / 表情 / モーション 等)

評価:

C. 全部入り AITuber framework(Rails 級に opinionated)

含める: B の全部 + character / avatar / animation / scene primitives

評価:

推奨: B + モジュラー構成(Rails 流儀)

B(realtime agent framework) を選び、Rails の meta-gem + sub-gems パターン で構成する。

flowchart TB
    subgraph Meta["meta package(全部 bundle)"]
      Core[?-core<br/>L0/L2/L3/L4/L7]
      RT[?-realtime<br/>push driver / timing / protocol]
      Perm[?-permit<br/>L5 permission]
      Mem[?-memory<br/>L4 拡張・永続]
      Obs[?-observe<br/>L6 trace]
    end
    Almai[almai<br/>L1 provider 層・外部依存]
    Meta -.depends.-> Almai

各 sub-package は独立して使える(Rails で activerecord が actionpack 抜きで使えるのと同じ)。meta package は全部 bundle する opinionated なエントリポイント。

almai は framework に取り込まず、外部依存として参照 する。Rails が独自の HTTP クライアントを抱えなかった判断と同じ筋。

IN / OUT 一覧

framework に IN(Almide 版 Rails の責務)

カテゴリ内容
型message envelope(Message / ToolCall / Event / Result)
ループpull 駆動(LLM 応答待ち)と push 駆動(外部イベント)の両対応 agent loop
dispatchtool / command の統一 dispatch surface(name + schema + handler)
状態合成可能な immutable state、再帰 threading
認可permission resolver(事前承認 / 事後監視 / リアルタイム遮断)
memory短命 session + 長命 persistent の 2 層を扱える基本型
realtimetiming 契約 / backpressure / WebSocket protocol contract types
観測structured trace events、token usage、レイテンシ計測
テストscripted provider + scripted dispatch + scripted realtime event

framework が OUT(外部依存 or domain code)

カテゴリ行き先理由
LLM provideralmai 外部依存既に独立、再発明しない
VRM / FBX 描画AITubeStudio domain抽象化が AITuber に閉じすぎる
アニメーション pipelineAITubeStudio domain同上
表情 / リップシンクAITubeStudio domain同上
OBS / 配信統合AITubeStudio domain同上
setEmotion 等の具体 protocolAITubeStudio domain具体スキーマは domain 側

判断軸: 「homullus と AITubeStudio の両方で出てくるか」。両方で出てくれば framework に上げる。片方だけなら domain code として残す。L5 permission は両者で出てくる(homullus は Bash 危険パターン、AITubeStudio は 配信 moderation)ので IN。avatar 描画は AITubeStudio にしかないので OUT。

AITubeStudio が framework の上で組み立てるもの

framework の primitives を組み合わせて、AITubeStudio domain code として書く部分:

homullus が framework の上で組み立てるもの

両者が共通して使うのは framework の L0/L2/L3/L4/L5/L6/L7 + realtime primitives のみ。

何を入れない判断の根拠

スコープを意識的に「狭めに切る」理由:

逆に「ここまでは含める」と腹を括る理由:

次の判断ポイント

このスコープ判断が固まった後に決めるべきこと(順不同):

  1. package 分割の粒度 — sub-package を 3 つにするか 5 つにするかの細かい判断
  2. L4 state model の API — record 合成のスタイル、永続化のフックの形
  3. realtime primitives の API — push tick の入り口、timing 契約の表現方法
  4. command 系 protocol の型表現 — effect fn での dispatch をどこまで型レベルで縛るか
  5. framework 名 — スコープが固まれば名前の候補も絞られる

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

Graph