X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/2a276c273c21a1752d541bf87e074c5d1c27e30f..7b8d8e8f4b57bd51fd6d0f0d926b821f06b0e1f0:/daemon_agent.go?ds=inline diff --git a/daemon_agent.go b/daemon_agent.go index 1161c8a..227d23b 100644 --- a/daemon_agent.go +++ b/daemon_agent.go @@ -55,12 +55,12 @@ func openDaemonAgents(ctx context.Context, dir, address string, auth ModelAuthor // one agent. All model calls use its cache key and usage file. func openDaemonAgent(ctx context.Context, agent *Agent, address string, auth ModelAuthorizer, compactor ModelConfig, clock func() time.Time, logger *slog.Logger) (*DaemonAgent, error) { client := newModelClient(address, auth, agent.CacheKey(), filepath.Join(agent.dir, "usage.jsonl")) - memory, err := openMemory(ctx, agent.dir, clock, newCompactor(client, agent.Prompt, compactor, agent.Tools()), logger) + memory, err := openMemory(ctx, agent.dir, clock, newCompactor(client, agent.Prompt, compactor, agent.Tools(), agent.Images()), logger) if err != nil { return nil, fmt.Errorf("open memory: %w", err) } - schedules, err := openSchedules(filepath.Join(agent.dir, scheduleFileName), clock, logger) + schedules, err := openSchedules(filepath.Join(agent.dir, scheduleFileName), agent.config.Name, clock, logger) if err != nil { return nil, errors.Join(fmt.Errorf("open schedules: %w", err), memory.Close()) } @@ -73,6 +73,9 @@ func openDaemonAgent(ctx context.Context, agent *Agent, address string, auth Mod schedules: schedules, clock: clock, logger: logger, + openChild: func(ctx context.Context, child *Agent) (*DaemonAgent, error) { + return openDaemonAgent(ctx, child, address, auth, compactor, clock, logger.With("name", child.config.Name)) + }, }, nil } @@ -86,12 +89,20 @@ type DaemonAgent struct { schedules *Schedules clock func() time.Time logger *slog.Logger + openChild func(context.Context, *Agent) (*DaemonAgent, error) } // Loop makes the turn loop with its event destination. Only the root has a // WhatsApp link. Child events stay with their own logs. func (a *DaemonAgent) Loop(whatsapp *WhatsApp, notify func(Event)) (*TurnLoop, error) { - return newTurnLoop(a.agent, a.memory, a.subagents, whatsapp, a.schedules, a.client, a.clock, a.logger, notify) + loop, err := newTurnLoop(a.agent, a.memory, a.subagents, whatsapp, a.schedules, a.client, a.clock, a.logger, notify) + if err != nil { + return nil, err + } + + loop.openChild = a.openChild + + return loop, nil } // Close flushes and closes the subagents and the memory.