type Compactor struct {
client *Client
model ModelConfig
- instructions string
+ instructions func() (string, error)
tools []Tool
}
-// newCompactor returns the compactor of the agent name, which sends its calls
-// through client with model.
-func newCompactor(client *Client, name string, model ModelConfig) *Compactor {
+// newCompactor returns the compactor of an agent, which sends its calls through
+// client with model. instructions gives the system prompt of the agent at each
+// build, so a build sends the same prompt as the turns of that time.
+func newCompactor(client *Client, instructions func() (string, error), model ModelConfig) *Compactor {
return &Compactor{
client: client,
model: model,
- instructions: prompt(name),
+ instructions: instructions,
tools: agentTools(),
}
}
return "", err
}
+ instructions, err := c.instructions()
+ if err != nil {
+ return "", fmt.Errorf("compact node (%d, %d): %w", task.Level, task.Index, err)
+ }
+
var lines []string
note := ""
for len(lines) < compactionTries {
response, err = c.client.Create(ctx, Request{
Model: c.model.Model,
Effort: c.model.Effort,
- Instructions: c.instructions,
+ Instructions: instructions,
Tools: c.tools,
Input: []any{userMessage(parts...)},
+ Node: &nodeKey{task.Level, task.Index},
})
if err != nil {
break
return fmt.Sprintf(`Too long: your last line for this <input> was %d bytes,
over the %d-byte limit. Write the whole line again, cutting just
enough of the least valuable items to fit before this cut:
-%s| ← LIMIT`, len(line), nodeBytes, cutLine(line))
+%s| <- LIMIT`, len(line), nodeBytes, cutLine(line))
}
// cutLine returns the first nodeBytes bytes of line, without a part of a