diff --git a/Cargo.lock b/Cargo.lock index dab6e82..0a959f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -631,6 +631,36 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +[[package]] +name = "llm-worker" +version = "0.1.0" +dependencies = [ + "async-trait", + "clap", + "dotenv", + "eventsource-stream", + "futures", + "llm-worker-macros", + "reqwest", + "schemars", + "serde", + "serde_json", + "tempfile", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "llm-worker-macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "log" version = "0.4.29" @@ -1567,36 +1597,6 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" -[[package]] -name = "worker" -version = "0.1.0" -dependencies = [ - "async-trait", - "clap", - "dotenv", - "eventsource-stream", - "futures", - "reqwest", - "schemars", - "serde", - "serde_json", - "tempfile", - "thiserror", - "tokio", - "tracing", - "tracing-subscriber", - "worker-macros", -] - -[[package]] -name = "worker-macros" -version = "0.1.0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "writeable" version = "0.6.2" diff --git a/Cargo.toml b/Cargo.toml index 0917a45..f57e3ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [workspace] resolver = "2" members = [ - "worker", - "worker-macros", + "llm-worker", + "llm-worker-macros", ] [workspace.package] diff --git a/README.md b/README.md index 4b285f6..b60d501 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,36 @@ -# llm-worker-rs +# llm-worker Rusty, Efficient, and Agentic LLM Client Library -`llm-worker-rs` is a Rust library designed for building robust and efficient LLM applications. It unifies interactions with multiple LLM providers (Anthropic, Gemini, OpenAI, Ollama) under a single abstraction, with type-safe state management, efficient context caching, and a powerful event-driven architecture. +`llm-worker` is a Rust library for building autonomous LLM-powered systems. Define tools, register hooks, and let the Worker handle the agentic loop — tool calls are executed automatically until the task completes. + +## Features + +- Autonomous Execution: The `Worker` manages the full request-response-tool cycle. You provide tools and input; it loops until done. +- Multi-Provider Support: Unified interface for Anthropic, Gemini, OpenAI, and Ollama. +- Tool System: Define tools as async functions. The Worker automatically parses LLM tool calls, executes them in parallel, and feeds results back. +- Hook System: Intercept execution flow with `before_tool_call`, `after_tool_call`, and `on_turn_end` hooks for validation, logging, or self-correction. +- Event-Driven Streaming: Subscribe to real-time events (text deltas, tool calls, usage) for responsive UIs. +- Cache-Aware State Management: Type-state pattern (`Mutable` → `Locked`) ensures KV cache efficiency by protecting the conversation prefix. + +## Quick Start + +```rust +use llm_worker::{Worker, Message}; + +// Create a Worker with your LLM client +let mut worker = Worker::new(client) + .system_prompt("You are a helpful assistant."); + +// Register tools (optional) +worker.register_tool(SearchTool::new()); +worker.register_tool(CalculatorTool::new()); + +// Run — the Worker handles tool calls automatically +let history = worker.run("What is 2+2?").await?; +``` + +## License + +MIT + diff --git a/worker-macros/Cargo.toml b/llm-worker-macros/Cargo.toml similarity index 90% rename from worker-macros/Cargo.toml rename to llm-worker-macros/Cargo.toml index 8589ac4..c97aacb 100644 --- a/worker-macros/Cargo.toml +++ b/llm-worker-macros/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "worker-macros" +name = "llm-worker-macros" version = "0.1.0" publish.workspace = true edition.workspace = true diff --git a/worker-macros/src/lib.rs b/llm-worker-macros/src/lib.rs similarity index 96% rename from worker-macros/src/lib.rs rename to llm-worker-macros/src/lib.rs index 5a59c60..5c9b73f 100644 --- a/worker-macros/src/lib.rs +++ b/llm-worker-macros/src/lib.rs @@ -1,4 +1,4 @@ -//! worker-macros - Tool生成用手続きマクロ +//! llm-worker-macros - Tool生成用手続きマクロ //! //! `#[tool_registry]` と `#[tool]` マクロを提供し、 //! ユーザー定義のメソッドから `Tool` トレイト実装を自動生成する。 @@ -193,7 +193,7 @@ fn generate_tool_impl(self_ty: &Type, method: &syn::ImplItemFn) -> proc_macro2:: quote! { match result { Ok(val) => Ok(format!("{:?}", val)), - Err(e) => Err(::worker::tool::ToolError::ExecutionFailed(format!("{}", e))), + Err(e) => Err(::llm_worker::tool::ToolError::ExecutionFailed(format!("{}", e))), } } } else { @@ -230,7 +230,7 @@ fn generate_tool_impl(self_ty: &Type, method: &syn::ImplItemFn) -> proc_macro2:: } else { quote! { let args: #args_struct_name = serde_json::from_str(input_json) - .map_err(|e| ::worker::tool::ToolError::InvalidArgument(e.to_string()))?; + .map_err(|e| ::llm_worker::tool::ToolError::InvalidArgument(e.to_string()))?; let result = self.ctx.#method_name(#(#arg_names),*)#awaiter; #result_handling @@ -246,7 +246,7 @@ fn generate_tool_impl(self_ty: &Type, method: &syn::ImplItemFn) -> proc_macro2:: } #[async_trait::async_trait] - impl ::worker::tool::Tool for #tool_struct_name { + impl ::llm_worker::tool::Tool for #tool_struct_name { fn name(&self) -> &str { #tool_name } @@ -260,7 +260,7 @@ fn generate_tool_impl(self_ty: &Type, method: &syn::ImplItemFn) -> proc_macro2:: serde_json::to_value(schema).unwrap_or(serde_json::json!({})) } - async fn execute(&self, input_json: &str) -> Result { + async fn execute(&self, input_json: &str) -> Result { #execute_body } } diff --git a/worker/Cargo.toml b/llm-worker/Cargo.toml similarity index 88% rename from worker/Cargo.toml rename to llm-worker/Cargo.toml index 73c559b..a5e8d9f 100644 --- a/worker/Cargo.toml +++ b/llm-worker/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "worker" +name = "llm-worker" description = "" version = "0.1.0" publish.workspace = true @@ -17,7 +17,7 @@ futures = "0.3" tokio = { version = "1.49", features = ["macros", "rt-multi-thread"] } reqwest = { version = "0.13.1", default-features = false, features = ["stream", "json", "native-tls"] } eventsource-stream = "0.2" -worker-macros = { path = "../worker-macros", version = "0.1" } +llm-worker-macros = { path = "../llm-worker-macros", version = "0.1" } [dev-dependencies] clap = { version = "4.5", features = ["derive", "env"] } diff --git a/worker/examples/record_test_fixtures/main.rs b/llm-worker/examples/record_test_fixtures/main.rs similarity index 96% rename from worker/examples/record_test_fixtures/main.rs rename to llm-worker/examples/record_test_fixtures/main.rs index a24acec..bf0c0d8 100644 --- a/worker/examples/record_test_fixtures/main.rs +++ b/llm-worker/examples/record_test_fixtures/main.rs @@ -20,9 +20,9 @@ mod recorder; mod scenarios; use clap::{Parser, ValueEnum}; -use worker::llm_client::providers::anthropic::AnthropicClient; -use worker::llm_client::providers::gemini::GeminiClient; -use worker::llm_client::providers::openai::OpenAIClient; +use llm_worker::llm_client::providers::anthropic::AnthropicClient; +use llm_worker::llm_client::providers::gemini::GeminiClient; +use llm_worker::llm_client::providers::openai::OpenAIClient; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] @@ -101,7 +101,7 @@ async fn run_scenario_with_ollama( subdir: &str, model: Option, ) -> Result<(), Box> { - use worker::llm_client::providers::ollama::OllamaClient; + use llm_worker::llm_client::providers::ollama::OllamaClient; // Ollama typically runs local, no key needed or placeholder let model = model.as_deref().unwrap_or("llama3"); // default example let client = OllamaClient::new(model); // base_url placeholder, handled by client default diff --git a/worker/examples/record_test_fixtures/recorder.rs b/llm-worker/examples/record_test_fixtures/recorder.rs similarity index 98% rename from worker/examples/record_test_fixtures/recorder.rs rename to llm-worker/examples/record_test_fixtures/recorder.rs index 94fbdcb..355f589 100644 --- a/worker/examples/record_test_fixtures/recorder.rs +++ b/llm-worker/examples/record_test_fixtures/recorder.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::time::{Instant, SystemTime, UNIX_EPOCH}; use futures::StreamExt; -use worker::llm_client::{LlmClient, Request}; +use llm_worker::llm_client::{LlmClient, Request}; /// 記録されたイベント #[derive(Debug, serde::Serialize, serde::Deserialize)] diff --git a/worker/examples/record_test_fixtures/scenarios.rs b/llm-worker/examples/record_test_fixtures/scenarios.rs similarity index 97% rename from worker/examples/record_test_fixtures/scenarios.rs rename to llm-worker/examples/record_test_fixtures/scenarios.rs index fc36651..0fe5c45 100644 --- a/worker/examples/record_test_fixtures/scenarios.rs +++ b/llm-worker/examples/record_test_fixtures/scenarios.rs @@ -2,7 +2,7 @@ //! //! 各シナリオのリクエストと出力ファイル名を定義 -use worker::llm_client::{Request, ToolDefinition}; +use llm_worker::llm_client::{Request, ToolDefinition}; /// テストシナリオ pub struct TestScenario { diff --git a/worker/examples/worker_cli.rs b/llm-worker/examples/worker_cli.rs similarity index 99% rename from worker/examples/worker_cli.rs rename to llm-worker/examples/worker_cli.rs index b6f8a2b..856af11 100644 --- a/worker/examples/worker_cli.rs +++ b/llm-worker/examples/worker_cli.rs @@ -39,7 +39,7 @@ use tracing::info; use tracing_subscriber::EnvFilter; use clap::{Parser, ValueEnum}; -use worker::{ +use llm_worker::{ Worker, hook::{ControlFlow, HookError, ToolResult, WorkerHook}, llm_client::{ @@ -51,7 +51,7 @@ use worker::{ }, timeline::{Handler, TextBlockEvent, TextBlockKind, ToolUseBlockEvent, ToolUseBlockKind}, }; -use worker_macros::tool_registry; +use llm_worker_macros::tool_registry; // 必要なマクロ展開用インポート use schemars; diff --git a/worker/src/event.rs b/llm-worker/src/event.rs similarity index 100% rename from worker/src/event.rs rename to llm-worker/src/event.rs diff --git a/worker/src/handler.rs b/llm-worker/src/handler.rs similarity index 98% rename from worker/src/handler.rs rename to llm-worker/src/handler.rs index c88ada0..1c39a5c 100644 --- a/worker/src/handler.rs +++ b/llm-worker/src/handler.rs @@ -32,7 +32,7 @@ pub trait Kind { /// # Examples /// /// ```ignore -/// use worker::timeline::{Handler, TextBlockEvent, TextBlockKind}; +/// use llm_worker::timeline::{Handler, TextBlockEvent, TextBlockKind}; /// /// struct TextCollector { /// texts: Vec, diff --git a/worker/src/hook.rs b/llm-worker/src/hook.rs similarity index 98% rename from worker/src/hook.rs rename to llm-worker/src/hook.rs index 3f1bd4d..8991d33 100644 --- a/worker/src/hook.rs +++ b/llm-worker/src/hook.rs @@ -109,8 +109,8 @@ pub enum HookError { /// # Examples /// /// ```ignore -/// use worker::hook::{ControlFlow, HookError, ToolCall, TurnResult, WorkerHook}; -/// use worker::Message; +/// use llm_worker::hook::{ControlFlow, HookError, ToolCall, TurnResult, WorkerHook}; +/// use llm_worker::Message; /// /// struct ValidationHook; /// diff --git a/worker/src/lib.rs b/llm-worker/src/lib.rs similarity index 92% rename from worker/src/lib.rs rename to llm-worker/src/lib.rs index 602c00d..550eb13 100644 --- a/worker/src/lib.rs +++ b/llm-worker/src/lib.rs @@ -1,4 +1,4 @@ -//! worker - LLMワーカーライブラリ +//! llm-worker - LLMワーカーライブラリ //! //! LLMとの対話を管理するコンポーネントを提供します。 //! @@ -12,14 +12,14 @@ //! # Quick Start //! //! ```ignore -//! use worker::{Worker, Message}; +//! use llm_worker::{Worker, Message}; //! //! // Workerを作成 //! let mut worker = Worker::new(client) //! .system_prompt("You are a helpful assistant."); //! //! // ツールを登録(オプション) -//! use worker::tool::Tool; +//! use llm_worker::tool::Tool; //! worker.register_tool(my_tool); //! //! // 対話を実行 diff --git a/worker/src/llm_client/client.rs b/llm-worker/src/llm_client/client.rs similarity index 100% rename from worker/src/llm_client/client.rs rename to llm-worker/src/llm_client/client.rs diff --git a/worker/src/llm_client/error.rs b/llm-worker/src/llm_client/error.rs similarity index 100% rename from worker/src/llm_client/error.rs rename to llm-worker/src/llm_client/error.rs diff --git a/worker/src/llm_client/event.rs b/llm-worker/src/llm_client/event.rs similarity index 100% rename from worker/src/llm_client/event.rs rename to llm-worker/src/llm_client/event.rs diff --git a/worker/src/llm_client/mod.rs b/llm-worker/src/llm_client/mod.rs similarity index 100% rename from worker/src/llm_client/mod.rs rename to llm-worker/src/llm_client/mod.rs diff --git a/worker/src/llm_client/providers/anthropic.rs b/llm-worker/src/llm_client/providers/anthropic.rs similarity index 100% rename from worker/src/llm_client/providers/anthropic.rs rename to llm-worker/src/llm_client/providers/anthropic.rs diff --git a/worker/src/llm_client/providers/gemini.rs b/llm-worker/src/llm_client/providers/gemini.rs similarity index 100% rename from worker/src/llm_client/providers/gemini.rs rename to llm-worker/src/llm_client/providers/gemini.rs diff --git a/worker/src/llm_client/providers/mod.rs b/llm-worker/src/llm_client/providers/mod.rs similarity index 100% rename from worker/src/llm_client/providers/mod.rs rename to llm-worker/src/llm_client/providers/mod.rs diff --git a/worker/src/llm_client/providers/ollama.rs b/llm-worker/src/llm_client/providers/ollama.rs similarity index 100% rename from worker/src/llm_client/providers/ollama.rs rename to llm-worker/src/llm_client/providers/ollama.rs diff --git a/worker/src/llm_client/providers/openai.rs b/llm-worker/src/llm_client/providers/openai.rs similarity index 100% rename from worker/src/llm_client/providers/openai.rs rename to llm-worker/src/llm_client/providers/openai.rs diff --git a/worker/src/llm_client/scheme/anthropic/events.rs b/llm-worker/src/llm_client/scheme/anthropic/events.rs similarity index 100% rename from worker/src/llm_client/scheme/anthropic/events.rs rename to llm-worker/src/llm_client/scheme/anthropic/events.rs diff --git a/worker/src/llm_client/scheme/anthropic/mod.rs b/llm-worker/src/llm_client/scheme/anthropic/mod.rs similarity index 100% rename from worker/src/llm_client/scheme/anthropic/mod.rs rename to llm-worker/src/llm_client/scheme/anthropic/mod.rs diff --git a/worker/src/llm_client/scheme/anthropic/request.rs b/llm-worker/src/llm_client/scheme/anthropic/request.rs similarity index 100% rename from worker/src/llm_client/scheme/anthropic/request.rs rename to llm-worker/src/llm_client/scheme/anthropic/request.rs diff --git a/worker/src/llm_client/scheme/gemini/events.rs b/llm-worker/src/llm_client/scheme/gemini/events.rs similarity index 100% rename from worker/src/llm_client/scheme/gemini/events.rs rename to llm-worker/src/llm_client/scheme/gemini/events.rs diff --git a/worker/src/llm_client/scheme/gemini/mod.rs b/llm-worker/src/llm_client/scheme/gemini/mod.rs similarity index 100% rename from worker/src/llm_client/scheme/gemini/mod.rs rename to llm-worker/src/llm_client/scheme/gemini/mod.rs diff --git a/worker/src/llm_client/scheme/gemini/request.rs b/llm-worker/src/llm_client/scheme/gemini/request.rs similarity index 100% rename from worker/src/llm_client/scheme/gemini/request.rs rename to llm-worker/src/llm_client/scheme/gemini/request.rs diff --git a/worker/src/llm_client/scheme/mod.rs b/llm-worker/src/llm_client/scheme/mod.rs similarity index 100% rename from worker/src/llm_client/scheme/mod.rs rename to llm-worker/src/llm_client/scheme/mod.rs diff --git a/worker/src/llm_client/scheme/openai/events.rs b/llm-worker/src/llm_client/scheme/openai/events.rs similarity index 100% rename from worker/src/llm_client/scheme/openai/events.rs rename to llm-worker/src/llm_client/scheme/openai/events.rs diff --git a/worker/src/llm_client/scheme/openai/mod.rs b/llm-worker/src/llm_client/scheme/openai/mod.rs similarity index 100% rename from worker/src/llm_client/scheme/openai/mod.rs rename to llm-worker/src/llm_client/scheme/openai/mod.rs diff --git a/worker/src/llm_client/scheme/openai/request.rs b/llm-worker/src/llm_client/scheme/openai/request.rs similarity index 100% rename from worker/src/llm_client/scheme/openai/request.rs rename to llm-worker/src/llm_client/scheme/openai/request.rs diff --git a/worker/src/llm_client/types.rs b/llm-worker/src/llm_client/types.rs similarity index 100% rename from worker/src/llm_client/types.rs rename to llm-worker/src/llm_client/types.rs diff --git a/worker/src/message.rs b/llm-worker/src/message.rs similarity index 97% rename from worker/src/message.rs rename to llm-worker/src/message.rs index 8822315..fbc3a47 100644 --- a/worker/src/message.rs +++ b/llm-worker/src/message.rs @@ -20,7 +20,7 @@ pub enum Role { /// # Examples /// /// ```ignore -/// use worker::Message; +/// use llm_worker::Message; /// /// // ユーザーメッセージ /// let user_msg = Message::user("Hello!"); @@ -79,7 +79,7 @@ impl Message { /// # Examples /// /// ```ignore - /// use worker::Message; + /// use llm_worker::Message; /// let msg = Message::user("こんにちは"); /// ``` pub fn user(content: impl Into) -> Self { diff --git a/worker/src/state.rs b/llm-worker/src/state.rs similarity index 98% rename from worker/src/state.rs rename to llm-worker/src/state.rs index 14728b8..85dbb19 100644 --- a/worker/src/state.rs +++ b/llm-worker/src/state.rs @@ -24,7 +24,7 @@ mod private { /// # Examples /// /// ```ignore -/// use worker::Worker; +/// use llm_worker::Worker; /// /// let mut worker = Worker::new(client) /// .system_prompt("You are helpful."); diff --git a/worker/src/subscriber.rs b/llm-worker/src/subscriber.rs similarity index 99% rename from worker/src/subscriber.rs rename to llm-worker/src/subscriber.rs index e22ab7b..d750e63 100644 --- a/worker/src/subscriber.rs +++ b/llm-worker/src/subscriber.rs @@ -33,8 +33,8 @@ use crate::{ /// # Examples /// /// ```ignore -/// use worker::subscriber::WorkerSubscriber; -/// use worker::timeline::TextBlockEvent; +/// use llm_worker::subscriber::WorkerSubscriber; +/// use llm_worker::timeline::TextBlockEvent; /// /// struct StreamPrinter; /// diff --git a/worker/src/timeline/event.rs b/llm-worker/src/timeline/event.rs similarity index 100% rename from worker/src/timeline/event.rs rename to llm-worker/src/timeline/event.rs diff --git a/worker/src/timeline/mod.rs b/llm-worker/src/timeline/mod.rs similarity index 100% rename from worker/src/timeline/mod.rs rename to llm-worker/src/timeline/mod.rs diff --git a/worker/src/timeline/text_block_collector.rs b/llm-worker/src/timeline/text_block_collector.rs similarity index 100% rename from worker/src/timeline/text_block_collector.rs rename to llm-worker/src/timeline/text_block_collector.rs diff --git a/worker/src/timeline/timeline.rs b/llm-worker/src/timeline/timeline.rs similarity index 99% rename from worker/src/timeline/timeline.rs rename to llm-worker/src/timeline/timeline.rs index a619085..8ce92f0 100644 --- a/worker/src/timeline/timeline.rs +++ b/llm-worker/src/timeline/timeline.rs @@ -328,7 +328,7 @@ where /// # Examples /// /// ```ignore -/// use worker::{Timeline, Handler, TextBlockKind, TextBlockEvent}; +/// use llm_worker::{Timeline, Handler, TextBlockKind, TextBlockEvent}; /// /// struct MyHandler; /// impl Handler for MyHandler { diff --git a/worker/src/timeline/tool_call_collector.rs b/llm-worker/src/timeline/tool_call_collector.rs similarity index 100% rename from worker/src/timeline/tool_call_collector.rs rename to llm-worker/src/timeline/tool_call_collector.rs diff --git a/worker/src/tool.rs b/llm-worker/src/tool.rs similarity index 97% rename from worker/src/tool.rs rename to llm-worker/src/tool.rs index 5c5d527..9585eca 100644 --- a/worker/src/tool.rs +++ b/llm-worker/src/tool.rs @@ -31,7 +31,7 @@ pub enum ToolError { /// 通常は`#[tool]`マクロを使用して自動実装します: /// /// ```ignore -/// use worker::tool; +/// use llm_worker::tool; /// /// #[tool(description = "Search the web for information")] /// async fn search(query: String) -> String { @@ -43,7 +43,7 @@ pub enum ToolError { /// # 手動実装 /// /// ```ignore -/// use worker::tool::{Tool, ToolError}; +/// use llm_worker::tool::{Tool, ToolError}; /// use serde_json::{json, Value}; /// /// struct MyTool; diff --git a/worker/src/worker.rs b/llm-worker/src/worker.rs similarity index 99% rename from worker/src/worker.rs rename to llm-worker/src/worker.rs index b5f2318..8d898fb 100644 --- a/worker/src/worker.rs +++ b/llm-worker/src/worker.rs @@ -95,7 +95,7 @@ impl TurnNotifier for SubscriberTurnNotifier { /// # Examples /// /// ```ignore -/// use worker::{Worker, Message}; +/// use llm_worker::{Worker, Message}; /// /// // Workerを作成してツールを登録 /// let mut worker = Worker::new(client) @@ -163,7 +163,7 @@ impl Worker { /// # Examples /// /// ```ignore - /// use worker::{Worker, WorkerSubscriber, TextBlockEvent}; + /// use llm_worker::{Worker, WorkerSubscriber, TextBlockEvent}; /// /// struct MyPrinter; /// impl WorkerSubscriber for MyPrinter { @@ -211,7 +211,7 @@ impl Worker { /// # Examples /// /// ```ignore - /// use worker::Worker; + /// use llm_worker::Worker; /// use my_tools::SearchTool; /// /// worker.register_tool(SearchTool::new()); @@ -236,7 +236,7 @@ impl Worker { /// # Examples /// /// ```ignore - /// use worker::{Worker, WorkerHook, ControlFlow, ToolCall}; + /// use llm_worker::{Worker, WorkerHook, ControlFlow, ToolCall}; /// /// struct LoggingHook; /// diff --git a/worker/tests/anthropic_fixtures.rs b/llm-worker/tests/anthropic_fixtures.rs similarity index 100% rename from worker/tests/anthropic_fixtures.rs rename to llm-worker/tests/anthropic_fixtures.rs diff --git a/worker/tests/common/mod.rs b/llm-worker/tests/common/mod.rs similarity index 96% rename from worker/tests/common/mod.rs rename to llm-worker/tests/common/mod.rs index 86352aa..8872ff5 100644 --- a/worker/tests/common/mod.rs +++ b/llm-worker/tests/common/mod.rs @@ -8,9 +8,9 @@ use std::sync::{Arc, Mutex}; use async_trait::async_trait; use futures::Stream; -use worker::llm_client::event::{BlockType, DeltaContent, Event}; -use worker::llm_client::{ClientError, LlmClient, Request}; -use worker::timeline::{Handler, TextBlockEvent, TextBlockKind, Timeline}; +use llm_worker::llm_client::event::{BlockType, DeltaContent, Event}; +use llm_worker::llm_client::{ClientError, LlmClient, Request}; +use llm_worker::timeline::{Handler, TextBlockEvent, TextBlockKind, Timeline}; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -267,7 +267,7 @@ pub fn assert_timeline_integration(subdir: &str) { }); for event in &events { - let timeline_event: worker::timeline::event::Event = event.clone().into(); + let timeline_event: llm_worker::timeline::event::Event = event.clone().into(); timeline.dispatch(&timeline_event); } diff --git a/worker/tests/fixtures/anthropic/anthropic_1767624445.jsonl b/llm-worker/tests/fixtures/anthropic/anthropic_1767624445.jsonl similarity index 100% rename from worker/tests/fixtures/anthropic/anthropic_1767624445.jsonl rename to llm-worker/tests/fixtures/anthropic/anthropic_1767624445.jsonl diff --git a/worker/tests/fixtures/anthropic/simple_text.jsonl b/llm-worker/tests/fixtures/anthropic/simple_text.jsonl similarity index 100% rename from worker/tests/fixtures/anthropic/simple_text.jsonl rename to llm-worker/tests/fixtures/anthropic/simple_text.jsonl diff --git a/worker/tests/fixtures/anthropic/tool_call.jsonl b/llm-worker/tests/fixtures/anthropic/tool_call.jsonl similarity index 100% rename from worker/tests/fixtures/anthropic/tool_call.jsonl rename to llm-worker/tests/fixtures/anthropic/tool_call.jsonl diff --git a/worker/tests/fixtures/gemini/long_text.jsonl b/llm-worker/tests/fixtures/gemini/long_text.jsonl similarity index 100% rename from worker/tests/fixtures/gemini/long_text.jsonl rename to llm-worker/tests/fixtures/gemini/long_text.jsonl diff --git a/worker/tests/fixtures/gemini/simple_text.jsonl b/llm-worker/tests/fixtures/gemini/simple_text.jsonl similarity index 100% rename from worker/tests/fixtures/gemini/simple_text.jsonl rename to llm-worker/tests/fixtures/gemini/simple_text.jsonl diff --git a/worker/tests/fixtures/gemini/tool_call.jsonl b/llm-worker/tests/fixtures/gemini/tool_call.jsonl similarity index 100% rename from worker/tests/fixtures/gemini/tool_call.jsonl rename to llm-worker/tests/fixtures/gemini/tool_call.jsonl diff --git a/worker/tests/fixtures/ollama/long_text.jsonl b/llm-worker/tests/fixtures/ollama/long_text.jsonl similarity index 100% rename from worker/tests/fixtures/ollama/long_text.jsonl rename to llm-worker/tests/fixtures/ollama/long_text.jsonl diff --git a/worker/tests/fixtures/ollama/simple_text.jsonl b/llm-worker/tests/fixtures/ollama/simple_text.jsonl similarity index 100% rename from worker/tests/fixtures/ollama/simple_text.jsonl rename to llm-worker/tests/fixtures/ollama/simple_text.jsonl diff --git a/worker/tests/fixtures/ollama/tool_call.jsonl b/llm-worker/tests/fixtures/ollama/tool_call.jsonl similarity index 100% rename from worker/tests/fixtures/ollama/tool_call.jsonl rename to llm-worker/tests/fixtures/ollama/tool_call.jsonl diff --git a/worker/tests/fixtures/openai/long_text.jsonl b/llm-worker/tests/fixtures/openai/long_text.jsonl similarity index 100% rename from worker/tests/fixtures/openai/long_text.jsonl rename to llm-worker/tests/fixtures/openai/long_text.jsonl diff --git a/worker/tests/fixtures/openai/openai_1767708975.jsonl b/llm-worker/tests/fixtures/openai/openai_1767708975.jsonl similarity index 100% rename from worker/tests/fixtures/openai/openai_1767708975.jsonl rename to llm-worker/tests/fixtures/openai/openai_1767708975.jsonl diff --git a/worker/tests/fixtures/openai/simple_text.jsonl b/llm-worker/tests/fixtures/openai/simple_text.jsonl similarity index 100% rename from worker/tests/fixtures/openai/simple_text.jsonl rename to llm-worker/tests/fixtures/openai/simple_text.jsonl diff --git a/worker/tests/fixtures/openai/tool_call.jsonl b/llm-worker/tests/fixtures/openai/tool_call.jsonl similarity index 100% rename from worker/tests/fixtures/openai/tool_call.jsonl rename to llm-worker/tests/fixtures/openai/tool_call.jsonl diff --git a/worker/tests/gemini_fixtures.rs b/llm-worker/tests/gemini_fixtures.rs similarity index 100% rename from worker/tests/gemini_fixtures.rs rename to llm-worker/tests/gemini_fixtures.rs diff --git a/worker/tests/ollama_fixtures.rs b/llm-worker/tests/ollama_fixtures.rs similarity index 100% rename from worker/tests/ollama_fixtures.rs rename to llm-worker/tests/ollama_fixtures.rs diff --git a/worker/tests/openai_fixtures.rs b/llm-worker/tests/openai_fixtures.rs similarity index 100% rename from worker/tests/openai_fixtures.rs rename to llm-worker/tests/openai_fixtures.rs diff --git a/worker/tests/parallel_execution_test.rs b/llm-worker/tests/parallel_execution_test.rs similarity index 97% rename from worker/tests/parallel_execution_test.rs rename to llm-worker/tests/parallel_execution_test.rs index b7210d4..ac92315 100644 --- a/worker/tests/parallel_execution_test.rs +++ b/llm-worker/tests/parallel_execution_test.rs @@ -7,10 +7,10 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::{Duration, Instant}; use async_trait::async_trait; -use worker::Worker; -use worker::hook::{ControlFlow, HookError, ToolCall, ToolResult, WorkerHook}; -use worker::llm_client::event::{Event, ResponseStatus, StatusEvent}; -use worker::tool::{Tool, ToolError}; +use llm_worker::Worker; +use llm_worker::hook::{ControlFlow, HookError, ToolCall, ToolResult, WorkerHook}; +use llm_worker::llm_client::event::{Event, ResponseStatus, StatusEvent}; +use llm_worker::tool::{Tool, ToolError}; mod common; use common::MockLlmClient; diff --git a/worker/tests/subscriber_test.rs b/llm-worker/tests/subscriber_test.rs similarity index 95% rename from worker/tests/subscriber_test.rs rename to llm-worker/tests/subscriber_test.rs index e84e301..efb8ad2 100644 --- a/worker/tests/subscriber_test.rs +++ b/llm-worker/tests/subscriber_test.rs @@ -7,12 +7,12 @@ mod common; use std::sync::{Arc, Mutex}; use common::MockLlmClient; -use worker::Worker; -use worker::hook::ToolCall; -use worker::llm_client::event::{Event, ResponseStatus, StatusEvent as ClientStatusEvent}; -use worker::subscriber::WorkerSubscriber; -use worker::timeline::event::{ErrorEvent, StatusEvent, UsageEvent}; -use worker::timeline::{TextBlockEvent, ToolUseBlockEvent}; +use llm_worker::Worker; +use llm_worker::hook::ToolCall; +use llm_worker::llm_client::event::{Event, ResponseStatus, StatusEvent as ClientStatusEvent}; +use llm_worker::subscriber::WorkerSubscriber; +use llm_worker::timeline::event::{ErrorEvent, StatusEvent, UsageEvent}; +use llm_worker::timeline::{TextBlockEvent, ToolUseBlockEvent}; // ============================================================================= // Test Subscriber diff --git a/worker/tests/tool_macro_test.rs b/llm-worker/tests/tool_macro_test.rs similarity index 98% rename from worker/tests/tool_macro_test.rs rename to llm-worker/tests/tool_macro_test.rs index 5807be2..04f8f64 100644 --- a/worker/tests/tool_macro_test.rs +++ b/llm-worker/tests/tool_macro_test.rs @@ -9,8 +9,8 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use schemars; use serde; -use worker::tool::Tool; -use worker_macros::tool_registry; +use llm_worker::tool::Tool; +use llm_worker_macros::tool_registry; // ============================================================================= // Test: Basic Tool Generation diff --git a/worker/tests/worker_fixtures.rs b/llm-worker/tests/worker_fixtures.rs similarity index 95% rename from worker/tests/worker_fixtures.rs rename to llm-worker/tests/worker_fixtures.rs index ebc4f97..edb26b5 100644 --- a/worker/tests/worker_fixtures.rs +++ b/llm-worker/tests/worker_fixtures.rs @@ -11,8 +11,8 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use async_trait::async_trait; use common::MockLlmClient; -use worker::Worker; -use worker::tool::{Tool, ToolError}; +use llm_worker::Worker; +use llm_worker::tool::{Tool, ToolError}; /// フィクスチャディレクトリのパス fn fixtures_dir() -> std::path::PathBuf { @@ -100,7 +100,7 @@ fn test_mock_client_from_fixture() { /// fixtureファイルを使わず、プログラムでイベントを構築してクライアントを作成する。 #[test] fn test_mock_client_from_events() { - use worker::llm_client::event::Event; + use llm_worker::llm_client::event::Event; // 直接イベントを指定 let events = vec![ @@ -178,7 +178,7 @@ async fn test_worker_tool_call() { /// テストの独立性を高め、外部ファイルへの依存を排除したい場合に有用。 #[tokio::test] async fn test_worker_with_programmatic_events() { - use worker::llm_client::event::{Event, ResponseStatus, StatusEvent}; + use llm_worker::llm_client::event::{Event, ResponseStatus, StatusEvent}; // プログラムでイベントシーケンスを構築 let events = vec![ @@ -205,8 +205,8 @@ async fn test_worker_with_programmatic_events() { /// id, name, input(JSON)を正しく抽出できることを検証する。 #[tokio::test] async fn test_tool_call_collector_integration() { - use worker::llm_client::event::Event; - use worker::timeline::{Timeline, ToolCallCollector}; + use llm_worker::llm_client::event::Event; + use llm_worker::timeline::{Timeline, ToolCallCollector}; // ToolUseブロックを含むイベントシーケンス let events = vec![ @@ -222,7 +222,7 @@ async fn test_tool_call_collector_integration() { // イベントをディスパッチ for event in &events { - let timeline_event: worker::timeline::event::Event = event.clone().into(); + let timeline_event: llm_worker::timeline::event::Event = event.clone().into(); timeline.dispatch(&timeline_event); } diff --git a/worker/tests/worker_state_test.rs b/llm-worker/tests/worker_state_test.rs similarity index 98% rename from worker/tests/worker_state_test.rs rename to llm-worker/tests/worker_state_test.rs index cb0c264..035e3be 100644 --- a/worker/tests/worker_state_test.rs +++ b/llm-worker/tests/worker_state_test.rs @@ -6,9 +6,9 @@ mod common; use common::MockLlmClient; -use worker::Worker; -use worker::llm_client::event::{Event, ResponseStatus, StatusEvent}; -use worker::{Message, MessageContent}; +use llm_worker::Worker; +use llm_worker::llm_client::event::{Event, ResponseStatus, StatusEvent}; +use llm_worker::{Message, MessageContent}; // ============================================================================= // Mutable状態のテスト