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ã