コンテンツにスキップ
lait
Esc
↑↓移動↵開く⌘Jプレビュー
このページの内容

エージェント Markdown ファイル(agent.md)

frontmatter とシステムプロンプトからエージェントを定義する方法。

lait agent run <FILE> <INPUT> サブコマンドで、Markdown ファイル1つでエージェントを定義・ 実行できます。ファイルは YAML の frontmatter(--- で区切られたブロック)とそれに続く Markdown 本文で構成され、本文がシステムプロンプトのテンプレートになります。frontmatter の 補完・検証には lait schema agent が出力する JSON Schema を使えます。

---
name: city-fact
description: 文章から都市名と人口を抽出する
model: local
reasoning_effort: medium
temperature: 0.7
top_p: 0.9
max_tokens: 512
input_schema:
  type: object
  properties:
    text: { type: string }
  required: [text]
output_schema:
  type: object
  properties:
    city: { type: string }
    population: { type: integer }
  required: [city, population]
  additionalProperties: false
schema_name: city_fact
---
次の文章から都市名と人口を JSON で抽出してください。

{{ input.text }}
cargo run -- agent run city-fact.md '{"text":"東京の人口は約1400万人です。"}'

<FILE> はパスの代わりに lait.config.yml の agents: に登録した名前(または lait deps で取り込んだ agent 依存の名前)でも指定できます。lait run の workflows: 解決と同じく、実在するファイルがあればそちらが優先され、存在しない場合にだけ agents: から名前解決されます。

ファイルの構成とパス

ファイルは1行目が必ず --- で始まり、次に現れる --- 行までが frontmatter(YAML)、 それ以降が本文(システムプロンプトのテンプレート)になります。

input_schema/output_schema に {file: <パス>} で指定したスキーマファイルは、この エージェントファイルのディレクトリ からの相対パスとして解決されます。エージェントとスキーマを 同じ場所に置けば、どこから実行しても同じように読み込めます。

frontmatter のモデル・サンプリング関連フィールドは次のとおりです。

フィールド 説明
model 使用するモデル(alias またはモデル ID)。
reasoning_effort 推論 effort レベル。
temperature サンプリング温度(0.0〜2.0)。
top_p nucleus sampling の確率質量(0.0〜1.0)。
max_tokens 最大出力トークン数(1以上)。

いずれも省略可能で、lait.config.yml の default: にフォールバックします。直接 lait agent run を実行する場合、CLI の --model などでエージェントファイルの値を上書きする ことはできません。temperature・top_p・max_tokens は、範囲外の値を指定するとファイルの 読み込み時点でエラーになります。

入力の渡し方

INPUT はまず JSON としてパースされます。パースに成功した場合はオブジェクト・配列・値が テンプレートに渡され、失敗した場合は文字列としてそのまま渡されます。レンダリングされた本文は system ロールのメッセージとして送信され、INPUT(元の生テキスト)は別途 user ロールの メッセージとして送信されます。

入力の検証(input_schema)

input_schema / output_schema には、JSON Schema の本体を直接書くか、{file: <パス>} で JSON ファイルを指定します(file だけを持つマッピングがファイル参照、それ以外はスキーマ本体です)。

input_schema を指定すると、INPUT がスキーマの type(type: object なら JSON オブジェクト) に合うこと、required に列挙したフィールドがすべて存在すること、さらに properties/items で宣言したフィールドの type/enum やネストしたオブジェクト・配列の中身までを実行前に 再帰的に検証します。format・pattern・数値の範囲・additionalProperties・ oneOf/anyOf/allOf・$ref は検証しません。検証に失敗するとモデルを呼び出さずにエラーになります。

テンプレートの書き方

本文のシステムプロンプトは handlebars 構文です。

  • {{ input.city }} のようにドット区切りでフィールドにアクセスできます。
  • オブジェクトや配列全体を JSON テキストとして埋め込むには、{{ json input }} または {{ json input.field }} を使います。
  • {{ input }} は値のテキスト形式を出力します(文字列はそのまま、オブジェクト・配列などは コンパクトな JSON)。{{ json input }} は文字列も引用符付きの JSON として出力します。
  • テンプレート中の未定義の変数を参照した場合もエラーになります。

構造化出力(output_schema)

output_schema を指定すると Structured Outputs(response_format の json_schema、strict モード)を要求します。省略すると通常のテキスト応答です。schema_name はそのスキーマ名で、 output_schema と一緒にだけ指定でき、省略時は structured_output です。

ワークフローの agent: ステップとして実行した場合、output_schema を持つエージェントの結果は パース済みの JSON(スキーマで検証済み)として次のステップに渡ります。

MCP ツールの利用

frontmatter に mcp:(lait.config.yml の mcp_servers: エントリ名のリスト)と、任意で max_tool_rounds:(既定 8)を指定すると、その agent の呼び出しに MCP ツールが渡されます。

---
model: local
mcp: [filesystem]
max_tool_rounds: 8
---
{{ input.task }} を実行してください。

mcp: を省略した場合は lait.config.yml の default.mcp にフォールバックします。詳しい仕組みは MCP サーバーのツールを使う を参照してください。

スキルの利用

frontmatter に skills:(lait.config.yml の skills: エントリ名のリスト)を指定すると、 その内容がシステムプロンプトテンプレートのレンダリング結果の末尾に --- 区切りで追記されます。

---
model: local
skills: [code-review]
---
次の差分をレビューしてください。

{{ input.diff }}

skills: を省略した場合は lait.config.yml の default.skills にフォールバックします。詳しい 仕組みは スキルを使う を参照してください。

サブエージェントの利用

frontmatter に subagents:(lait.config.yml の agents: エントリ名のリスト)を指定すると、 その名前で登録されたエージェント Markdown ファイルが、この agent のモデル自身が呼び出すかどうか 判断できる「サブエージェント」ツールとして渡されます。MCP ツール(mcp:)と同じ tool loop の 仕組みに乗るため、モデルがツール呼び出しを返すたびに lait がそのサブエージェントを実行し、結果を モデルに返す、というやり取りを最終回答が出るまで自動で繰り返します。

---
model: local
subagents: [researcher]
---
{{ input.task }} について、必要であれば researcher に調査を任せてください。

subagents: を省略した場合は lait.config.yml の default.subagents にフォールバックします。 詳しい仕組みは サブエージェントを使う を参照してください。

カスタムシェルツールの利用

frontmatter に tools:(lait.config.yml の tools: エントリ名のリスト)を指定すると、 対応するローカルコマンドが呼び出し可能なツールとして渡されます。mcp:/subagents: と同じ tool loop の仕組みに乗ります。

---
model: local
tools: [ripgrep]
---
{{ input.task }} を実行してください。

tools: を省略した場合は lait.config.yml の default.tools にフォールバックします。詳しい 仕組みは カスタムシェルツールを使う を参照してください。

ワークフローからエージェントを使う

ワークフローの agent: ステップにエージェントファイルのパス(ワークフローファイルからの 相対パス)を書くと、そのファイルのシステムプロンプト・入出力スキーマ・設定を使って実行します。 ワークフローの agents: に同じ形式のエージェントを直接定義することもできます(本文の代わりに system: を書きます)。

# workflow.yml
default:
  model: local
agents:
  translator:
    model: cloud
    system: "次の文章を英訳してください。"
steps:
  - id: city
    agent: agents/city-fact.md
    output: '.city'
  - agent: translator

model/reasoning_effort/temperature/top_p/max_tokens やツール連携の設定は、ステップ → エージェント定義 → ワークフローの default: → lait.config.yml の default: の順に、それぞれ 独立してフォールバックします。ステップの入力は lait agent run の INPUT と同じくユーザー メッセージとして送られ(オブジェクトなどはコンパクトな JSON テキスト)、システムプロンプトの テンプレートからは値として {{ input.field }} でアクセスできます。

ワークフローのステップとして実行した場合、システムプロンプトからは {{ steps.<id> }}(記録済みの ステップの値)・{{ inputs.<name> }}(ワークフローの入力)・{{ loop.index }} も参照できます (詳細は ワークフロー(workflow.yml) を参照)。 lait agent run から直接実行したときやサブエージェントとして呼び出されたときは、これらは 使えません。

関連: ワークフロー(workflow.yml)、サブエージェントを使う

このページは役に立ちましたか?