llm-worker-rs/README.md
2025-10-25 13:08:01 +09:00

95 lines
3.1 KiB
Markdown

# `worker`
`worker` は、複数の LLM プロバイダーを横断して扱える統合ワーカーです。モデル呼び出し、ツール実行、プロンプト構築、フック連携など、対話アプリに必要な機能を 1 つの API にまとめます。
## 特徴
- 主要 LLM プロバイダーを単一のインターフェースで利用
- システムプロンプトの生成を外部関数として注入可能
- ツール連携とストリーミング応答、フックによるカスタマイズに対応
## 利用手順
`worker` はシステムプロンプトの生成を外部関数に完全委任します。以下の手順で組み込みます。
1. `fn(&SystemPromptContext, &[Message]) -> Result<String, PromptError>` 形式の関数(またはクロージャ)でシステムプロンプトを返す。
2. `Worker::blueprint()` でブループリントを作成し、プロバイダー・モデル・APIキー・システムプロンプト関数を設定。
3. `WorkerBlueprint::instantiate()``Worker` を生成し、`process_task_with_history` などでイベントストリームを処理。
```rust
use futures_util::StreamExt;
use worker::{LlmProvider, SystemPromptContext, PromptError, Worker};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let system_prompt = |ctx: &SystemPromptContext, _messages: &[worker_types::Message]| {
Ok(format!(
"You are assisting with model {} from provider {:?}.",
ctx.model.model_name,
ctx.model.provider
))
};
let mut blueprint = Worker::blueprint();
blueprint
.provider(LlmProvider::Claude)
.model("claude-3-sonnet-20240229")
.system_prompt_fn(system_prompt);
let mut worker = blueprint.instantiate()?;
worker.initialize_session()?;
let events = worker
.process_task_with_history("こんにちは!".into(), None)
.await;
futures_util::pin_mut!(events);
while let Some(event) = events.next().await {
println!("{event:?}");
}
Ok(())
}
```
### ツールを登録する
`#[worker::tool]` マクロで関数を装飾すると、`Tool` 実装を自動生成できます。
```rust
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use worker::ToolResult;
#[derive(Debug, Deserialize, Serialize, JsonSchema)]
struct EchoArgs {
text: String,
}
#[worker::tool(name = "echo")]
async fn echo(args: EchoArgs) -> ToolResult<String> {
Ok(args.text)
}
worker.register_tool(Box::new(EchoTool::new()))?;
```
### フックを登録する
`#[worker::hook]` マクロで非同期関数を装飾すると、`WorkerHook` 実装が生成されます。
```rust
use worker::{HookContext, HookResult};
#[worker::hook(hook_type = "OnMessageSend")]
async fn log(context: HookContext) -> (HookContext, HookResult) {
println!("sending: {}", context.content);
(context, HookResult::Continue)
}
worker.register_hook(Box::new(LogHook::new()));
```
## ドキュメント
- API の詳細は `cargo doc --open` で参照できます。
- プロンプトシステムの概要: `docs/prompt-composer.md`
- サンプルコード: `worker/examples/`