0.3.0: テンプレートエンジンのファイルのロードを外部化

This commit is contained in:
2025-10-24 07:37:47 +09:00
parent b494529779
commit 02667f5396
28 changed files with 569 additions and 662 deletions
+33
View File
@@ -0,0 +1,33 @@
# Release Notes - v0.3.0
**Release Date**: 2025-??-??
v0.3.0 はプロンプトリソースの解決責務を利用側へ完全に移し、ツール/フック登録の推奨フローを明確化するアップデートです。これにより、ワーカーの動作を環境ごとに柔軟に制御できるようになりました。
## Breaking Changes
- `ConfigParser::resolve_path` を削除し、`#nia/` `#workspace/` 等のプレフィックス解決をライブラリ利用者実装の `ResourceLoader` に委譲しました。
- `WorkerBuilder::build()``resource_loader(...)` が未指定の場合エラーを返すようになりました。ワーカー構築前に必ずローダーを提供してください。
## 新機能 / 仕様変更
- `PromptComposer``ResourceLoader` を必須依存として受け取り、partials や `{{include_file}}` の読み込みをすべてローダー経由で行うようになりました。
- パーシャル読み込み時にフォールバックが失敗した場合、一次/二次エラー内容を含むメッセージを返すよう改善しました。
- README とドキュメントを刷新し、推奨ワークフロー(ResourceLoader 実装 → Worker 構築 → イベント処理)を明示。`#[worker::tool]` / `#[worker::hook]` マクロを用いた登録例を追加しました。
- ユニットテスト `test_prompt_composer_uses_resource_loader` を追加し、注入されたローダーがパーシャル/include の解決に使われることを保証。
## 不具合修正
- `include_file` ヘルパーがカスタムローダーを利用せずにファイルアクセスしていた問題を修正。
- `ConfigParser` が存在しない `#nia/` プレフィックスを静的に解決しようとしていた挙動を除去し、誤ったパスが静かに通ることを防止。
## 移行ガイド
1. 既存コードで `ConfigParser::resolve_path` を直接利用していた場合、代わりにアプリケーション側で `ResourceLoader` を実装し、その中で必要なプレフィックス処理を行ってください。
2. `Worker::builder()` を使用する箇所で、新たに `.resource_loader(...)` を必ず指定してください。
3. ツール・フック登録は `#[worker::tool]` / `#[worker::hook]` マクロを利用する実装に移行することを推奨します。
## 開発者向けメモ
- README を簡潔化し、RustDocs で確認できる内容の重複を削除しました。
- `worker/examples/` を更新し、`ResourceLoader` の実装例とマクロベースのツール登録を採用しました。
+37 -2
View File
@@ -5,14 +5,49 @@
## 基本使用方法
```rust
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 composer = PromptComposer::from_config_file("role.yaml", context)?;
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` トレイトを実装して、任意のストレージや命名規則に基づいて文字列を返してください。
```rust
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())),
}
}
}
```
## テンプレート構文
### 変数展開
@@ -68,4 +103,4 @@ Focus on memory safety and performance.
- `model`: LLMモデル情報(provider、model_name、capabilities
- `session`: セッション情報(conversation_id、message_count
- `user_input`: ユーザー入力内容
- `tools_schema`: ツール定義JSON
- `tools_schema`: ツール定義JSON