update: Locked -> CacheLocked
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
//! LLMクライアント層
|
||||
//!
|
||||
//! 各LLMプロバイダと通信し、統一された[`Event`](crate::llm_client::event::Event)
|
||||
//! 各LLMプロバイダと通信し、統一された[`Event`]
|
||||
//! ストリームを出力します。
|
||||
//!
|
||||
//! # サポートするプロバイダ
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//! Worker状態
|
||||
//!
|
||||
//! Type-stateパターンによるキャッシュ保護のための状態マーカー型。
|
||||
//! Workerは`Mutable` → `Locked`の状態遷移を持ちます。
|
||||
//! Workerは`Mutable` → `CacheLocked`の状態遷移を持ちます。
|
||||
|
||||
/// Worker状態を表すマーカートレイト
|
||||
///
|
||||
@@ -19,7 +19,7 @@ mod private {
|
||||
/// - メッセージ履歴の編集(追加、削除、クリア)
|
||||
/// - ツール・Hookの登録
|
||||
///
|
||||
/// `Worker::lock()`により[`Locked`]状態へ遷移できます。
|
||||
/// `Worker::lock()`により[`CacheLocked`]状態へ遷移できます。
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@@ -42,7 +42,7 @@ pub struct Mutable;
|
||||
impl private::Sealed for Mutable {}
|
||||
impl WorkerState for Mutable {}
|
||||
|
||||
/// ロック状態(キャッシュ保護)
|
||||
/// キャッシュロック状態(キャッシュ保護)
|
||||
///
|
||||
/// この状態では以下の制限があります:
|
||||
/// - システムプロンプトの変更不可
|
||||
@@ -54,7 +54,7 @@ impl WorkerState for Mutable {}
|
||||
/// `Worker::unlock()`により[`Mutable`]状態へ戻せますが、
|
||||
/// キャッシュ保護が解除されることに注意してください。
|
||||
#[derive(Debug, Clone, Copy, Default)]
|
||||
pub struct Locked;
|
||||
pub struct CacheLocked;
|
||||
|
||||
impl private::Sealed for Locked {}
|
||||
impl WorkerState for Locked {}
|
||||
impl private::Sealed for CacheLocked {}
|
||||
impl WorkerState for CacheLocked {}
|
||||
|
||||
@@ -17,7 +17,7 @@ use crate::{
|
||||
ClientError, ConfigWarning, LlmClient, Request, RequestConfig,
|
||||
ToolDefinition as LlmToolDefinition,
|
||||
},
|
||||
state::{Locked, Mutable, WorkerState},
|
||||
state::{CacheLocked, Mutable, WorkerState},
|
||||
subscriber::{
|
||||
ErrorSubscriberAdapter, StatusSubscriberAdapter, TextBlockSubscriberAdapter,
|
||||
ToolUseBlockSubscriberAdapter, UsageSubscriberAdapter, WorkerSubscriber,
|
||||
@@ -131,7 +131,7 @@ impl<S: WorkerSubscriber + 'static> TurnNotifier for SubscriberTurnNotifier<S> {
|
||||
/// # 状態遷移(Type-state)
|
||||
///
|
||||
/// - [`Mutable`]: 初期状態。システムプロンプトや履歴を自由に編集可能。
|
||||
/// - [`Locked`]: キャッシュ保護状態。`lock()`で遷移。前方コンテキストは不変。
|
||||
/// - [`CacheLocked`]: キャッシュ保護状態。`lock()`で遷移。前方コンテキストは不変。
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@@ -174,7 +174,7 @@ pub struct Worker<C: LlmClient, S: WorkerState = Mutable> {
|
||||
system_prompt: Option<String>,
|
||||
/// メッセージ履歴(Workerが所有)
|
||||
history: Vec<Message>,
|
||||
/// ロック時点での履歴長(Locked状態でのみ意味を持つ)
|
||||
/// ロック時点での履歴長(CacheLocked状態でのみ意味を持つ)
|
||||
locked_prefix_len: usize,
|
||||
/// ターンカウント
|
||||
turn_count: usize,
|
||||
@@ -1254,11 +1254,11 @@ impl<C: LlmClient> Worker<C, Mutable> {
|
||||
self
|
||||
}
|
||||
|
||||
/// ロックしてLocked状態へ遷移
|
||||
/// ロックしてCacheLocked状態へ遷移
|
||||
///
|
||||
/// この操作により、現在のシステムプロンプトと履歴が「確定済みプレフィックス」として
|
||||
/// 固定される。以降は履歴への追記のみが可能となり、キャッシュヒットが保証される。
|
||||
pub fn lock(self) -> Worker<C, Locked> {
|
||||
pub fn lock(self) -> Worker<C, CacheLocked> {
|
||||
let locked_prefix_len = self.history.len();
|
||||
Worker {
|
||||
client: self.client,
|
||||
@@ -1283,10 +1283,10 @@ impl<C: LlmClient> Worker<C, Mutable> {
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// Locked状態専用の実装
|
||||
// CacheLocked状態専用の実装
|
||||
// =============================================================================
|
||||
|
||||
impl<C: LlmClient> Worker<C, Locked> {
|
||||
impl<C: LlmClient> Worker<C, CacheLocked> {
|
||||
/// ロック時点のプレフィックス長を取得
|
||||
pub fn locked_prefix_len(&self) -> usize {
|
||||
self.locked_prefix_len
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//! Worker状態管理のテスト
|
||||
//!
|
||||
//! Type-stateパターン(Mutable/Locked)による状態遷移と
|
||||
//! Type-stateパターン(Mutable/CacheLocked)による状態遷移と
|
||||
//! ターン間の状態保持をテストする。
|
||||
|
||||
mod common;
|
||||
@@ -95,7 +95,7 @@ fn test_mutable_extend_history() {
|
||||
// 状態遷移テスト
|
||||
// =============================================================================
|
||||
|
||||
/// lock()でMutable -> Locked状態に遷移することを確認
|
||||
/// lock()でMutable -> CacheLocked状態に遷移することを確認
|
||||
#[test]
|
||||
fn test_lock_transition() {
|
||||
let client = MockLlmClient::new(vec![]);
|
||||
@@ -108,13 +108,13 @@ fn test_lock_transition() {
|
||||
// ロック
|
||||
let locked_worker = worker.lock();
|
||||
|
||||
// Locked状態でも履歴とシステムプロンプトにアクセス可能
|
||||
// CacheLocked状態でも履歴とシステムプロンプトにアクセス可能
|
||||
assert_eq!(locked_worker.get_system_prompt(), Some("System"));
|
||||
assert_eq!(locked_worker.history().len(), 2);
|
||||
assert_eq!(locked_worker.locked_prefix_len(), 2);
|
||||
}
|
||||
|
||||
/// unlock()でLocked -> Mutable状態に遷移することを確認
|
||||
/// unlock()でCacheLocked -> Mutable状態に遷移することを確認
|
||||
#[test]
|
||||
fn test_unlock_transition() {
|
||||
let client = MockLlmClient::new(vec![]);
|
||||
@@ -172,7 +172,7 @@ async fn test_mutable_run_updates_history() {
|
||||
));
|
||||
}
|
||||
|
||||
/// Locked状態で複数ターンを実行し、履歴が正しく累積することを確認
|
||||
/// CacheLocked状態で複数ターンを実行し、履歴が正しく累積することを確認
|
||||
#[tokio::test]
|
||||
async fn test_locked_multi_turn_history_accumulation() {
|
||||
// 2回のリクエストに対応するレスポンスを準備
|
||||
@@ -340,7 +340,7 @@ async fn test_unlock_edit_relock() {
|
||||
// システムプロンプト保持のテスト
|
||||
// =============================================================================
|
||||
|
||||
/// Locked状態でもシステムプロンプトが保持されることを確認
|
||||
/// CacheLocked状態でもシステムプロンプトが保持されることを確認
|
||||
#[test]
|
||||
fn test_system_prompt_preserved_in_locked_state() {
|
||||
let client = MockLlmClient::new(vec![]);
|
||||
|
||||
Reference in New Issue
Block a user