docs: Translate ja -> en
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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!");
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user