| package dodo_tools |
| |
| import ( |
| "context" |
| "encoding/json" |
| "fmt" |
| "io" |
| "net/http" |
| |
| "sketch.dev/llm" |
| ) |
| |
| type GetProjectConfigTool struct { |
| } |
| |
| const ( |
| getProjectSchemaInputSchema = ` |
| { |
| "type": "object", |
| "properties": { |
| "apiBaseAddress": { |
| "type": "string", |
| "description": "The base address of the dodo API" |
| }, |
| "projectId": { |
| "type": "string", |
| "description": "The ID of the dodo project to get infrastructure configuration." |
| } |
| }, |
| "required": ["apiBaseAddress", "projectId"] |
| } |
| ` |
| ) |
| |
| func NewGetProjectConfigTool() *llm.Tool { |
| tool := &GetProjectConfigTool{} |
| return &llm.Tool{ |
| Name: "dodo_get_project_config", |
| Description: "A tool for getting current state of the infrastructure configuration of a dodo project", |
| InputSchema: llm.MustSchema(getProjectSchemaInputSchema), |
| Run: tool.Run, |
| EndsTurn: true, |
| } |
| } |
| |
| type GetProjectConfigInput struct { |
| ApiBaseAddress string `json:"apiBaseAddress"` |
| ProjectId string `json:"projectId"` |
| } |
| |
| type GetProjectConfigOutput struct { |
| Config string `json:"config"` |
| } |
| |
| func (d *GetProjectConfigTool) Run(ctx context.Context, m json.RawMessage) ([]llm.Content, error) { |
| var input GetProjectConfigInput |
| if err := json.Unmarshal(m, &input); err != nil { |
| return nil, err |
| } |
| resp, err := http.Get(fmt.Sprintf("%s/api/project/%s/config", input.ApiBaseAddress, input.ProjectId)) |
| if err != nil { |
| return nil, err |
| } |
| defer resp.Body.Close() |
| body, err := io.ReadAll(resp.Body) |
| if err != nil { |
| return nil, err |
| } |
| if resp.StatusCode != http.StatusOK { |
| return nil, fmt.Errorf("failed to get project config: %s", string(body)) |
| } |
| var config map[string]interface{} |
| if err := json.Unmarshal(body, &config); err != nil { |
| return nil, fmt.Errorf("got invalid project config: %s %s", err, string(body)) |
| } |
| output := GetProjectConfigOutput{ |
| Config: string(body), |
| } |
| jsonOutput, err := json.Marshal(output) |
| if err != nil { |
| return nil, err |
| } |
| return llm.TextContent(string(jsonOutput)), nil |
| } |