コンテンツにスキップ

コンポーネント一覧

コンポーネント一覧

このページでは、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時
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

パススルーとは

パススルー とは、入力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以降のコンポーネントは実行されません。


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

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

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形式)
embedding_model str "hotchpotch/static-embedding-japanese" Embeddingモデル
k int 3 取得件数
mode str "once" 処理モード
input_template str "{{ values.response }}" 入力テンプレート

documents(CSV形式)の例:

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

Embeddingモデルの選択:

モデル 特徴 推奨用途
hotchpotch/static-embedding-japanese 最速(4,229 pred/sec) リアルタイム処理
sbintuitions/modernbert-ja-130m 最高精度(49.74%) 高精度検索
intfloat/multilingual-e5-small バランス型 一般用途

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

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"