PlanTask

💡 本䞭闎件圚 v0.8.0 版本匕入。包路埄github.com/cloudwego/eino/adk/middlewares/plantask

抂述

plantask 是䞀䞪任务管理䞭闎件通过 BeforeAgent 钩子向 Agent 泚入四䞪工具䜿其具倇结构化任务规划胜力

工具功胜
TaskCreate
创建任务
TaskGet
获取单䞪任务诊情
TaskUpdate
曎新任务状态/字段、讟眮䟝赖、删陀任务
TaskList
列出所有任务摘芁

栞心甚途将倍杂请求拆解䞺可跟螪的小任务管理任务闎䟝赖关系让甚户看到执行进床。


架构

┌─────────────────────────────────────────────────────────────────────────┐
│                              Agent                                      │
│                                                                         │
│  ┌───────────────────────────────────────────────────────────────────┐  │
│  │  BeforeAgent: 泚入任务工具 (垊 sync.Mutex 保证并发安党)             │  │
│  │    - TaskCreate                                                    │  │
│  │    - TaskGet                                                       │  │
│  │    - TaskUpdate                                                    │  │
│  │    - TaskList                                                      │  │
│  └───────────────────────────────────────────────────────────────────┘  │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▌
┌─────────────────────────────────────────────────────────────────────────┐
│                             Backend                                     │
│                                                                         │
│  存傚结构:                                                               │
│    baseDir/                                                             │
│    ├── .highwatermark    # 已分配的最倧 ID纯数字文本                  │
│    ├── 1.json            # 任务 #1                                      │
│    ├── 2.json            # 任务 #2                                      │
│    └── ...                                                              │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

API

构造凜数

// 泛型版本支持 *schema.Message 和 *schema.AgenticMessage
func NewTyped[M adk.MessageType](ctx context.Context, config *Config) (adk.TypedChatModelAgentMiddleware[M], error)

// 非泛型版本等价于 NewTyped[*schema.Message]
func New(ctx context.Context, config *Config) (adk.ChatModelAgentMiddleware, error)

Config

type Config struct {
    Backend Backend  // 存傚后端必填
    BaseDir string   // 任务文件存傚目圕必填
}

💡 Backend 应该是 session 绎床隔犻的——䞍同䌚话对应䞍同的 Backend 实䟋即䞍同的任务列衚。

Backend 接口

Backend 定义圚 plantask 包内是 filesystem.Backend 的粟简子集仅保留任务存傚所需的四䞪方法

type Backend interface {
    LsInfo(ctx context.Context, req *LsInfoRequest) ([]FileInfo, error)
    Read(ctx context.Context, req *ReadRequest) (*filesystem.FileContent, error)
    Write(ctx context.Context, req *WriteRequest) error
    Delete(ctx context.Context, req *DeleteRequest) error
}

其䞭类型别名关系

type FileInfo = filesystem.FileInfo        // Path, IsDir, Size, ModifiedAt
type LsInfoRequest = filesystem.LsInfoRequest  // Path string
type ReadRequest = filesystem.ReadRequest       // FilePath, Offset, Limit
type WriteRequest = filesystem.WriteRequest     // FilePath, Content string

// DeleteRequest 是 plantask 包自定义的filesystem 包无歀类型
type DeleteRequest struct {
    FilePath string
}

💡 泚意 Read 返回 *filesystem.FileContent含 Content string 字段䞍是裞 string。富入路埄䞺 github.com/cloudwego/eino/adk/filesystem。


任务结构

type task struct {
    ID          string         `json:"id"`
    Subject     string         `json:"subject"`
    Description string         `json:"description"`
    Status      string         `json:"status"`
    Blocks      []string       `json:"blocks"`
    BlockedBy   []string       `json:"blockedBy"`
    ActiveForm  string         `json:"activeForm,omitempty"`
    Owner       string         `json:"owner,omitempty"`
    Metadata    map[string]any `json:"metadata,omitempty"`
}

状态

状态倌诎明
pending
埅倄理创建时默讀
in_progress
进行䞭
completed
已完成
deleted
删陀物理删陀 JSON 文件并从其他任务的䟝赖列衚䞭移陀

状态流蜬pending → in_progress → completed任䜕状态均可盎接讟䞺 deleted。


工具参数

TaskCreate

工具名垞量TaskCreateToolName = "TaskCreate"

参数类型必填诎明
subject
string是任务标题祈䜿句圢匏
description
string是任务诊细描述包含䞊䞋文和验收标准
activeForm
string吊进行时文案劂"正圚运行测试"in_progress 时展瀺给甚户
metadata
object吊自定义键倌对

创建后任务 ID 自劚递增基于 .highwatermark 文件状态初始䞺 pending。

TaskGet

工具名垞量TaskGetToolName = "TaskGet"

参数类型必填诎明
taskId
string是任务 ID纯数字字笊䞲

返回任务的完敎信息subject、description、status、blocks、blockedBy、owner。

TaskUpdate

工具名垞量TaskUpdateToolName = "TaskUpdate"

参数类型必填诎明
taskId
string是任务 ID
subject
string吊新标题
description
string吊新描述
activeForm
string吊新进行时文案
status
string吊新状态enum:
pending
/
in_progress
/
completed
/
deleted
addBlocks
[]string吊添加被圓前任务阻塞的任务 ID双向写入
addBlockedBy
[]string吊添加阻塞圓前任务的任务 ID双向写入
owner
string吊莟莣的 agent 名称
metadata
object吊合并到现有 metadata讟 key 䞺 null 则删陀该 key

关键行䞺

  • status: "deleted" 䌚物理删陀任务文件并从所有其他任务的 blocks/blockedBy 䞭移陀该 ID
  • 添加䟝赖时䌚进行埪环䟝赖检测若圢成环则报错
  • 圓所有任务均䞺 completed 时自劚删陀党郚任务文件枅理机制

TaskList

工具名垞量TaskListToolName = "TaskList"

无参数。返回所有任务的摘芁列衚按 ID 排序每条栌匏䞺

#ID [status] subject [owner: xxx] [blocked by #x, #y]

䜿甚瀺䟋

ctx := context.Background()

// Backend 应该是 session 绎床隔犻的
middleware, err := plantask.New(ctx, &plantask.Config{
    Backend: myBackend,
    BaseDir: "/tasks",
})
if err != nil {
    return err
}

agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
    Model:    myModel,
    Handlers: []adk.ChatModelAgentMiddleware{middleware},
})

兞型流皋

1. 收到倍杂任务
       │
       ▌
2. TaskCreate 创建倚䞪子任务
   - #1: 分析需求
   - #2: 实现代码
   - #3: 猖写测试
       │
       ▌
3. TaskUpdate 讟眮䟝赖
   - #2 addBlockedBy: ["1"]
   - #3 addBlockedBy: ["2"]
       │
       ▌
4. TaskList 查看可甚任务
       │
       ▌
5. TaskUpdate #1 → in_progress
       │
       ▌
6. 完成后 TaskUpdate #1 → completed
       │
       ▌
7. 埪环 4-6 盎到党郚完成
       │
       ▌
8. 党郚 completed → 自劚枅理所有文件

䟝赖管理

  • blocks: “我完成了这些任务才胜匀始”
  • blockedBy: “这些任务完成了我才胜匀始”

䟝赖写入是双向的对 Task A 执行 addBlocks: ["2"]䌚同时圚 Task #2 的 blockedBy 䞭写入 A 的 ID。

Task #1 (blocks: ["2"])  ────►  Task #2 (blockedBy: ["1"])

#1 完成后 #2 才胜匀始

埪环䟝赖检测通过 DFS 可蟟性刀断实现

#1 blocks #2
#2 blocks #1  ← 报错would create a cyclic dependency

实现细节

机制诎明
ID 分配
.highwatermark
文件存傚圓前最倧 ID创建时 +1
并发安党四䞪工具共享同䞀
sync.Mutex
同䞀 middleware 实䟋䞲行执行
文件栌匏每䞪任务䞀䞪
{id}.json
文件JSON 序列化䜿甚
sonic
自劚枅理TaskUpdate 将任务标记䞺 completed 后检查——若所有任务均 completed 则批量删陀
ID 校验纯数字正则
^\d+$
删陀级联删陀任务时遍历所有任务文件移陀对该 ID 的匕甚

倚语蚀支持

工具的 description 支持䞭英文双语通过党局讟眮切换

// 䜿甚䞭文 description
adk.SetLanguage(adk.LanguageChinese)

// 䜿甚英文 description默讀
adk.SetLanguage(adk.LanguageEnglish)

歀讟眮圱响所有 ADK 内眮的 prompt 和工具 description。