コンポーネント一覧
コンポーネント一覧¶
このページでは、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_dataはkwargsから取得) |
| 出力 | 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を参照して、状態が変化したときのみメッセージを追加できます。
DialogHistory(ダイアログ履歴)¶
会話履歴を取得してリスト形式で出力するコンポーネントです。
| 項目 | 内容 |
|---|---|
| 入力 | 任意(トリガーとして使用) |
| 出力 | history(list[dict]形式) |
| パススルー | ✗ |
| 処理タイミング | すべての入力がis_last=Trueになった時点 |
設定項目:
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
dialog_history_config | dict | 下記参照 | 履歴取得の設定 |
dialog_history_configのデフォルト:
出力形式:
[
{"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の例:
Skip()による条件付き更新
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辞書が自動的に提供され、関数呼び出し間で状態を保持できます。
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) |
| パススルー | ✗ |
| 処理タイミング | historyがis_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}}" | テキスト取得式 |
出力形式:
句読点での自動区切り
テキストは30文字以上のまとまりで、句読点(。!?など)で区切られて送信されます。
values.decoration_id / values.voice_id の自動待機
decoration_idやvoice_idの設定でvalues.decoration_idやvalues.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形式)の例:
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形式)の例:
RAGとの違い:
| 項目 | RAG | Classifier |
|---|---|---|
| 出力 | ドキュメントのリスト | 単一のクラス名 |
| 用途 | 関連情報の検索 | カテゴリ分類 |
| アルゴリズム | コサイン類似度 | NCA + KNN |
Group(グループ)¶
Groupは、複数のItemを組み合わせて再利用可能なコンポーネントとして扱う機能です。
Group専用のItem(UI上の仮想エレメント)¶
エディタ上でGroupを作成する際、以下の仮想エレメントを使用してグループの入口と出口を定義します。
| Item | 機能 |
|---|---|
| GroupIn | Groupの処理開始点。前のItemからの流れとデータを受け取る |
| GroupOut | Groupからの出力点。Group外へデータを渡す |
GroupIn/GroupOutについて
GroupInとGroupOutはエディタUI上で使用される仮想エレメントです。実際の処理時には、グループ内のentryとexitで指定された実際のコンポーネントに置き換えられます。
環境変数¶
Groupでは、グループ専用の環境変数を設定できます。
使用例:
同じGroupを複数箇所で使い、環境変数に異なる値を設定することで、異なる挙動を実現できます。