docs: Translate ja -> en

This commit is contained in:
2026-01-16 16:58:03 +09:00
parent 6d87da90d1
commit 6c43ac9969
26 changed files with 760 additions and 759 deletions
@@ -1,18 +1,18 @@
//! テストフィクスチャ記録ツール
//! Test fixture recording tool
//!
//! 定義されたシナリオのAPIレスポンスを記録する。
//! Records API responses for defined scenarios.
//!
//! ## 使用方法
//! ## Usage
//!
//! ```bash
//! # 利用可能なシナリオを表示
//! # Show available scenarios
//! cargo run --example record_test_fixtures
//!
//! # 特定のシナリオを記録
//! # Record specific scenario
//! ANTHROPIC_API_KEY=your-key cargo run --example record_test_fixtures -- simple_text
//! ANTHROPIC_API_KEY=your-key cargo run --example record_test_fixtures -- tool_call
//!
//! # 全シナリオを記録
//! # Record all scenarios
//! ANTHROPIC_API_KEY=your-key cargo run --example record_test_fixtures -- --all
//! ```
@@ -193,8 +193,8 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
ClientType::Ollama => "ollama",
};
// シナリオのフィルタリングは main.rs のロジックで実行済み
// ここでは単純なループで実行
// Scenario filtering is already done in main.rs logic
// Here we just execute in a simple loop
for scenario in scenarios_to_run {
match args.client {
ClientType::Anthropic => {
@@ -1,6 +1,6 @@
//! テストフィクスチャ記録機構
//! Test fixture recording mechanism
//!
//! イベントをJSONLフォーマットでファイルに保存する
//! Saves events to files in JSONL format
use std::fs::{self, File};
use std::io::{BufWriter, Write};
@@ -10,7 +10,7 @@ use std::time::{Instant, SystemTime, UNIX_EPOCH};
use futures::StreamExt;
use llm_worker::llm_client::{LlmClient, Request};
/// 記録されたイベント
/// Recorded event
#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub struct RecordedEvent {
pub elapsed_ms: u64,
@@ -18,7 +18,7 @@ pub struct RecordedEvent {
pub data: String,
}
/// セッションメタデータ
/// Session metadata
#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub struct SessionMetadata {
pub timestamp: u64,
@@ -26,7 +26,7 @@ pub struct SessionMetadata {
pub description: String,
}
/// イベントシーケンスをファイルに保存
/// Save event sequence to file
pub fn save_fixture(
path: impl AsRef<Path>,
metadata: &SessionMetadata,
@@ -43,7 +43,7 @@ pub fn save_fixture(
Ok(())
}
/// リクエストを送信してイベントを記録
/// Send request and record events
pub async fn record_request<C: LlmClient>(
client: &C,
request: Request,
@@ -78,7 +78,7 @@ pub async fn record_request<C: LlmClient>(
}
}
// 保存
// Save
let fixtures_dir = Path::new("worker/tests/fixtures").join(subdir);
fs::create_dir_all(&fixtures_dir)?;
@@ -1,20 +1,20 @@
//! テストフィクスチャ用リクエスト定義
//! Test fixture request definitions
//!
//! 各シナリオのリクエストと出力ファイル名を定義
//! Defines requests and output file names for each scenario
use llm_worker::llm_client::{Request, ToolDefinition};
/// テストシナリオ
/// Test scenario
pub struct TestScenario {
/// シナリオ名(説明)
/// Scenario name (description)
pub name: &'static str,
/// 出力ファイル名(拡張子なし)
/// Output file name (without extension)
pub output_name: &'static str,
/// リクエスト
/// Request
pub request: Request,
}
/// 全てのテストシナリオを取得
/// Get all test scenarios
pub fn scenarios() -> Vec<TestScenario> {
vec![
simple_text_scenario(),
@@ -23,7 +23,7 @@ pub fn scenarios() -> Vec<TestScenario> {
]
}
/// シンプルなテキストレスポンス
/// Simple text response
fn simple_text_scenario() -> TestScenario {
TestScenario {
name: "Simple text response",
@@ -35,7 +35,7 @@ fn simple_text_scenario() -> TestScenario {
}
}
/// ツール呼び出しを含むレスポンス
/// Response with tool call
fn tool_call_scenario() -> TestScenario {
let get_weather_tool = ToolDefinition::new("get_weather")
.description("Get the current weather for a city")
@@ -61,7 +61,7 @@ fn tool_call_scenario() -> TestScenario {
}
}
/// 長文生成シナリオ
/// Long text generation scenario
fn long_text_scenario() -> TestScenario {
TestScenario {
name: "Long text response",
+8 -8
View File
@@ -1,6 +1,6 @@
//! Worker のキャンセル機能のデモンストレーション
//! Worker cancellation demo
//!
//! ストリーミング受信中に別スレッドからキャンセルする例
//! Example of cancelling from another thread during streaming
use llm_worker::llm_client::providers::anthropic::AnthropicClient;
use llm_worker::{Worker, WorkerResult};
@@ -10,10 +10,10 @@ use tokio::sync::Mutex;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// .envファイルを読み込む
// Load .env file
dotenv::dotenv().ok();
// ロギング初期化
// Initialize logging
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
@@ -30,13 +30,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("🚀 Starting Worker...");
println!("💡 Will cancel after 2 seconds\n");
// キャンセルSenderを先に取得(ロックを保持しない)
// Get cancel sender first (without holding lock)
let cancel_tx = {
let w = worker.lock().await;
w.cancel_sender()
};
// タスク1: Workerを実行
// Task 1: Run Worker
let worker_clone = worker.clone();
let task = tokio::spawn(async move {
let mut w = worker_clone.lock().await;
@@ -55,14 +55,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}
});
// タスク2: 2秒後にキャンセル
// Task 2: Cancel after 2 seconds
tokio::spawn(async move {
tokio::time::sleep(Duration::from_secs(2)).await;
println!("\n🛑 Cancelling worker...");
let _ = cancel_tx.send(()).await;
});
// タスク完了を待つ
// Wait for task completion
task.await?;
println!("\n✨ Demo complete!");
+58 -58
View File
@@ -1,17 +1,17 @@
//! Worker を用いた対話型 CLI クライアント
//! Interactive CLI client using Worker
//!
//! 複数のLLMプロバイダ(Anthropic, Gemini, OpenAI, Ollama)と対話するCLIアプリケーション。
//! ツールの登録と実行、ストリーミングレスポンスの表示をデモする。
//! A CLI application for interacting with multiple LLM providers (Anthropic, Gemini, OpenAI, Ollama).
//! Demonstrates tool registration and execution, and streaming response display.
//!
//! ## 使用方法
//! ## Usage
//!
//! ```bash
//! # .envファイルにAPIキーを設定
//! # Set API keys in .env file
//! echo "ANTHROPIC_API_KEY=your-api-key" > .env
//! echo "GEMINI_API_KEY=your-api-key" >> .env
//! echo "OPENAI_API_KEY=your-api-key" >> .env
//!
//! # Anthropic (デフォルト)
//! # Anthropic (default)
//! cargo run --example worker_cli
//!
//! # Gemini
@@ -20,13 +20,13 @@
//! # OpenAI
//! cargo run --example worker_cli -- --provider openai --model gpt-4o
//!
//! # Ollama (ローカル)
//! # Ollama (local)
//! cargo run --example worker_cli -- --provider ollama --model llama3.2
//!
//! # オプション指定
//! # With options
//! cargo run --example worker_cli -- --provider anthropic --model claude-3-haiku-20240307 --system "You are a helpful assistant."
//!
//! # ヘルプ表示
//! # Show help
//! cargo run --example worker_cli -- --help
//! ```
@@ -53,15 +53,15 @@ use llm_worker::{
};
use llm_worker_macros::tool_registry;
// 必要なマクロ展開用インポート
// Required imports for macro expansion
use schemars;
use serde;
// =============================================================================
// プロバイダ定義
// Provider Definition
// =============================================================================
/// 利用可能なLLMプロバイダ
/// Available LLM providers
#[derive(Debug, Clone, Copy, ValueEnum, Default)]
enum Provider {
/// Anthropic Claude
@@ -71,12 +71,12 @@ enum Provider {
Gemini,
/// OpenAI GPT
Openai,
/// Ollama (ローカル)
/// Ollama (local)
Ollama,
}
impl Provider {
/// プロバイダのデフォルトモデル
/// Default model for the provider
fn default_model(&self) -> &'static str {
match self {
Provider::Anthropic => "claude-sonnet-4-20250514",
@@ -86,7 +86,7 @@ impl Provider {
}
}
/// プロバイダの表示名
/// Display name for the provider
fn display_name(&self) -> &'static str {
match self {
Provider::Anthropic => "Anthropic Claude",
@@ -96,78 +96,78 @@ impl Provider {
}
}
/// APIキーの環境変数名
/// Environment variable name for API key
fn env_var_name(&self) -> Option<&'static str> {
match self {
Provider::Anthropic => Some("ANTHROPIC_API_KEY"),
Provider::Gemini => Some("GEMINI_API_KEY"),
Provider::Openai => Some("OPENAI_API_KEY"),
Provider::Ollama => None, // Ollamaはローカルなので不要
Provider::Ollama => None, // Ollama is local, no key needed
}
}
}
// =============================================================================
// CLI引数定義
// CLI Argument Definition
// =============================================================================
/// 複数のLLMプロバイダに対応した対話型CLIクライアント
/// Interactive CLI client supporting multiple LLM providers
#[derive(Parser, Debug)]
#[command(name = "worker-cli")]
#[command(about = "Interactive CLI client for multiple LLM providers using Worker")]
#[command(version)]
struct Args {
/// 使用するプロバイダ
/// Provider to use
#[arg(long, value_enum, default_value_t = Provider::Anthropic)]
provider: Provider,
/// 使用するモデル名(未指定時はプロバイダのデフォルト)
/// Model name to use (defaults to provider's default if not specified)
#[arg(short, long)]
model: Option<String>,
/// システムプロンプト
/// System prompt
#[arg(short, long)]
system: Option<String>,
/// ツールを無効化
/// Disable tools
#[arg(long, default_value = "false")]
no_tools: bool,
/// 最初のメッセージ(指定するとそれを送信して終了)
/// Initial message (if specified, sends it and exits)
#[arg(short = 'p', long)]
prompt: Option<String>,
/// APIキー(環境変数より優先)
/// API key (takes precedence over environment variable)
#[arg(long)]
api_key: Option<String>,
}
// =============================================================================
// ツール定義
// Tool Definition
// =============================================================================
/// アプリケーションコンテキスト
/// Application context
#[derive(Clone)]
struct AppContext;
#[tool_registry]
impl AppContext {
/// 現在の日時を取得する
/// Get the current date and time
///
/// システムの現在の日付と時刻を返します。
/// Returns the system's current date and time.
#[tool]
fn get_current_time(&self) -> String {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs();
// シンプルなUnixタイムスタンプからの変換
// Simple conversion from Unix timestamp
format!("Current Unix timestamp: {}", now)
}
/// 簡単な計算を行う
/// Perform a simple calculation
///
/// 2つの数値の四則演算を実行します。
/// Executes arithmetic operations on two numbers.
#[tool]
fn calculate(&self, a: f64, b: f64, operation: String) -> Result<String, String> {
let result = match operation.as_str() {
@@ -187,10 +187,10 @@ impl AppContext {
}
// =============================================================================
// ストリーミング表示用ハンドラー
// Streaming Display Handlers
// =============================================================================
/// テキストをリアルタイムで出力するハンドラー
/// Handler that outputs text in real-time
struct StreamingPrinter {
is_first_delta: Arc<Mutex<bool>>,
}
@@ -226,7 +226,7 @@ impl Handler<TextBlockKind> for StreamingPrinter {
}
}
/// ツール呼び出しを表示するハンドラー
/// Handler that displays tool calls
struct ToolCallPrinter {
call_names: Arc<Mutex<HashMap<String, String>>>,
}
@@ -270,7 +270,7 @@ impl Handler<ToolUseBlockKind> for ToolCallPrinter {
}
}
/// ツール実行結果を表示するHook
/// Hook that displays tool execution results
struct ToolResultPrinterHook {
call_names: Arc<Mutex<HashMap<String, String>>>,
}
@@ -302,17 +302,17 @@ impl Hook<PostToolCall> for ToolResultPrinterHook {
}
// =============================================================================
// クライアント作成
// Client Creation
// =============================================================================
/// プロバイダに応じたAPIキーを取得
/// Get API key based on provider
fn get_api_key(args: &Args) -> Result<String, String> {
// CLI引数のAPIキーが優先
// CLI argument API key takes precedence
if let Some(ref key) = args.api_key {
return Ok(key.clone());
}
// プロバイダに応じた環境変数を確認
// Check environment variable based on provider
if let Some(env_var) = args.provider.env_var_name() {
std::env::var(env_var).map_err(|_| {
format!(
@@ -321,12 +321,12 @@ fn get_api_key(args: &Args) -> Result<String, String> {
)
})
} else {
// Ollamaなどはキー不要
// Ollama etc. don't need a key
Ok(String::new())
}
}
/// プロバイダに応じたクライアントを作成
/// Create client based on provider
fn create_client(args: &Args) -> Result<Box<dyn LlmClient>, String> {
let model = args
.model
@@ -356,17 +356,17 @@ fn create_client(args: &Args) -> Result<Box<dyn LlmClient>, String> {
}
// =============================================================================
// メイン
// Main
// =============================================================================
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// .envファイルを読み込む
// Load .env file
dotenv::dotenv().ok();
// ロギング初期化
// RUST_LOG=debug cargo run --example worker_cli ... で詳細ログ表示
// デフォルトは warn レベル、RUST_LOG 環境変数で上書き可能
// Initialize logging
// Use RUST_LOG=debug cargo run --example worker_cli ... for detailed logs
// Default is warn level, can be overridden with RUST_LOG environment variable
let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("warn"));
tracing_subscriber::fmt()
@@ -374,7 +374,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
.with_target(true)
.init();
// CLI引数をパース
// Parse CLI arguments
let args = Args::parse();
info!(
@@ -383,10 +383,10 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
"Starting worker CLI"
);
// 対話モードかワンショットモードか
// Interactive mode or one-shot mode
let is_interactive = args.prompt.is_none();
// モデル名(表示用)
// Model name (for display)
let model_name = args
.model
.clone()
@@ -416,7 +416,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("─────────────────────────────────────────────────");
}
// クライアント作成
// Create client
let client = match create_client(&args) {
Ok(c) => c,
Err(e) => {
@@ -425,17 +425,17 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}
};
// Worker作成
// Create Worker
let mut worker = Worker::new(client);
let tool_call_names = Arc::new(Mutex::new(HashMap::new()));
// システムプロンプトを設定
// Set system prompt
if let Some(ref system_prompt) = args.system {
worker.set_system_prompt(system_prompt);
}
// ツール登録(--no-tools でなければ)
// Register tools (unless --no-tools)
if !args.no_tools {
let app = AppContext;
worker
@@ -444,7 +444,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
worker.register_tool(app.calculate_definition()).unwrap();
}
// ストリーミング表示用ハンドラーを登録
// Register streaming display handlers
worker
.timeline_mut()
.on_text_block(StreamingPrinter::new())
@@ -452,7 +452,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
worker.add_post_tool_call_hook(ToolResultPrinterHook::new(tool_call_names));
// ワンショットモード
// One-shot mode
if let Some(prompt) = args.prompt {
match worker.run(&prompt).await {
Ok(_) => {}
@@ -465,7 +465,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
return Ok(());
}
// 対話ループ
// Interactive loop
loop {
print!("\n👤 You: ");
io::stdout().flush()?;
@@ -483,7 +483,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
break;
}
// Workerを実行(Workerが履歴を管理)
// Run Worker (Worker manages history)
match worker.run(input).await {
Ok(_) => {}
Err(e) => {