"time"
)
-// modelClient sends model calls.
-type modelClient interface {
- Create(ctx context.Context, request Request) (Response, error)
+// TurnClient sends model calls.
+type TurnClient interface {
+ Create(ctx context.Context, request ModelRequest) (ModelResponse, error)
}
// Event tells the clients what the agent does as it happens. Kind is the kind
type loop struct {
agent *Agent
memory *Memory
- client modelClient
+ client TurnClient
tools *toolbox
layout *viewLayout
clock func() time.Time
// newLoop returns the loop of agent with its memory. Its calls go through
// client, and notify gets each event. The clock gives the date of a turn.
-func newLoop(agent *Agent, memory *Memory, client modelClient, clock func() time.Time, notify func(Event)) (*loop, error) {
+func newLoop(agent *Agent, memory *Memory, client TurnClient, clock func() time.Time, notify func(Event)) (*loop, error) {
layout, err := loadLayout(filepath.Join(agent.dir, layoutFileName))
if err != nil {
return nil, err
input := turnInput(view, l.state(), messages)
for turn := "first"; ; turn = "next" {
- response, err := l.client.Create(ctx, Request{
+ response, err := l.client.Create(ctx, ModelRequest{
Model: l.agent.config.Model,
Effort: l.agent.config.Effort,
Instructions: instructions,
// input of the next request: input, the output items, the tool results, and
// the user messages that came in the meantime. After the final answer it
// returns no input.
-func (l *loop) handle(ctx context.Context, input []any, response Response) ([]any, error) {
+func (l *loop) handle(ctx context.Context, input []any, response ModelResponse) ([]any, error) {
var outputs []any
for _, raw := range response.Output {
item, err := inputItem(raw)
switch call.Type {
case "message":
- text, err := outputText([]json.RawMessage{raw})
+ text, err := modelOutputText([]json.RawMessage{raw})
if err != nil {
return nil, err
}
input = append(input, outputs...)
for _, message := range l.take() {
- input = append(input, userMessage(message.Text))
+ input = append(input, modelUserMessage(message.Text))
}
return input, nil
func turnInput(view []string, state string, messages []Message) []any {
input := make([]any, 0, len(view)+1+len(messages))
for _, text := range view {
- input = append(input, userMessage(text))
+ input = append(input, modelUserMessage(text))
}
- input = append(input, userMessage(state))
+ input = append(input, modelUserMessage(state))
for _, message := range messages {
- input = append(input, userMessage(message.Text))
+ input = append(input, modelUserMessage(message.Text))
}
return input