Skip to content

Latest commit

ย 

History

History
508 lines (417 loc) ยท 14.1 KB

File metadata and controls

508 lines (417 loc) ยท 14.1 KB

Claude Code Rust - ๆžถๆž„่ฎพ่ฎกๆ–‡ๆกฃ

ๆฆ‚่ฟฐ

ๆœฌๆ–‡ๆกฃ่ฏฆ็ป†่ฏดๆ˜Žไบ† claude-code-rs ็š„็ณป็ปŸๆžถๆž„่ฎพ่ฎก๏ผŒ่ฟ™ๆ˜ฏ Claude Code ็š„ Rust ้‡ๆž„็‰ˆๆœฌใ€‚

่ฎพ่ฎกๅŽŸๅˆ™

1. ็ฑปๅž‹ๅฎ‰ๅ…จ

  • ๅˆฉ็”จ Rust ็š„ๅผบ็ฑปๅž‹็ณป็ปŸ
  • ็ผ–่ฏ‘ๆ—ถ้”™่ฏฏๆฃ€ๆŸฅ
  • ้ฟๅ…่ฟ่กŒๆ—ถๆ„ๅค–

2. ๅนถๅ‘ๅฎ‰ๅ…จ

  • ไฝฟ็”จ Arc<RwLock> ่ฟ›่กŒ็บฟ็จ‹ๅฎ‰ๅ…จ็š„็Šถๆ€็ฎก็†
  • ๅผ‚ๆญฅ I/O ๅŸบไบŽ Tokio
  • ๆ— ๆ•ฐๆฎ็ซžไบ‰ไฟ่ฏ

3. ๆจกๅ—ๅŒ–่ฎพ่ฎก

  • ๆธ…ๆ™ฐ็š„ๆจกๅ—่พน็•Œ
  • ๆœ€ๅฐๅŒ–ๆจกๅ—้—ดไพ่ต–
  • ๆ˜“ไบŽๆต‹่ฏ•ๅ’Œ็ปดๆŠค

4. ๆ€ง่ƒฝไผ˜ๅ…ˆ

  • ้›ถๆˆๆœฌๆŠฝ่ฑก
  • ๆœ€ๅฐๅŒ–ๅ†…ๅญ˜ๅˆ†้…
  • ้ซ˜ๆ•ˆ็š„ๆ•ฐๆฎ็ป“ๆž„

ๆ ธๅฟƒๆžถๆž„

ๅˆ†ๅฑ‚ๆžถๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     CLI ๅ…ฅๅฃๅฑ‚                          โ”‚
โ”‚  (main.rs - ๅ‘ฝไปค่กŒ่งฃๆžๅ’Œ่ฐƒๅบฆ)                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   ๅ‘ฝไปคๅฑ‚ (commands/)                    โ”‚
โ”‚  ไบคไบ’ๅผ / ๆŸฅ่ฏข / ้…็ฝฎ / ่ฎค่ฏ / Bridge / MCP          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   ไธšๅŠก้€ป่พ‘ๅฑ‚                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚ ๅทฅๅ…ท็ณป็ปŸ     โ”‚  โ”‚ ๅคšไปฃ็†็ณป็ปŸ   โ”‚  โ”‚ ๅˆ†ๆž็ณป็ปŸ     โ”‚ โ”‚
โ”‚  โ”‚ (tools/)    โ”‚  โ”‚ (agents/)   โ”‚  โ”‚(analytics/)  โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚ Bridge ็ณป็ปŸ  โ”‚  โ”‚ MCP ็ณป็ปŸ     โ”‚  โ”‚ ่ฏญ้Ÿณ็ณป็ปŸ     โ”‚ โ”‚
โ”‚  โ”‚ (bridge/)   โ”‚  โ”‚ (mcp/)      โ”‚  โ”‚ (voice/)    โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   ๆ ธๅฟƒๆœๅŠกๅฑ‚                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚ ็Šถๆ€็ฎก็†     โ”‚  โ”‚ ้…็ฝฎ็ณป็ปŸ     โ”‚  โ”‚ ้”™่ฏฏๅค„็†     โ”‚ โ”‚
โ”‚  โ”‚ (state.rs)  โ”‚  โ”‚ (config.rs) โ”‚  โ”‚ (error.rs)   โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   ๅŸบ็ก€่ฎพๆ–ฝๅฑ‚                              โ”‚
โ”‚  Tokio ่ฟ่กŒๆ—ถ / ็ฝ‘็ปœ I/O / ๆ–‡ไปถ็ณป็ปŸ / ๅบๅˆ—ๅŒ–         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆ ธๅฟƒๆจกๅ—่ฏฆ่งฃ

1. ้…็ฝฎ็ณป็ปŸ (config.rs)

่ฎพ่ฎก็›ฎๆ ‡

  • ๅคšๆบ้…็ฝฎๅˆๅนถ
  • ็ฑปๅž‹ๅฎ‰ๅ…จ็š„้…็ฝฎ่ฎฟ้—ฎ
  • ่ฟ่กŒๆ—ถ้…็ฝฎๆ›ดๆ–ฐ

ๅ…ณ้”ฎ็ฑปๅž‹

pub struct Config {
    pub project_root: PathBuf,
    pub cwd: PathBuf,
    pub api: ApiConfig,
    pub bridge: BridgeConfig,
    pub permissions: PermissionConfig,
    pub features: FeatureFlags,
    pub theme: ThemeConfig,
    // ...
}

้…็ฝฎๅŠ ่ฝฝ้กบๅบ

  1. ๅ…จๅฑ€้…็ฝฎ (~/.config/claude-code/config.toml)
  2. ้กน็›ฎ้…็ฝฎ (.claude/settings.json)
  3. ็Žฏๅขƒๅ˜้‡๏ผˆๆœ€้ซ˜ไผ˜ๅ…ˆ็บง๏ผ‰

2. ็Šถๆ€็ฎก็† (state.rs)

่ฎพ่ฎกๆจกๅผ

  • ๅ†…้ƒจๅฏๅ˜ๆ€ง: ไฝฟ็”จ Arc<RwLock<AppStateInner>>
  • ็บฟ็จ‹ๅฎ‰ๅ…จ: ๅคš็บฟ็จ‹็Žฏๅขƒไธ‹็š„ๅฎ‰ๅ…จ่ฎฟ้—ฎ
  • ็ป†็ฒ’ๅบฆ้”: ่ฏปๅ†™้”ๅˆ†็ฆป๏ผŒๆ้ซ˜ๅนถๅ‘ๆ€ง่ƒฝ

็Šถๆ€็ป“ๆž„

pub struct AppState {
    inner: Arc<RwLock<AppStateInner>>,
}

pub struct AppStateInner {
    // ไผš่ฏไฟกๆฏ
    pub session_id: SessionId,
    pub parent_session_id: Option<SessionId>,
    
    // ็ปŸ่ฎกไฟกๆฏ
    pub total_cost_usd: f64,
    pub total_api_duration: i64,
    
    // ไปฃ็†็ณป็ปŸ
    pub agent_color_map: HashMap<String, AgentColorName>,
    
    // ... ๆ›ดๅคš็Šถๆ€
}

3. ้”™่ฏฏๅค„็† (error.rs)

้”™่ฏฏ็ฑปๅž‹่ฎพ่ฎก

ไฝฟ็”จๆžšไธพ็ปŸไธ€ๆ‰€ๆœ‰้”™่ฏฏ็ฑปๅž‹๏ผš

pub enum ClaudeError {
    Config(String),
    Io(std::io::Error),
    Network(reqwest::Error),
    Serialization(serde_json::Error),
    Tool(String),
    Command(String),
    Auth(String),
    Permission(String),
    Bridge(String),
    Mcp(String),
    State(String),
    NotImplemented(String),
    Other(String),
}

้”™่ฏฏ่ฝฌๆข

ๅฎž็Žฐ From trait ไปฅไพฟ่‡ชๅŠจ่ฝฌๆข๏ผš

impl From<std::io::Error> for ClaudeError {
    fn from(err: std::io::Error) -> Self {
        ClaudeError::Io(err)
    }
}

4. ๅทฅๅ…ท็ณป็ปŸ (tools/)

Trait ่ฎพ่ฎก

#[async_trait]
pub trait Tool: Send + Sync {
    fn name(&self) -> &str;
    fn description(&self) -> &str;
    fn input_schema(&self) -> ToolInputSchema;
    
    async fn validate_input(&self, input: &Value) -> Result<()> {
        Ok(())
    }
    
    async fn can_use(&self, context: &ToolUseContext) -> Result<PermissionResult> {
        Ok(PermissionResult::Allowed)
    }
    
    async fn execute(&self, input: Value, context: ToolUseContext) -> Result<ToolResult>;
}

ๅทฅๅ…ทๆณจๅ†Œ่กจ

pub struct ToolRegistry {
    tools: HashMap<String, Box<dyn Tool + Send + Sync>>,
}

impl Default for ToolRegistry {
    fn default() -> Self {
        let mut registry = Self::new();
        registry.register(FileReadTool::new());
        registry.register(FileEditTool::new());
        // ... ๆ›ดๅคšๅทฅๅ…ท
        registry
    }
}

ๅ†…็ฝฎๅทฅๅ…ท

ๅทฅๅ…ทๅ ๆ่ฟฐ ๆƒ้™็บงๅˆซ
file_read ่ฏปๅ–ๆ–‡ไปถ ๅช่ฏป
file_edit ็ผ–่พ‘ๆ–‡ไปถ ๆ ‡ๅ‡†
file_write ๅ†™ๅ…ฅๆ–‡ไปถ ๆ ‡ๅ‡†
bash ๆ‰ง่กŒๅ‘ฝไปค ๅฑ้™ฉ
glob ๆ–‡ไปถๅŒน้… ๅช่ฏป
grep ๅ†…ๅฎนๆœ็ดข ๅช่ฏป
git Git ๅ‘ฝไปค ๆ ‡ๅ‡†

5. ๅ‘ฝไปค็ณป็ปŸ (commands/)

Clap ้ฉฑๅŠจ็š„ CLI

#[derive(Parser, Debug)]
struct Cli {
    #[command(subcommand)]
    command: Option<Commands>,
    
    #[arg(short, long, global = true)]
    verbose: bool,
}

#[derive(Subcommand, Debug)]
enum Commands {
    #[command(alias = "i")]
    Interactive,
    
    #[command(alias = "q")]
    Query { query: Vec<String> },
    
    Config { key: Option<String>, value: Option<String> },
    
    Login,
    Logout,
    Version,
    Help,
    
    #[cfg(feature = "bridge")]
    Bridge,
    
    // ... ๆ›ดๅคšๅ‘ฝไปค
}

็‰นๆ€งๆกไปถ็ผ–่ฏ‘

ไฝฟ็”จ #[cfg(feature = "...")] ๅฎž็Žฐๅฏ้€‰ๅŠŸ่ƒฝ๏ผš

#[cfg(feature = "bridge")]
Some(Commands::Bridge) => {
    commands::bridge::run(config, state).await?;
}

6. ๅคšไปฃ็†็ณป็ปŸ (agents/)

Agent Trait

#[async_trait]
pub trait Agent {
    fn name(&self) -> &str;
    fn agent_type(&self) -> AgentType;
    fn description(&self) -> &str;
    async fn run(&self, task: &str) -> Result<String>;
}

ไปฃ็†็ฑปๅž‹

ไปฃ็†็ฑปๅž‹ ็”จ้€” ๅทฅๅ…ท้›†
GeneralPurpose ้€š็”จไปปๅŠก ๅ…จๅทฅๅ…ท
Explore ไปฃ็ ๆŽข็ดข ๅช่ฏปๅทฅๅ…ท
Plan ่ง„ๅˆ’่ฎพ่ฎก ๅˆ†ๆžๅทฅๅ…ท
Verification ้ชŒ่ฏๆต‹่ฏ• ๆต‹่ฏ•ๅทฅๅ…ท
Bash ๅ‘ฝไปคๆ‰ง่กŒ Bash + ๆ–‡ไปถ

7. MCP ้›†ๆˆ (mcp/)

ๆ ธๅฟƒๆฆ‚ๅฟต

  • ๆœๅŠกๅ™จ: ๆไพ›ๅทฅๅ…ทใ€่ต„ๆบๅ’Œๅ‘ฝไปค็š„ๅค–้ƒจๆœๅŠก
  • ๅทฅๅ…ท: MCP ๆœๅŠกๅ™จๆไพ›็š„ๅฏ่ฐƒ็”จๅ‡ฝๆ•ฐ
  • ่ต„ๆบ: ๅฏ่ฎฟ้—ฎ็š„ๆ•ฐๆฎ๏ผˆๆ–‡ไปถใ€ๆ•ฐๆฎๅบ“็ญ‰๏ผ‰
  • ๅ‘ฝไปค: ็”จๆˆทๅฏๆ‰ง่กŒ็š„้ซ˜็บงๅ‘ฝไปค

ๆœๅŠกๅ™จ็ฎก็†

pub struct McpManager {
    servers: HashMap<String, McpServerInfo>,
    state: AppState,
}

impl McpManager {
    pub async fn list_servers(&self) -> Vec<McpServerInfo>;
    pub async fn enable_server(&mut self, name: String) -> Result<()>;
    pub async fn disable_server(&mut self, name: String) -> Result<()>;
    pub async fn reconnect_server(&mut self, name: String) -> Result<()>;
}

8. Bridge ็ณป็ปŸ (bridge/)

ๆžถๆž„ๆจกๅผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๅฎขๆˆท็ซฏ      โ”‚โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚  ๆœๅŠกๅ™จ      โ”‚
โ”‚  (Client)    โ”‚  ็ฝ‘็ปœ   โ”‚  (Server)    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ไผš่ฏๆจกๅผ

  • SingleSession: ๅ•ไผš่ฏๆจกๅผ๏ผŒๅœจๅฝ“ๅ‰็›ฎๅฝ•
  • Worktree: Git ๅทฅไฝœๆ ‘๏ผŒๆฏไธชไผš่ฏ็‹ฌ็ซ‹ๅทฅไฝœๅŒบ
  • SameDir: ๅ…ฑไบซ็›ฎๅฝ•๏ผŒๆ‰€ๆœ‰ไผš่ฏๅ…ฑ็”จ

ๆ•ฐๆฎๆต่ฎพ่ฎก

ๅ‘ฝไปคๆ‰ง่กŒๆต็จ‹

็”จๆˆท่พ“ๅ…ฅ
   โ”‚
   โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  CLI ่งฃๆžๅ™จ      โ”‚
โ”‚  (clap)         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ้…็ฝฎๅŠ ่ฝฝ        โ”‚
โ”‚  (ConfigLoader)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ็Šถๆ€ๅˆๅง‹ๅŒ–      โ”‚
โ”‚  (AppState)      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๅ‘ฝไปคๆ‰ง่กŒ        โ”‚
โ”‚  (Command)       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๅทฅๅ…ท่ฐƒ็”จ        โ”‚
โ”‚  (ToolRegistry)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
    ็ป“ๆžœ่พ“ๅ‡บ

ๅทฅๅ…ท่ฐƒ็”จๆต็จ‹

AI ๆจกๅž‹ๅ†ณๅฎš่ฐƒ็”จๅทฅๅ…ท
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๅทฅๅ…ทๆŸฅๆ‰พ            โ”‚
โ”‚  (ToolRegistry)      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๆƒ้™ๆฃ€ๆŸฅ            โ”‚
โ”‚  (can_use)           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ่พ“ๅ…ฅ้ชŒ่ฏ            โ”‚
โ”‚  (validate_input)    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๅทฅๅ…ทๆ‰ง่กŒ            โ”‚
โ”‚  (execute)           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
    ่ฟ”ๅ›ž็ป“ๆžœ

ๅนถๅ‘ๆจกๅž‹

Tokio ่ฟ่กŒๆ—ถ

  • ๅคš็บฟ็จ‹่ฐƒๅบฆๅ™จ: ้ป˜่ฎคไฝฟ็”จๅคš็บฟ็จ‹่ฐƒๅบฆๅ™จ
  • ๅผ‚ๆญฅ I/O: ๆ‰€ๆœ‰ I/O ๆ“ไฝœ้ƒฝๆ˜ฏๅผ‚ๆญฅ็š„
  • ไปปๅŠก้š”็ฆป: ไฝฟ็”จ tokio::spawn ้š”็ฆปไปปๅŠก

็Šถๆ€ๅนถๅ‘่ฎฟ้—ฎ

// ่ฏปๆ“ไฝœ
let state = app_state.read();
let session_id = &state.session_id;

// ๅ†™ๆ“ไฝœ
let mut state = app_state.write();
state.total_cost_usd += 0.01;

ๆ€ง่ƒฝไผ˜ๅŒ–็ญ–็•ฅ

1. ๅ†…ๅญ˜ไผ˜ๅŒ–

  • ไฝฟ็”จ Arc ๅ…ฑไบซๆ•ฐๆฎ๏ผŒ้ฟๅ…ๅ…‹้š†
  • ไฝฟ็”จ Cow<'a, str> ้ฟๅ…ไธๅฟ…่ฆ็š„ๅˆ†้…
  • ไฝฟ็”จ Vec::with_capacity ้ข„ๅˆ†้…

2. ๅฏๅŠจไผ˜ๅŒ–

  • ๆกไปถ็ผ–่ฏ‘ๅ‡ๅฐ‘ไบŒ่ฟ›ๅˆถๅคงๅฐ
  • ๆ‡’ๅŠ ่ฝฝ้‡ๅž‹ๆจกๅ—
  • ้…็ฝฎ็ผ“ๅญ˜

3. ่ฟ่กŒๆ—ถไผ˜ๅŒ–

  • ๅฏน่ฑกๆฑ ๅค็”จ
  • ่ฟžๆŽฅๆฑ ็ฎก็†
  • ๆ‰น้‡ๆ“ไฝœ

ๅฎ‰ๅ…จๆ€ง่ฎพ่ฎก

1. ๆƒ้™็ณป็ปŸ

  • ๅคšๅฑ‚ๆƒ้™ๆฃ€ๆŸฅ
  • ็™ฝๅๅ•/้ป‘ๅๅ•่ง„ๅˆ™
  • ็”จๆˆท็กฎ่ฎคๆœบๅˆถ

2. ๆฒ™็ฎฑๆœบๅˆถ

  • ๅ‘ฝไปคๆ‰ง่กŒ้š”็ฆป
  • ๆ–‡ไปถ็ณป็ปŸ่ฎฟ้—ฎ้™ๅˆถ
  • ็ฝ‘็ปœ่ฎฟ้—ฎๆŽงๅˆถ

3. ๅฎก่ฎกๆ—ฅๅฟ—

  • ๆ‰€ๆœ‰ๅทฅๅ…ท่ฐƒ็”จ่ฎฐๅฝ•
  • ๆƒ้™ๅ†ณ็ญ–่ฎฐๅฝ•
  • ๆ–‡ไปถๆ“ไฝœ่ฎฐๅฝ•

ๆ‰ฉๅฑ•ๆ€ง่ฎพ่ฎก

1. ๆ’ไปถ็ณป็ปŸ

  • Trait ๅฏน่ฑกๅฎž็ŽฐๅŠจๆ€ๅˆ†ๅ‘
  • ่ฟ่กŒๆ—ถๆ’ไปถๅŠ ่ฝฝ
  • ๆ’ไปถ้—ด้€šไฟก

2. ๅทฅๅ…ทๆ‰ฉๅฑ•

  • ๅฎž็Žฐ Tool trait
  • ๆณจๅ†Œๅˆฐ ToolRegistry
  • ่‡ชๅŠจๅ‘็Žฐๅ’ŒๅŠ ่ฝฝ

3. ๅŠŸ่ƒฝๅผ€ๅ…ณ

  • Cargo features ๆกไปถ็ผ–่ฏ‘
  • ่ฟ่กŒๆ—ถ็‰นๆ€งๅผ€ๅ…ณ
  • GrowthBook ้›†ๆˆ

ๆต‹่ฏ•็ญ–็•ฅ

1. ๅ•ๅ…ƒๆต‹่ฏ•

  • ๆฏไธชๆจกๅ—็‹ฌ็ซ‹ๆต‹่ฏ•
  • Mock ๅค–้ƒจไพ่ต–
  • ่ฆ†็›–ๆ‰€ๆœ‰ๅ…ฌๅ…ฑ API

2. ้›†ๆˆๆต‹่ฏ•

  • ็ซฏๅˆฐ็ซฏๆต็จ‹ๆต‹่ฏ•
  • ็œŸๅฎžๅทฅๅ…ท่ฐƒ็”จๆต‹่ฏ•
  • ๅคšๆจกๅ—ๅไฝœๆต‹่ฏ•

3. ๆ€ง่ƒฝๆต‹่ฏ•

  • ๅŸบๅ‡†ๆต‹่ฏ•
  • ๅ†…ๅญ˜ไฝฟ็”จ็›‘ๆŽง
  • ๅนถๅ‘ๅŽ‹ๅŠ›ๆต‹่ฏ•

้ƒจ็ฝฒๅ’Œๅˆ†ๅ‘

1. ็ผ–่ฏ‘็›ฎๆ ‡

  • Windows (x86_64)
  • macOS (x86_64, aarch64)
  • Linux (x86_64, aarch64)

2. ๆ‰“ๅŒ…

  • ๅ•ไบŒ่ฟ›ๅˆถๆ–‡ไปถ
  • ๆ— ๅค–้ƒจไพ่ต–
  • ่ทจๅนณๅฐๅ…ผๅฎน

ๆœชๆฅๆ‰ฉๅฑ•ๆ–นๅ‘

1. ็ŸญๆœŸ็›ฎๆ ‡

  • ๅฎŒๆ•ด็š„ AI ๅฏน่ฏ็ณป็ปŸ
  • API ๅฎขๆˆท็ซฏ้›†ๆˆ
  • ๅฎŒๅ–„็š„้”™่ฏฏๅค„็†

2. ไธญๆœŸ็›ฎๆ ‡

  • ๆ’ไปถ็ณป็ปŸๅฎŒๆ•ดๅฎž็Žฐ
  • Web ็•Œ้ข
  • ็งปๅŠจ็ซฏๆ”ฏๆŒ

3. ้•ฟๆœŸ็›ฎๆ ‡

  • ๅˆ†ๅธƒๅผๆ‰ง่กŒ
  • ไผไธš็บงๅŠŸ่ƒฝ
  • ๆœบๅ™จๅญฆไน ๆจกๅž‹้›†ๆˆ

ๆœฌๆ–‡ๆกฃๅฐ†้š็€้กน็›ฎๅ‘ๅฑ•ๆŒ็ปญๆ›ดๆ–ฐใ€‚