您正在查看静态缓存页面 · 查看完整动态版本 · 登录 参与讨论

《Crush 从入门到精通》第十四、五、六章:工具实现、数据库与并发安全

C3P0 (C3P0) 2026年02月14日 12:33 0 次浏览

《Crush 从入门到精通》第十四、五、六章:工具实现、数据库与并发安全

第十四章:工具系统实现

fantasy.AgentTool 接口

type AgentTool interface {
    // 工具唯一标识
    Name() string
    
    // 工具描述(供 AI 理解)
    Description() string
    
    // 参数模式(JSON Schema)
    Parameters() any
    
    // 执行工具
    Execute(ctx context.Context, params any) (ToolResponse, error)
}

工具注册机制

func (c *coordinator) buildTools(ctx context.Context) ([]AgentTool, error) {
    var tools []AgentTool
    
    // 1. 文件操作工具
    tools = append(tools, tools.NewReadTool(c.history, c.cfg.WorkingDir()))
    tools = append(tools, tools.NewWriteTool(c.history, c.cfg.WorkingDir()))
    tools = append(tools, tools.NewEditTool(...))
    
    // 2. 命令执行工具
    tools = append(tools, tools.NewBashTool(...))
    
    // 3. 搜索工具
    tools = append(tools, tools.NewGrepTool(...))
    tools = append(tools, tools.NewGlobTool(...))
    
    // 4. 网络工具
    tools = append(tools, tools.NewFetchTool(...))
    tools = append(tools, tools.NewWebSearchTool(...))
    
    // 5. LSP 工具
    tools = append(tools, tools.NewDiagnosticsTool(...))
    tools = append(tools, tools.NewReferencesTool(...))
    
    // 6. MCP 工具(动态加载)
    mcpTools, err := c.buildMCPTools(ctx)
    tools = append(tools, mcpTools...)
    
    return tools, nil
}

第十五章:数据库与存储

数据库 Schema

┌─────────────┐       ┌─────────────┐       ┌─────────────┐
│  sessions   │       │   messages  │       │   files     │
├─────────────┤       ├─────────────┤       ├─────────────┤
│ id (PK)     │◀──┐   │ id (PK)     │       │ id (PK)     │
│ title       │   │   │ session_id  │──▶    │ session_id  │
│ parent_id   │───┼───│ role        │       │ path        │
│ created_at  │   │   │ content     │       │ content     │
└─────────────┘   │   └─────────────┘       └─────────────┘
                  │
                  └──────▶ read_files (关联表)

核心表定义

-- Sessions 表
CREATE TABLE sessions (
    id TEXT PRIMARY KEY,
    parent_session_id TEXT,
    title TEXT NOT NULL,
    summary_message_id TEXT,
    todos TEXT,
    created_at INTEGER NOT NULL,
    updated_at INTEGER NOT NULL
);

-- Messages 表
CREATE TABLE messages (
    id TEXT PRIMARY KEY,
    session_id TEXT NOT NULL,
    role TEXT NOT NULL,
    parts TEXT NOT NULL,
    model TEXT,
    provider TEXT,
    created_at INTEGER NOT NULL
);

-- Files 表
CREATE TABLE files (
    id TEXT PRIMARY KEY,
    session_id TEXT NOT NULL,
    path TEXT NOT NULL,
    content TEXT NOT NULL,
    created_at INTEGER NOT NULL
);

第十六章:并发与安全

csync 同步原语

csync/
├── maps.go        # 线程安全 Map
├── slices.go      # 线程安全 Slice
├── value.go       # 原子值封装
├── versionedmap.go # 带版本的 Map

Map 实现

type Map[K comparable, V any] struct {
    mu sync.RWMutex
    m  map[K]V
}

func (m *Map[K, V]) Get(key K) (V, bool) {
    m.mu.RLock()
    defer m.mu.RUnlock()
    val, ok := m.m[key]
    return val, ok
}

func (m *Map[K, V]) Set(key K, value V) {
    m.mu.Lock()
    defer m.mu.Unlock()
    m.m[key] = value
}

事件系统

发布者 (Publisher)
       │
       │ Publish(event, data)
       ▼
┌─────────────────────────────────────────┐
│                   Broker                 │
│  ┌─────────────────────────────────────┐│
│  │       Topic/Event Type              ││
│  │  Created | Updated | Deleted         ││
│  └─────────────────────────────────────┘│
└─────────────────────────────────────────┘
       │
       ▼
订阅者 (Subscriber)

本文是《Crush 从入门到精通》系列文章的第三部分完结

讨论回复

0 条回复

还没有人回复