3.0 KiB
3.0 KiB
PromptComposer
テンプレートベースのプロンプト構築システム。Handlebarsテンプレートエンジンによる動的プロンプト生成。
基本使用方法
use std::sync::Arc;
use worker::prompt::{PromptComposer, PromptContext, PromptError, ResourceLoader};
struct FsLoader;
impl ResourceLoader for FsLoader {
fn load(&self, identifier: &str) -> Result<String, PromptError> {
std::fs::read_to_string(identifier)
.map_err(|e| PromptError::FileNotFound(format!("{}: {}", identifier, e)))
}
}
// 初期化
let loader = Arc::new(FsLoader);
let mut composer = PromptComposer::from_config_file("role.yaml", context, loader.clone())?;
composer.initialize_session(&messages)?;
// プロンプト構築
let messages = composer.compose(&user_messages)?;
リソースローダー
PromptComposer はテンプレート内で参照されるパーシャルや {{include_file}} の解決をクレート利用者に委ねています。
ResourceLoader トレイトを実装して、任意のストレージや命名規則に基づいて文字列を返してください。
struct MyLoader;
impl ResourceLoader for MyLoader {
fn load(&self, identifier: &str) -> Result<String, PromptError> {
match identifier.strip_prefix("#workspace/") {
Some(rest) => {
let path = std::env::current_dir()?.join(".nia").join(rest);
std::fs::read_to_string(path).map_err(|e| PromptError::FileNotFound(e.to_string()))
}
None => std::fs::read_to_string(identifier)
.map_err(|e| PromptError::FileNotFound(e.to_string())),
}
}
}
テンプレート構文
変数展開
{{workspace.project_name}} # プロジェクト名
{{workspace.project_type}} # プロジェクト種別
{{model.provider}}/{{model.model_name}} # モデル情報
{{tools_schema}} # ツールスキーマ
条件分岐
{{#if workspace.has_nia_md}}
Project info: {{workspace_content}}
{{/if}}
{{#eq workspace.project_type "Rust"}}
Focus on memory safety and performance.
{{/eq}}
繰り返し処理
{{#each tools}}
- **{{name}}**: {{description}}
{{/each}}
パーシャルテンプレート
{{> header}}
{{> coding_guidelines}}
{{> footer}}
カスタムヘルパー
include_file
外部ファイルを読み込み:
{{include_file "~/.config/nia/templates/guidelines.md"}}
workspace_content
ワークスペースのnia.md内容を取得:
{{workspace_content}}
利用可能なコンテキスト変数
workspace: プロジェクト情報(root_path、project_type、git_info等)model: LLMモデル情報(provider、model_name、capabilities)session: セッション情報(conversation_id、message_count)user_input: ユーザー入力内容tools_schema: ツール定義JSON