diff options
Diffstat (limited to 'web/openai/assistant/run.go')
| -rw-r--r-- | web/openai/assistant/run.go | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/web/openai/assistant/run.go b/web/openai/assistant/run.go new file mode 100644 index 0000000..39d74f2 --- /dev/null +++ b/web/openai/assistant/run.go @@ -0,0 +1,189 @@ +package assistant + +import ( + "bytes" + "context" + "encoding/json" + "net/http" + + "within.website/x/web" +) + +type RunStatus string + +const ( + RunStatusQueued RunStatus = "queued" + RunStatusInProgress RunStatus = "in_progress" + RunStatusRequiresAction RunStatus = "requires_action" + RunStatusCancelling RunStatus = "cancelling" + RunStatusCancelled RunStatus = "cancelled" + RunStatusFailed RunStatus = "failed" + RunStatusCompleted RunStatus = "completed" + RunStatusExpired RunStatus = "expired" +) + +type RequiredAction struct { + Type string `json:"type"` + SubmitToolOutputs []ToolCall `json:"submit_tool_outputs"` +} + +type ToolCall struct { + ID string `json:"id"` + Type string `json:"type"` + Function ToolCallFunction `json:"function"` +} + +type ToolCallFunction struct { + Name string `json:"name"` + Arguments []string `json:"arguments"` +} + +type ToolOutput struct { + ToolCallID string `json:"tool_call_id"` + Output string `json:"output"` +} + +type Run struct { + ID string `json:"id"` + Object string `json:"object"` + CreatedAt int64 `json:"created_at"` + AssistantID string `json:"assistant_id"` + ThreadID string `json:"thread_id"` + Status RunStatus `json:"status"` + StartedAt int64 `json:"started_at"` + ExpiresAt *int64 `json:"expires_at,omitempty"` + CancelledAt *int64 `json:"cancelled_at,omitempty"` + FailedAt *int64 `json:"failed_at,omitempty"` + LastError *string `json:"last_error,omitempty"` + Model string `json:"model"` + Instructions *string `json:"instructions,omitempty"` + Tools []Tool `json:"tools"` + FileIDs []string `json:"file_ids"` + Metadata map[string]string `json:"metadata"` +} + +func (c *Client) CreateRun(ctx context.Context, tid, aid string) (*Run, error) { + type request struct { + AssistantID string `json:"assistant_id"` + } + + buf := new(bytes.Buffer) + if err := json.NewEncoder(buf).Encode(request{aid}); err != nil { + return nil, err + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.openai.com/v1/threads/"+tid+"/runs", buf) + if err != nil { + return nil, err + } + + resp, err := c.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, web.NewError(http.StatusOK, resp) + } + + var result Run + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + + return &result, nil +} + +func (c *Client) GetRun(ctx context.Context, tid, rid string) (*Run, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://api.openai.com/v1/threads/"+tid+"/runs/"+rid, nil) + if err != nil { + return nil, err + } + + resp, err := c.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, web.NewError(http.StatusOK, resp) + } + + var result Run + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + + return &result, nil +} + +func (c *Client) CancelRun(ctx context.Context, tid, rid string) error { + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.openai.com/v1/threads/"+tid+"/runs/"+rid+"/cancel", nil) + if err != nil { + return err + } + + resp, err := c.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return web.NewError(http.StatusOK, resp) + } + + return nil +} + +func (c *Client) ListRuns(ctx context.Context, tid string) ([]Run, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://api.openai.com/v1/threads/"+tid+"/runs", nil) + if err != nil { + return nil, err + } + + resp, err := c.Do(req) + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusOK { + return nil, web.NewError(http.StatusOK, resp) + } + + var result struct { + Data []Run `json:"data"` + } + + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + + return result.Data, nil +} + +func (c *Client) SubmitToolOutput(ctx context.Context, tid, rid string, to ToolOutput) error { + buf := new(bytes.Buffer) + if err := json.NewEncoder(buf).Encode(to); err != nil { + return err + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.openai.com/v1/threads/"+tid+"/runs/"+rid+"/submit_tool_output", buf) + if err != nil { + return err + } + + resp, err := c.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return web.NewError(http.StatusOK, resp) + } + + return nil +} |
