mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
feat: add the /aitasks/prompts endpoint (#18464)
Add an endpoint to fetch AI task prompts for multiple workspace builds at the same time. A prompt is the value of the "AI Prompt" workspace build parameter. On main, the only way our API allows fetching workspace build parameters is by using the `/workspacebuilds/$build_id/parameters` endpoint, requiring a separate API call for every build. The Tasks dashboard fetches Task workspaces in order to show them in a list, and then needs to fetch the value of the `AI Prompt` parameter for every task workspace (using its latest build id), requiring an additional API call for each list item. This endpoint will allow the dashboard to make just 2 calls to render the list: one to fetch task workspaces, the other to fetch prompts. <img width="1512" alt="Screenshot 2025-06-20 at 11 33 11" src="https://github.com/user-attachments/assets/92899999-e922-44c5-8325-b4b23a0d2bff" /> Related to https://github.com/coder/internal/issues/660.
This commit is contained in:
46
codersdk/aitasks.go
Normal file
46
codersdk/aitasks.go
Normal file
@ -0,0 +1,46 @@
|
||||
package codersdk
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/google/uuid"
|
||||
|
||||
"github.com/coder/terraform-provider-coder/v2/provider"
|
||||
)
|
||||
|
||||
const AITaskPromptParameterName = provider.TaskPromptParameterName
|
||||
|
||||
type AITasksPromptsResponse struct {
|
||||
// Prompts is a map of workspace build IDs to prompts.
|
||||
Prompts map[string]string `json:"prompts"`
|
||||
}
|
||||
|
||||
// AITaskPrompts returns prompts for multiple workspace builds by their IDs.
|
||||
func (c *ExperimentalClient) AITaskPrompts(ctx context.Context, buildIDs []uuid.UUID) (AITasksPromptsResponse, error) {
|
||||
if len(buildIDs) == 0 {
|
||||
return AITasksPromptsResponse{
|
||||
Prompts: make(map[string]string),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Convert UUIDs to strings and join them
|
||||
buildIDStrings := make([]string, len(buildIDs))
|
||||
for i, id := range buildIDs {
|
||||
buildIDStrings[i] = id.String()
|
||||
}
|
||||
buildIDsParam := strings.Join(buildIDStrings, ",")
|
||||
|
||||
res, err := c.Request(ctx, http.MethodGet, "/api/experimental/aitasks/prompts", nil, WithQueryParam("build_ids", buildIDsParam))
|
||||
if err != nil {
|
||||
return AITasksPromptsResponse{}, err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
if res.StatusCode != http.StatusOK {
|
||||
return AITasksPromptsResponse{}, ReadBodyAsError(res)
|
||||
}
|
||||
var prompts AITasksPromptsResponse
|
||||
return prompts, json.NewDecoder(res.Body).Decode(&prompts)
|
||||
}
|
14
codersdk/client_experimental.go
Normal file
14
codersdk/client_experimental.go
Normal file
@ -0,0 +1,14 @@
|
||||
package codersdk
|
||||
|
||||
// ExperimentalClient is a client for the experimental API.
|
||||
// Its interface is not guaranteed to be stable and may change at any time.
|
||||
// @typescript-ignore ExperimentalClient
|
||||
type ExperimentalClient struct {
|
||||
*Client
|
||||
}
|
||||
|
||||
func NewExperimentalClient(client *Client) *ExperimentalClient {
|
||||
return &ExperimentalClient{
|
||||
Client: client,
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user