]> git.giacomolli.uk - onechat/blobdiff - compactor.go
Exit with status 0 when a signal stops the daemon
[onechat] / compactor.go
index 6840fd41a2c53726acfc87a96b75db6857aa3a1c..e899c094ee58ad0036cdd7443fac632a9b903df9 100644 (file)
@@ -30,17 +30,18 @@ var ruler = strings.Repeat("-", nodeBytes)
 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(),
        }
 }
@@ -53,6 +54,11 @@ func (c *Compactor) Summarize(ctx context.Context, task Task) (string, error) {
                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 {
@@ -65,9 +71,10 @@ func (c *Compactor) Summarize(ctx context.Context, task Task) (string, error) {
                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
@@ -129,7 +136,7 @@ func tooLong(line string) string {
        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