コンテンツにスキップ

コンポーネント一覧

コンポーネント一覧

このページでは、Marionetteで利用できるすべてのコンポーネント(Item)について、入力・出力・機能・処理タイミングをまとめています。


コンポーネント一覧(サマリ表)

コンポーネント 機能 入力 出力 パススルー 処理タイミング
Entry ドラマの開始点 なし(message_data data 即時
DialogAdd 会話履歴への追加 role, text, meta なし is_last=True
DialogHistory 会話履歴の取得 任意 history is_last=True
StateSet 状態の設定 任意 なし once/realtime
Gate 条件付きパススルー 任意 output_statesで定義 triggerがTrue時
SelfTrigger 自己トリガー(連続起動) 任意 なし triggerがTrue時
EventResponse クライアントへの送信 任意 なし once/realtime
LambdaFunc カスタム処理の実行 任意 関数定義による gate/realtime/immediate
PublicLLM 外部LLM呼び出し prompt(設定による) response is_last=True
GeppettoLLM キャラクターLLM呼び出し history response is_last=True
SystemLLM システムLLM呼び出し prompt(設定による) response is_last=True
TTS3 音声合成 text_stream(設定による) audio ストリーミング
RAG ドキュメント検索 input_template(設定による) chunks once/realtime
Classifier テキスト分類 input_template(設定による) classification once/realtime
Parser パターン切り出し text(設定による) patternsで定義 リアルタイム

パススルーとは

パススルー とは、入力valuesをそのまま次のコンポーネントに転送する機能です。パススルーが「✓」のコンポーネントでは、入力されたすべてのvaluesが出力にも含まれます。


処理タイミングについて

各コンポーネントは、is_lastフラグに応じて処理タイミングを制御できます。詳細はストリーミングによる高速化を参照してください。

タイミング 動作 用途
is_last=True すべての入力が確定してから処理 完全なデータが必要な場合
realtime 入力が更新されるたびに処理 低レイテンシが必要な場合
once 一度だけ処理 状態の初期化など
immediate 即時実行(入力を待たない) 初期化処理
gate 指定した値がすべて確定してから処理 特定の値を待つ場合

各コンポーネントの詳細

Entry(エントリー)

ドラマの開始点となる特殊なコンポーネントです。event.triggerからの情報を受け取り、ドラマの処理を開始します。

項目 内容
入力 なし(message_datakwargsから取得)
出力 data(デフォルト)、output_itemsで設定可能
パススルー
処理タイミング 即時(トリガー受信時)

設定項目:

パラメータ デフォルト 説明
output_items dict {"data": "lambda message_data: message_data"} 出力項目の定義
# output_itemsの例
{
  "data": "lambda message_data: message_data",
  "reason": "lambda message_data: message_data.get('reason', '')"
}

DialogAdd(ダイアログ追加)

会話履歴にエントリを追加するコンポーネントです。

項目 内容
入力 role, text, meta(すべてオプション、設定値で補完)
出力 なし(追加したエントリ情報は転送)
パススルー ✓(すべてのvaluesを転送)
処理タイミング すべての入力がis_last=Trueになった時点

設定項目:

パラメータ デフォルト 説明
role str "assistant" 会話のロール
text str "{{values.response}}" 会話のテキスト
meta str/dict "lambda _: {}" メタ情報
condition str "lambda: True" 追加条件(prev_states参照可能)

conditionでprev_statesを使用

conditionではprev_statesを参照して、状態が変化したときのみメッセージを追加できます。

# phaseが変化したときのみ追加
lambda _: prev_states and prev_states.get('conversation', {}).get('phase') != states.conversation.phase


DialogHistory(ダイアログ履歴)

会話履歴を取得してリスト形式で出力するコンポーネントです。

項目 内容
入力 任意(トリガーとして使用)
出力 history(list[dict]形式)
パススルー
処理タイミング すべての入力がis_last=Trueになった時点

設定項目:

パラメータ デフォルト 説明
dialog_history_config dict 下記参照 履歴取得の設定

dialog_history_configのデフォルト:

{
  "role_filter": ["user*", "assistant"],
  "max_history_items": 10,
  "delete_history_steps": 5
}

出力形式:

[
  {"role": "user", "text": "こんにちは", "meta": None},
  {"role": "assistant", "text": "こんにちは!", "meta": {"emotion": "happy"}}
]


StateSet(状態設定)

状態(States)を更新するコンポーネントです。

項目 内容
入力 任意(式で参照可能)
出力 なし
パススルー ✓(すべてのvaluesを転送)
処理タイミング mode設定による(once/realtime

設定項目:

パラメータ デフォルト 説明
mode str "realtime" once: 一括更新、realtime: 随時更新
update_states dict {} 状態更新の定義

update_statesの例:

{
  "chain.count": "lambda: values.count + 1",
  "user.name": "{{ values.name }}"
}

Skip()による条件付き更新

Skip()を返すと、その状態更新をスキップできます。

# 値が空の場合は更新をスキップ
"user.name": "lambda: values.name if values.name else Skip()"


Gate(ゲート)

条件がTrueになった時点でメッセージをパススルーするコンポーネントです。

項目 内容
入力 任意(triggerで評価)
出力 output_statesで定義した値
パススルー ✓(トリガーがTrue時のみ)
処理タイミング triggerがTrueになった時点

設定項目:

パラメータ デフォルト 説明
trigger str "lambda: True" パススルー条件
output_states dict {"data": "lambda: values.data"} 出力設定

triggerの例:

# ステータスが'ready'になったらパススルー
lambda: values.status == 'ready'

# 30秒経過したらパススルー
lambda: (time.time() - (states.start_timestamp or 0)) >= 30

# prev_statesで状態変化を検出
lambda: prev_states and prev_states.conversation.phase != states.conversation.phase

Gateが閉じている場合

トリガーがFalseの場合、そのGate以降のコンポーネントは実行されません。


SelfTrigger(セルフトリガー)

同じドラマを繰り返し起動するためのコンポーネントです。ユーザー入力なしで自動的に連続対話を行う場合などに使用します。

項目 内容
入力 任意(triggerで評価)
出力 なし
パススルー ✓(すべてのvaluesを転送)
処理タイミング triggerがTrueになった時点

設定項目:

パラメータ デフォルト 説明
trigger str "lambda: True" トリガー条件
message_data str "lambda: {}" 次のトリガーに渡すデータ
wait_time str "0.0" トリガー前の待機時間(秒)
execution_mode str "continue_immediately" 実行モード

execution_modeの種類:

mode 動作 用途
continue_immediately 現在のツリー処理を継続しながら次をトリガー 最速
wait_for_completion 現在のツリーの完了を待ってからトリガー リソースリーク防止
stop_and_execute 現在のツリーを停止して次をトリガー 割り込み処理

triggerの例:

# カウンターが5未満の場合にトリガー
lambda: int(states.counter or 0) < 5

# should_continueフラグがTrueの場合にトリガー
lambda: states.should_continue == True

message_dataの例:

# 理由とカウンターを渡す
lambda: {'reason': 'self_trigger', 'count': int(states.counter or 0)}

グループ内では使用不可

SelfTriggerはメインフローでのみ使用できます。グループ内に配置するとエラーになります。

詳細な使い方

SelfTriggerの活用方法については、セルフトリガの活用を参照してください。


EventResponse(イベントレスポンス)

WebSocketを通じてクライアントにメッセージを送信するコンポーネントです。

項目 内容
入力 任意(fnで変換)
出力 なし
パススルー ✓(すべてのvaluesを転送)
処理タイミング mode設定による

設定項目:

パラメータ デフォルト 説明
fn dict {"text": "{{values.response}}"} 送信項目の定義
mode str "realtime(incremental)" 送信タイミング

modeの種類:

mode 動作 用途
once is_last=Trueで一度だけ送信 最終結果の送信
realtime(all) 更新ごとに全体を送信 テキストストリーミング
realtime(incremental) 更新ごとに差分を送信 音声チャンク送信

LambdaFunc(ラムダ関数)

任意のカスタム関数を実行するコンポーネントです。

項目 内容
入力 任意(関数内でinput_message.valuesとしてアクセス)
出力 関数定義による
パススルー
処理タイミング process_mode設定による

設定項目:

パラメータ デフォルト 説明
func str 必須 実行する関数(async def形式)
gates list [] ゲートとなるvaluesのキー
process_mode str "gate" 処理モード

process_modeの種類:

mode 動作 用途
gate すべてのゲートがis_last=Trueで実行 完全なデータが必要な処理
realtime ゲートの値が更新されるたびに実行 ストリーミング処理
immediate 即時実行 初期化処理

関数の基本形:

async def my_func(input_message, output_message):
    # 入力値を取得
    text = input_message.values.response.x

    # 処理を実行
    processed = text.upper()

    # 出力(is_lastを適切に設定)
    await output_message.update('result', processed, is_last=True)

realtimeモードでのbuffer

realtimeモードでは、buffer辞書が自動的に提供され、関数呼び出し間で状態を保持できます。

if 'count' not in buffer:
    buffer['count'] = 0
buffer['count'] += 1

Continue()とBreak()

realtimeモードでは、Continue()Break()を使用してループを制御できます。

  • Continue(): 現在のイテレーションをスキップ
  • Break(): ループを終了

PublicLLM(パブリックLLM)

外部LLMサービス(OpenAI、Anthropic、Gemini)を呼び出すコンポーネントです。

項目 内容
入力 prompt設定で評価されるテンプレート
出力 response(str または dict)
パススルー
処理タイミング すべての入力がis_last=Trueになった時点

設定項目:

パラメータ デフォルト 説明
provider str "openai" プロバイダー(openai/anthropic/gemini)
model str "gpt-4o-mini" モデル名
prompt str 必須 プロンプト(Jinja2テンプレート)
system_prompt str None システムプロンプト
streaming bool True ストリーミングモード
temperature float 0.7 温度パラメータ
max_tokens int 64 最大トークン数
api_key str "${OPENAI_API_KEY}" APIキー
response_schema dict None 構造化出力スキーマ

Web検索機能 (Geminiのみ)

モデル名の末尾に:WebSearchを付けると、Google Search Grounding(Web検索に基づいた回答生成)が有効になります。
例: gemini-1.5-flash:WebSearch

利用可能なGeminiモデル

以下のGeminiモデルが利用可能です:
- gemini-1.5-pro: Gemini 1.5 Pro(高性能、長いコンテキスト)
- gemini-1.5-flash: Gemini 1.5 Flash(高速・低コスト、推奨)
- gemini-2.5-pro: Gemini 2.5 Pro(最新の高性能モデル)
- gemini-2.5-flash: Gemini 2.5 Flash(最新の高速モデル)
- gemini-2.5-flash-lite: Gemini 2.5 Flash Lite(コスト最適化版)
- gemini-2.0-flash-exp: Gemini 2.0 Flash(実験版)
- gemini-3-pro-preview: Gemini 3 Pro(プレビュー版、最高性能、複雑な推論タスクに最適)

モデル名の末尾に:WebSearchを付けるとWeb検索機能が有効になります(例: gemini-1.5-flash:WebSearch)。

Geminiプロバイダーのストリーミング制限

現状、Geminiプロバイダーは 非ストリーミングモードのみ正式サポート されています。

  • provider: "gemini" を指定した場合、設定で streaming: true としても、内部的には自動的に False(非ストリーミング)に切り替わります。
  • :WebSearch 付きモデル(例: gemini-1.5-flash:WebSearch)も同様に、非ストリーミングでのみ動作 します。
  • ストリーミング応答が必要な場合は、OpenAI や Anthropic など、他プロバイダーの利用を検討してください。

ストリーミングと構造化出力:

streaming response_schema 動作
True None チャンクごとにresponseを更新
False None 一度だけresponseを更新
任意 設定あり 構造化データを一度だけ出力(streamingは強制False)

GeppettoLLM(キャラクターLLM)

Geppetto LLMサービスを呼び出すコンポーネントです。キャラクター対話用に最適化されています。

項目 内容
入力 history(DialogHistoryの出力形式)
出力 response(str)
パススルー
処理タイミング historyis_last=Trueになった時点

設定項目:

パラメータ デフォルト 説明
endpoint str 必須 LLMエンドポイントURL
assistant_name str "" アシスタント名(Jinja2テンプレート)
scene str "" シーン設定(Jinja2テンプレート)
character_token str "" キャラクタートークン(Jinja2テンプレート)
history_format str 自動変換lambda 履歴フォーマット(lambda式)
temperature float 0.15 温度パラメータ
max_tokens int 128 最大トークン数
streaming bool True ストリーミングモード
gcp_token str "${LLM_GCP_TOKEN}" GCPトークン
llm_token str "${LLM_CHARA_TOKEN}" キャラクターLLMトークン

特徴:

  • SSE(Server-Sent Events)プロトコルによるストリーミング
  • Sticky Sessionによるセッション維持(KVキャッシュ活用)
  • ループ検出機能(同じ応答が繰り返される場合に検出・対処)
  • post_cutによる自動停止(stop_wordsの部分一致検出)

SystemLLM(システムLLM)

システム用途のLLMサービスを呼び出すコンポーネントです。

項目 内容
入力 すべてのvalues(promptテンプレートで評価)
出力 response(str)
パススルー
処理タイミング すべての入力がis_last=Trueになった時点

設定項目:

パラメータ デフォルト 説明
endpoint str 必須 LLMエンドポイントURL
api_key str "${PRIVATE_LLM_API_KEY}" APIキー
tokenizer_model_id str None トークナイザーモデルID
prompt str "" プロンプト(Jinja2テンプレート)
temperature float 0.7 温度パラメータ
max_tokens int 128 最大トークン数

GeppettoLLMとの違い:

項目 GeppettoLLM SystemLLM
用途 キャラクター対話 システム処理
入力 history(履歴形式) prompt(テンプレート)
温度デフォルト 0.15(安定) 0.7(バランス)
認証 GCP+キャラクタートークン APIキー

TTS3(音声合成)

テキストを音声に変換するコンポーネントです。

項目 内容
入力 text_stream設定で評価されるテキスト
出力 audio(音声チャンクのリスト)
パススルー
処理タイミング ストリーミング(テキスト更新ごと)

設定項目:

パラメータ デフォルト 説明
endpoint str "wss://tts3.spiral-ai-app.com/ws/tts" TTSエンドポイント
api_key str "${TTS3_API_KEY}" APIキー
voice_id str Jinja2式 話者ID
decoration_id str Jinja2式 デコレーションID
text_stream str "{{values.response}}" テキスト取得式

出力形式:

{
    "audio": "base64エンコードされた音声データ",
    "chunk_id": 0,  # チャンクID
    "is_last": False  # 最後のチャンクか
}

句読点での自動区切り

テキストは30文字以上のまとまりで、句読点(。!?など)で区切られて送信されます。

values.decoration_id / values.voice_id の自動待機

decoration_idvoice_idの設定でvalues.decoration_idvalues.voice_idを参照している場合、TTS3Chainはその値が確定する(is_last=Trueになる)まで**自動的に待機**します。

これにより、LambdaFuncで感情タグを分離してから音声合成を開始することができます。

# この設定の場合、values.decoration_idの確定を待ってから音声合成開始
decoration_id: "{{ values.decoration_id if values.decoration_id else 'neutral' }}"

詳細はストリーミングによる高速化の「例4: 感情タグを分離してTTSに渡す」を参照してください。


RAG(ドキュメント検索)

キーワードマッチングまたはEmbedding類似度検索を使用してドキュメントを検索するコンポーネントです。

項目 内容
入力 input_template設定で評価されるテキスト
出力 chunks(list[str]形式)
パススルー
処理タイミング mode設定による(once/realtime

設定項目:

パラメータ デフォルト 説明
documents str 必須 ドキュメント定義(CSV形式)
search_method str "embedding: fast" 検索方式(下記参照)
threshold float None しきい値(0.0〜1.0)
k int 3 取得件数
mode str "once" 処理モード
input_template str "{{ values.response }}" 入力テンプレート

documents(CSV形式)の例:

"doc1", "Pythonはプログラミング言語です"
"doc2", "JavaScriptはWeb開発で使われます"
"doc3", "Rustはシステムプログラミング言語です"

検索方式(search_method)の選択:

検索方式 特徴 推奨用途
keyword: full-match 完全一致(部分文字列検索)、高速 正確なキーワードマッチが必要な場合
keyword: partial-match 編集距離による類似検索(rapidfuzz使用)、高速 誤字脱字に強い検索が必要な場合
embedding: fast 最速のEmbedding検索(4,229 pred/sec) リアルタイム処理
embedding: normal バランス型Embedding検索 一般用途
embedding: slow 最高精度Embedding検索(49.74%) 高精度検索

keyword検索について

keyword: full-match は、入力テキスト内にキーワード(検索キー)が完全に含まれているかをチェックします。embedding計算が不要なため高速です。

keyword: partial-match は、rapidfuzzライブラリを使用した編集距離ベースの類似検索です。キーワード長で正規化した類似度(0.0〜1.0)を計算します。「地球の自転」というキーワードに対して「地球が回転している」のような類似表現もマッチします。

しきい値(threshold)の設定

  • keyword: full-match: 一致=1.0、不一致=0.0(実質フィルタリング不要)
  • keyword: partial-match: 編集距離に基づく類似度(例: 0.6 = 60%以上の類似度)
  • embedding検索: コサイン類似度(例: 0.7 = 70%以上の類似度)

Classifier(テキスト分類)

NCA(Neighborhood Component Analysis)とKNNを使用してテキストを分類するコンポーネントです。

項目 内容
入力 input_template設定で評価されるテキスト
出力 classification(予測されたクラス名)
パススルー
処理タイミング mode設定による(once/realtime

設定項目:

パラメータ デフォルト 説明
classes str 必須 クラス定義(CSV形式)
embedding_model str "hotchpotch/static-embedding-japanese" Embeddingモデル
k int 3 KNNの最近傍数
nca_components int 0(自動) NCA次元数(0で自動設定)
mode str "once" 処理モード
input_template str "{{ values.response }}" 入力テンプレート

classes(CSV形式)の例:

"greeting", "こんにちは"
"greeting", "おはよう"
"greeting", "こんばんは"
"farewell", "さようなら"
"farewell", "またね"

RAGとの違い:

項目 RAG Classifier
出力 ドキュメントのリスト 単一のクラス名
用途 関連情報の検索 カテゴリ分類
アルゴリズム コサイン類似度 NCA + KNN

Parser(パーサー)

ストリーミング入力から指定したパターンを切り出し、複数の出力変数に分離するコンポーネントです。
LLMの出力を感情・発話・アクションなどに分けてTTSや動作制御に渡す場合に便利です。

項目 内容
入力 textinput_keyで変更可能)
出力 patternsで定義された各出力変数
パススルー
処理タイミング リアルタイム(ストリーミング対応)

設定項目:

パラメータ デフォルト 説明
input_key str "text" 入力値のキー名
patterns list なし 抽出パターンのリスト(必須)

patternsの形式:

[
  {"start": "開始文字列", "end": "終了文字列", "output": "出力変数名"}
]

特殊な値:

startでの意味 endでの意味
"" (空文字列) **行頭**にマッチ 行末(改行または入力終端)にマッチ

使用例1: 括弧パターン

LLMが 【感情】発話テキスト(アクション) の形式で出力する場合:

[
  {"start": "【", "end": "】", "output": "emotion"},
  {"start": "】", "end": "(", "output": "speech"},
  {"start": "(", "end": ")", "output": "action"}
]

入力:

【嬉しい】こんにちは!元気ですか?(手を振る)

出力:
- emotion: "嬉しい"
- speech: "こんにちは!元気ですか?"
- action: "手を振る"

使用例2: タグパターン

LLMが [emotion:xxx][voice:yyy]テキスト の形式で出力する場合:

[
  {"start": "[emotion:", "end": "]", "output": "emotion"},
  {"start": "[Emotion:", "end": "]", "output": "emotion"},
  {"start": "[voice:", "end": "]", "output": "voice"}
]

大文字小文字の揺れ対応

複数のパターンで同じoutput名を指定できます。これにより、LLMが[emotion:][Emotion:]のどちらを出力しても、同じemotion変数に出力されます。

使用例3: 行頭・行末パターン

各行を個別に出力する場合:

[
  {"start": "", "end": "", "output": "line"}
]

入力:

行1のテキスト
行2のテキスト
行3のテキスト

出力:
- line: "行1のテキスト""行2のテキスト""行3のテキスト" と順次出力

ストリーミング対応

Parserはストリーミング入力に対応しています:

  • 入力が少しずつ来ても正しくパースします
  • 開始文字列を検出したら、対応する出力変数へのストリーミング出力を開始します
  • 終了文字列を検出したら、is_last=Trueで出力を確定します

デッドロック防止

入力のis_last=Trueを受信した時点で、定義されたすべての出力変数に対してis_last=Trueを送信します。
これにより、パターンが崩れた場合でも後続のコンポーネントがデッドロックすることを防ぎます。

ケース 動作
正常終了 各パターンの終了文字列検出時にis_last=True
終了文字列なし 入力終了時にバッファ内容をそのまま出力してis_last=True
開始文字列なし 空文字列 + is_last=Trueを送信

Group(グループ)

Groupは、複数のItemを組み合わせて再利用可能なコンポーネントとして扱う機能です。

Group専用のItem(UI上の仮想エレメント)

エディタ上でGroupを作成する際、以下の仮想エレメントを使用してグループの入口と出口を定義します。

Item 機能
GroupIn Groupの処理開始点。前のItemからの流れとデータを受け取る
GroupOut Groupからの出力点。Group外へデータを渡す

GroupIn/GroupOutについて

GroupInとGroupOutはエディタUI上で使用される仮想エレメントです。実際の処理時には、グループ内のentryexitで指定された実際のコンポーネントに置き換えられます。

環境変数

Groupでは、グループ専用の環境変数を設定できます。

# 自由式の中で参照
${変数名}

使用例:
同じGroupを複数箇所で使い、環境変数に異なる値を設定することで、異なる挙動を実現できます。

# Group1の設定
ai_name = "Tsuyoshi"

# Group2の設定(同じGroup)
ai_name = "Koichi"