// because the view measures the real sizes. A call that fails before any line
// fails the build, and the core tries it again at the next message.
type Compactor struct {
- client *Client
+ client *ModelClient
model ModelConfig
- instructions string
- tools []Tool
+ instructions func() (string, error)
+ tools []ModelTool
}
-// 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 *ModelClient, instructions func() (string, error), model ModelConfig) *Compactor {
return &Compactor{
client: client,
model: model,
- instructions: prompt(name),
- tools: agentTools(),
+ instructions: instructions,
+ tools: promptTools(),
}
}
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 {
parts = append(parts, note)
}
- var response Response
- response, err = c.client.Create(ctx, Request{
+ var response ModelResponse
+ response, err = c.client.Create(ctx, ModelRequest{
Model: c.model.Model,
Effort: c.model.Effort,
- Instructions: c.instructions,
+ Instructions: instructions,
Tools: c.tools,
- Input: []any{userMessage(parts...)},
+ Input: []any{modelUserMessage(parts...)},
+ Node: &nodeKey{task.Level, task.Index},
})
if err != nil {
break