X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/f5c601f1801aaa276f8c335fcb51c373edc0b50c..d7f6fba630444f5065f59cd3729feab92c7798aa:/agent.go?ds=inline diff --git a/agent.go b/agent.go index 8226a43..13491c1 100644 --- a/agent.go +++ b/agent.go @@ -115,11 +115,6 @@ func (a *Agent) Voices() *VoiceStore { return &VoiceStore{dir: filepath.Join(filepath.Dir(root), voiceDirName)} } -// CacheKey returns the prompt cache key of every model call of the agent. -func (a *Agent) CacheKey() string { - return "onechat-" + a.config.ID -} - // Prompt returns the system prompt of the agent with the user's instructions // from instructions.md. It reads the file on each call, so a change applies at // the next call. A missing file means no instructions. @@ -141,6 +136,17 @@ func (a *Agent) Prompt() (string, error) { return prompt(a.config.Name, path, instructions), nil } +// instructions reads the user's instructions from instructions.md. A missing +// file means no instructions. +func (a *Agent) instructions() (string, error) { + data, err := os.ReadFile(filepath.Join(a.dir, agentInstructionsFileName)) + if err != nil && !errors.Is(err, os.ErrNotExist) { + return "", fmt.Errorf("read instructions: %w", err) + } + + return string(data), nil +} + // Tools returns the tools shared by the turns and compactions of this agent. A // child has no image output, WhatsApp, child creation, or route tools. func (a *Agent) Tools() []ModelTool { @@ -213,6 +219,11 @@ func (a *Agent) Children() ([]*Agent, error) { return children, nil } +// CacheKey returns the prompt cache key of every model call of the agent. +func (a *Agent) CacheKey() string { + return "onechat-" + a.config.ID +} + // CreateChild writes a new direct child with its own ID and the model, effort, // and working directory of the root. Child and subagent names share a // namespace. The config is complete before an atomic rename publishes the @@ -299,17 +310,6 @@ func (a *Agent) SubagentPrompt() (string, error) { return promptSubagent(a.config.Name, instructions), nil } -// instructions reads the user's instructions from instructions.md. A missing -// file means no instructions. -func (a *Agent) instructions() (string, error) { - data, err := os.ReadFile(filepath.Join(a.dir, agentInstructionsFileName)) - if err != nil && !errors.Is(err, os.ErrNotExist) { - return "", fmt.Errorf("read instructions: %w", err) - } - - return string(data), nil -} - // validate makes sure that each setting has a valid value. func (c AgentConfig) validate() error { if c.Name == "" || strings.ContainsAny(c.Name, "\r\n") { @@ -340,6 +340,33 @@ func (c AgentConfig) validate() error { return nil } +// createAgent writes the config.json of a new agent in dir with the defaults +// and a new ID. +func createAgent(dir string) (*Agent, error) { + config, err := defaultAgentConfig() + if err != nil { + return nil, err + } + + return writeAgent(dir, config) +} + +// defaultAgentConfig returns the settings of a new agent, without an ID. The +// commands run in the home directory of the user. +func defaultAgentConfig() (AgentConfig, error) { + home, err := os.UserHomeDir() + if err != nil { + return AgentConfig{}, fmt.Errorf("find working directory: %w", err) + } + + return AgentConfig{ + Name: "OneChat", + Model: "gpt-6.1-sol", + Effort: "medium", + Workdir: home, + }, nil +} + // agentChildNameValid accepts one word of 2 to 32 ASCII letters with an initial // capital letter. Child names describe their area. func agentChildNameValid(name string) bool { @@ -357,17 +384,6 @@ func agentChildNameValid(name string) bool { return true } -// createAgent writes the config.json of a new agent in dir with the defaults -// and a new ID. -func createAgent(dir string) (*Agent, error) { - config, err := defaultAgentConfig() - if err != nil { - return nil, err - } - - return writeAgent(dir, config) -} - // writeAgent gives config a new ID and writes it in dir. func writeAgent(dir string, config AgentConfig) (*Agent, error) { id := make([]byte, agentIDBytes) @@ -392,19 +408,3 @@ func writeAgent(dir string, config AgentConfig) (*Agent, error) { config: config, }, nil } - -// defaultAgentConfig returns the settings of a new agent, without an ID. The -// commands run in the home directory of the user. -func defaultAgentConfig() (AgentConfig, error) { - home, err := os.UserHomeDir() - if err != nil { - return AgentConfig{}, fmt.Errorf("find working directory: %w", err) - } - - return AgentConfig{ - Name: "OneChat", - Model: "gpt-6.1-sol", - Effort: "medium", - Workdir: home, - }, nil -}