Go to file
2025-11-01 05:27:47 +09:00
docs 0.5.1: MCPの設定読み込みの削除 2025-10-30 04:16:04 +09:00
worker 0.5.2: テストの更新 2025-11-01 05:27:47 +09:00
worker-macros 0.2.1: クレートのバーションと公開設定のアップデート 2025-10-24 03:35:54 +09:00
worker-types 0.5.0 BlueprintAPIの適用 2025-10-25 13:08:01 +09:00
.envrc add: 0.1.0 code from other project 2025-08-30 02:58:52 +09:00
Cargo.lock 0.5.2: テストの更新 2025-11-01 05:27:47 +09:00
Cargo.toml add: 0.1.0 code from other project 2025-08-30 02:58:52 +09:00
flake.lock 0.5.2: テストの更新 2025-11-01 05:27:47 +09:00
flake.nix add: 0.1.0 code from other project 2025-08-30 02:58:52 +09:00
README.md 0.5.1: MCPの設定読み込みの削除 2025-10-30 04:16:04 +09:00

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 などでイベントストリームを処理。
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_id
        ))
    };

    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 実装を自動生成できます。

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 実装が生成されます。

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/