Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
kardolus
GitHub Repository: kardolus/chatgpt-cli
Path: blob/main/agent/factory/factory.go
3434 views
1
package factory
2
3
import (
4
"context"
5
"fmt"
6
"github.com/kardolus/chatgpt-cli/agent/core"
7
"github.com/kardolus/chatgpt-cli/agent/planexec"
8
"github.com/kardolus/chatgpt-cli/agent/react"
9
"github.com/kardolus/chatgpt-cli/agent/tools"
10
)
11
12
type Agent interface {
13
RunAgentGoal(ctx context.Context, goal string) (string, error)
14
}
15
16
type Mode string
17
18
const (
19
ModePlanExecute Mode = "plan_execute"
20
ModeReAct Mode = "react"
21
)
22
23
type Deps struct {
24
Clock core.Clock
25
Planner planexec.Planner
26
LLM tools.LLM
27
Runner core.Runner
28
Budget core.Budget
29
}
30
31
func validateDepsForMode(mode Mode, deps Deps) error {
32
if deps.Clock == nil {
33
return fmt.Errorf("agent deps: Clock is required")
34
}
35
36
switch mode {
37
case ModePlanExecute:
38
if deps.Planner == nil {
39
return fmt.Errorf("agent deps: Planner is required for mode %q", mode)
40
}
41
if deps.Runner == nil {
42
return fmt.Errorf("agent deps: Runner is required for mode %q", mode)
43
}
44
return nil
45
46
case ModeReAct:
47
if deps.LLM == nil {
48
return fmt.Errorf("agent deps: LLM is required for mode %q", mode)
49
}
50
if deps.Runner == nil {
51
return fmt.Errorf("agent deps: Runner is required for mode %q", mode)
52
}
53
if deps.Budget == nil {
54
return fmt.Errorf("agent deps: Budget is required for mode %q", mode)
55
}
56
return nil
57
58
default:
59
return fmt.Errorf("unknown agent mode: %q", mode)
60
}
61
}
62
63
func New(mode Mode, deps Deps, baseOpts ...core.BaseOption) (Agent, error) {
64
if err := validateDepsForMode(mode, deps); err != nil {
65
return nil, err
66
}
67
68
base := core.NewBaseAgent(deps.Clock)
69
for _, o := range baseOpts {
70
o(base)
71
}
72
73
switch mode {
74
case ModePlanExecute:
75
return &planexec.PlanExecuteAgent{BaseAgent: base, Planner: deps.Planner, Runner: deps.Runner}, nil
76
case ModeReAct:
77
return &react.ReActAgent{BaseAgent: base, LLM: deps.LLM, Runner: deps.Runner, Budget: deps.Budget}, nil
78
default:
79
return nil, fmt.Errorf("unknown agent mode: %q", mode)
80
}
81
}
82
83