11 "github.com/charmbracelet/crush/internal/agent/prompt"
12 "github.com/charmbracelet/crush/internal/agent/tools"
13 "github.com/charmbracelet/crush/internal/config"
16//go:embed templates/agent_tool.md
17var agentToolDescription []byte
19type AgentParams struct {
20 Prompt string `json:"prompt" description:"The task for the agent to perform"`
24 AgentToolName = "agent"
27func (c *coordinator) agentTool(ctx context.Context) (fantasy.AgentTool, error) {
28 agentCfg, ok := c.cfg.Agents[config.AgentTask]
30 return nil, errors.New("task agent not configured")
32 prompt, err := taskPrompt(prompt.WithWorkingDir(c.cfg.WorkingDir()))
37 agent, err := c.buildAgent(ctx, prompt, agentCfg)
41 return fantasy.NewParallelAgentTool(
43 string(agentToolDescription),
44 func(ctx context.Context, params AgentParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
45 if params.Prompt == "" {
46 return fantasy.NewTextErrorResponse("prompt is required"), nil
49 sessionID := tools.GetSessionFromContext(ctx)
51 return fantasy.ToolResponse{}, errors.New("session id missing from context")
54 agentMessageID := tools.GetMessageFromContext(ctx)
55 if agentMessageID == "" {
56 return fantasy.ToolResponse{}, errors.New("agent message id missing from context")
59 agentToolSessionID := c.sessions.CreateAgentToolSessionID(agentMessageID, call.ID)
60 session, err := c.sessions.CreateTaskSession(ctx, agentToolSessionID, sessionID, "New Agent Session")
62 return fantasy.ToolResponse{}, fmt.Errorf("error creating session: %s", err)
64 model := agent.Model()
65 maxTokens := model.CatwalkCfg.DefaultMaxTokens
66 if model.ModelCfg.MaxTokens != 0 {
67 maxTokens = model.ModelCfg.MaxTokens
70 providerCfg, ok := c.cfg.Providers.Get(model.ModelCfg.Provider)
72 return fantasy.ToolResponse{}, errors.New("model provider not configured")
74 result, err := agent.Run(ctx, SessionAgentCall{
75 SessionID: session.ID,
76 Prompt: params.Prompt,
77 MaxOutputTokens: maxTokens,
78 ProviderOptions: getProviderOptions(model, providerCfg),
79 Temperature: model.ModelCfg.Temperature,
80 TopP: model.ModelCfg.TopP,
81 TopK: model.ModelCfg.TopK,
82 FrequencyPenalty: model.ModelCfg.FrequencyPenalty,
83 PresencePenalty: model.ModelCfg.PresencePenalty,
86 return fantasy.NewTextErrorResponse("error generating response"), nil
88 updatedSession, err := c.sessions.Get(ctx, session.ID)
90 return fantasy.ToolResponse{}, fmt.Errorf("error getting session: %s", err)
92 parentSession, err := c.sessions.Get(ctx, sessionID)
94 return fantasy.ToolResponse{}, fmt.Errorf("error getting parent session: %s", err)
97 parentSession.Cost += updatedSession.Cost
99 _, err = c.sessions.Save(ctx, parentSession)
101 return fantasy.ToolResponse{}, fmt.Errorf("error saving parent session: %s", err)
103 return fantasy.NewTextResponse(result.Response.Content.Text()), nil
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list