0.3.0: テンプレートエンジンのファイルのロードを外部化
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user