0.4.0: ワーカーの廃止
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
# Release Notes - v0.4.0
|
||||
|
||||
**Release Date**: 2025-??-??
|
||||
|
||||
v0.4.0 は Worker が `Role` や YAML 設定を扱わず、システムプロンプト生成を完全に利用者へ委譲する大規模リファクタです。これにより、任意のテンプレートエンジンやデータソースを組み合わせてプロンプトを構築できます。
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
- `Role` / `ConfigParser` / `ResourceLoader` を削除。`WorkerBuilder` はシステムプロンプト生成関数 (`system_prompt(...)`) の指定が必須になりました。
|
||||
- `worker/src/config` の Role 関連コードとテストを削除。既存の YAML ベース設定は互換層なし。
|
||||
|
||||
## 新機能 / 仕様変更
|
||||
|
||||
- `PromptComposer` は `Arc<SystemPromptFn>` を受け取り、`PromptContext` と履歴メッセージからシステムプロンプト文字列を生成するシンプルなラッパーになりました。
|
||||
- `WorkerBuilder` は `.system_prompt(...)` で登録した関数を保持し、メッセージ送信時に毎回システムプロンプトを再生成します。
|
||||
- README/サンプルコードを刷新し、システムプロンプト関数・マクロベースのツール/フック登録手順のみを掲載。
|
||||
- 新しい `docs/prompt-composer.md` を追加し、`PromptComposer` の利用例をサマリー形式で紹介。
|
||||
|
||||
## 不具合修正
|
||||
|
||||
- `PromptComposer` が内部でファイルアクセスを行う経路を排除し、生成関数の失敗時は直近のキャッシュを利用するようにしました。
|
||||
- Worker から NIA 固有の設定コードを除去し、環境依存の副作用を縮小。
|
||||
|
||||
## 移行ガイド
|
||||
|
||||
1. 旧 `Role` / `ConfigParser` を利用していた場合、`PromptContext` と会話履歴を引数にシステムプロンプト文字列を返す関数を実装し、`.system_prompt(...)` に渡してください。
|
||||
2. `Worker::load_config` やリソースパス解決に依存していたコードは削除してください。必要であればアプリケーション側でファイル読み込みを行い、生成関数内で利用してください。
|
||||
3. ツール・フックは引き続き `#[worker::tool]` / `#[worker::hook]` マクロを推奨しています(API に変更はありません)。
|
||||
|
||||
## 開発者向けメモ
|
||||
|
||||
- README を簡潔化し、RustDocs で確認できる内容の重複を削除しました。
|
||||
- `worker/examples/` を更新し、システムプロンプト関数とマクロベースのツール登録のみを扱うよう整理しました。
|
||||
+21
-95
@@ -1,106 +1,32 @@
|
||||
# PromptComposer
|
||||
|
||||
テンプレートベースのプロンプト構築システム。Handlebarsテンプレートエンジンによる動的プロンプト生成。
|
||||
|
||||
## 基本使用方法
|
||||
`PromptComposer` は、`PromptContext` と会話履歴からシステムプロンプト文字列を生成するクロージャをラップし、LLM へ送信するメッセージ列を構築します。
|
||||
|
||||
```rust
|
||||
use std::sync::Arc;
|
||||
use worker::prompt::{PromptComposer, PromptContext, PromptError, ResourceLoader};
|
||||
use worker::prompt::{PromptComposer, PromptContext, PromptError, SystemPromptFn};
|
||||
use worker_types::Message;
|
||||
|
||||
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)))
|
||||
}
|
||||
fn build_context() -> PromptContext {
|
||||
// WorkspaceDetector などからアプリ固有の情報を収集して埋め込む
|
||||
todo!()
|
||||
}
|
||||
|
||||
// 初期化
|
||||
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())),
|
||||
}
|
||||
}
|
||||
fn generator(ctx: &PromptContext, messages: &[Message]) -> Result<String, PromptError> {
|
||||
Ok(format!(
|
||||
"Project {} has {} prior messages.",
|
||||
ctx.workspace
|
||||
.project_name
|
||||
.clone()
|
||||
.unwrap_or_else(|| \"unknown\".into()),
|
||||
messages.len()
|
||||
))
|
||||
}
|
||||
|
||||
let context = build_context();
|
||||
let composer = PromptComposer::new(context, Arc::new(generator));
|
||||
let conversation = vec![Message::new(worker_types::Role::User, \"Hello\".into())];
|
||||
let final_messages = composer.compose(&conversation)?;
|
||||
```
|
||||
|
||||
## テンプレート構文
|
||||
|
||||
### 変数展開
|
||||
```handlebars
|
||||
{{workspace.project_name}} # プロジェクト名
|
||||
{{workspace.project_type}} # プロジェクト種別
|
||||
{{model.provider}}/{{model.model_name}} # モデル情報
|
||||
{{tools_schema}} # ツールスキーマ
|
||||
```
|
||||
|
||||
### 条件分岐
|
||||
```handlebars
|
||||
{{#if workspace.has_nia_md}}
|
||||
Project info: {{workspace_content}}
|
||||
{{/if}}
|
||||
|
||||
{{#eq workspace.project_type "Rust"}}
|
||||
Focus on memory safety and performance.
|
||||
{{/eq}}
|
||||
```
|
||||
|
||||
### 繰り返し処理
|
||||
```handlebars
|
||||
{{#each tools}}
|
||||
- **{{name}}**: {{description}}
|
||||
{{/each}}
|
||||
```
|
||||
|
||||
### パーシャルテンプレート
|
||||
```handlebars
|
||||
{{> header}}
|
||||
{{> coding_guidelines}}
|
||||
{{> footer}}
|
||||
```
|
||||
|
||||
## カスタムヘルパー
|
||||
|
||||
### include_file
|
||||
外部ファイルを読み込み:
|
||||
```handlebars
|
||||
{{include_file "~/.config/nia/templates/guidelines.md"}}
|
||||
```
|
||||
|
||||
### workspace_content
|
||||
ワークスペースのnia.md内容を取得:
|
||||
```handlebars
|
||||
{{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
|
||||
`compose_with_tools` を使うと、`tools_schema` をテンプレート変数として渡した上でシステムプロンプトを再生成できます。
|
||||
|
||||
Reference in New Issue
Block a user