From 1d180d34c63b15dbacbb8b6852071a57120cec35 Mon Sep 17 00:00:00 2001 From: Simone Vellei Date: Tue, 7 Nov 2023 08:39:44 +0100 Subject: [PATCH 1/6] chore: implement assistants API --- assistant.go | 252 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 assistant.go diff --git a/assistant.go b/assistant.go new file mode 100644 index 000000000..cf8d123f4 --- /dev/null +++ b/assistant.go @@ -0,0 +1,252 @@ +package openai + +import ( + "context" + "fmt" + "net/http" + "net/url" +) + +const ( + assistantsPath = "/assistants" + assistantsFilesPath = "/files" +) + +type Assistant struct { + ID string `json:"id"` + Object string `json:"object"` + CreatedAt int64 `json:"created_at"` + Name *string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` + Model string `json:"model"` + Instructions *string `json:"instructions,omitempty"` + Tools []any `json:"tools,omitempty"` + + httpHeader +} + +type AssistantTool struct { + Type string `json:"type"` +} + +type AssistantToolCodeInterpreter struct { + AssistantTool +} + +type AssistantToolRetrieval struct { + AssistantTool +} + +type AssistantToolFunction struct { + AssistantTool + Function FunctionDefinition `json:"function"` +} + +type AssistantRequest struct { + Model string `json:"model"` + Name *string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` + Instructions *string `json:"instructions,omitempty"` + Tools []any `json:"tools,omitempty"` + FileIDs []string `json:"file_ids,omitempty"` + Metadata map[string]any `json:"metadata,omitempty"` +} + +// AssistantsList is a list of assistants. +type AssistantsList struct { + Assistants []Assistant `json:"data"` + + httpHeader +} + +type AssistantFile struct { + ID string `json:"id"` + Object string `json:"object"` + CreatedAt int64 `json:"created_at"` + AssistantID string `json:"assistant_id"` + + httpHeader +} + +type AssistantFileRequest struct { + FileID string `json:"file_id"` +} + +type AssistantFilesList struct { + AssistantFiles []AssistantFile `json:"data"` + + httpHeader +} + +// CreateAssistant creates a new assistant. +func (c *Client) CreateAssistant(ctx context.Context, request AssistantRequest) (response Assistant, err error) { + req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsPath), withBody(request)) + if err != nil { + return + } + + err = c.sendRequest(req, &response) + return +} + +// RetrieveAssistant retrieves an assistant. +func (c *Client) RetrieveAssistant( + ctx context.Context, + assistantID string, +) (response Assistant, err error) { + req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsPath+"/"+assistantID)) + if err != nil { + return + } + + err = c.sendRequest(req, &response) + return +} + +// ModifyAssistant modifies an assistant. +func (c *Client) ModifyAssistant( + ctx context.Context, + assistantID string, + request AssistantRequest, +) (response Assistant, err error) { + req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsPath+"/"+assistantID), withBody(request)) + if err != nil { + return + } + + err = c.sendRequest(req, &response) + return +} + +// DeleteAssistant deletes an assistant. +func (c *Client) DeleteAssistant( + ctx context.Context, + assistantID string, +) (response Assistant, err error) { + req, err := c.newRequest(ctx, http.MethodDelete, c.fullURL(assistantsPath+"/"+assistantID)) + if err != nil { + return + } + + err = c.sendRequest(req, &response) + return +} + +// ListFiles Lists the currently available files, +// and provides basic information about each file such as the file name and purpose. +func (c *Client) ListAssistants( + ctx context.Context, + limit *int, + order *string, + after *string, + before *string, +) (reponse AssistantsList, err error) { + urlValues := url.Values{} + if limit != nil { + urlValues.Add("limit", fmt.Sprintf("%d", *limit)) + } + if order != nil { + urlValues.Add("order", *order) + } + if after != nil { + urlValues.Add("after", *after) + } + if before != nil { + urlValues.Add("before", *before) + } + + encodedValues := "" + if len(urlValues) > 0 { + encodedValues = "?" + urlValues.Encode() + } + + req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(assistantsPath+encodedValues)) + if err != nil { + return + } + + err = c.sendRequest(req, &reponse) + return +} + +func (c *Client) CreateAssistantFile( + ctx context.Context, + assistantID string, + request AssistantFileRequest, +) (response AssistantFile, err error) { + req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsPath+"/"+assistantID+assistantsPath), + withBody(request)) + if err != nil { + return + } + + err = c.sendRequest(req, &response) + return +} + +func (c *Client) RetrieveAssistantFile( + ctx context.Context, + assistantID string, + fileID string, +) (response AssistantFile, err error) { + req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(assistantsPath+"/"+ + assistantID+assistantsFilesPath+"/"+fileID)) + if err != nil { + return + } + + err = c.sendRequest(req, &response) + return +} + +func (c *Client) DeleteAssistantFile( + ctx context.Context, + assistantID string, + fileID string, +) (err error) { + req, err := c.newRequest(ctx, http.MethodDelete, c.fullURL(assistantsPath+"/"+ + assistantID+assistantsFilesPath+"/"+fileID)) + if err != nil { + return + } + + err = c.sendRequest(req, nil) + return +} + +func (c *Client) ListAssistantFiles( + ctx context.Context, + assistantID string, + limit *int, + order *string, + after *string, + before *string, +) (response AssistantFilesList, err error) { + urlValues := url.Values{} + if limit != nil { + urlValues.Add("limit", fmt.Sprintf("%d", *limit)) + } + if order != nil { + urlValues.Add("order", *order) + } + if after != nil { + urlValues.Add("after", *after) + } + if before != nil { + urlValues.Add("before", *before) + } + + encodedValues := "" + if len(urlValues) > 0 { + encodedValues = "?" + urlValues.Encode() + } + + req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(assistantsPath+"/"+ + assistantID+"/files"+encodedValues)) + if err != nil { + return + } + + err = c.sendRequest(req, &response) + return +} From 5a2fe61712b114427d0b38687303b320e7e14e69 Mon Sep 17 00:00:00 2001 From: Simone Vellei Date: Tue, 7 Nov 2023 09:00:44 +0100 Subject: [PATCH 2/6] fix --- assistant.go | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/assistant.go b/assistant.go index cf8d123f4..c157b5a8f 100644 --- a/assistant.go +++ b/assistant.go @@ -8,8 +8,8 @@ import ( ) const ( - assistantsPath = "/assistants" - assistantsFilesPath = "/files" + assistantsSuffix = "/assistants" + assistantsFilesSuffix = "/files" ) type Assistant struct { @@ -80,7 +80,7 @@ type AssistantFilesList struct { // CreateAssistant creates a new assistant. func (c *Client) CreateAssistant(ctx context.Context, request AssistantRequest) (response Assistant, err error) { - req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsPath), withBody(request)) + req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsSuffix), withBody(request)) if err != nil { return } @@ -94,7 +94,8 @@ func (c *Client) RetrieveAssistant( ctx context.Context, assistantID string, ) (response Assistant, err error) { - req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsPath+"/"+assistantID)) + urlSuffix := fmt.Sprintf("%s/%s", assistantsSuffix, assistantID) + req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix)) if err != nil { return } @@ -109,7 +110,8 @@ func (c *Client) ModifyAssistant( assistantID string, request AssistantRequest, ) (response Assistant, err error) { - req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsPath+"/"+assistantID), withBody(request)) + urlSuffix := fmt.Sprintf("%s/%s", assistantsSuffix, assistantID) + req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix), withBody(request)) if err != nil { return } @@ -123,7 +125,8 @@ func (c *Client) DeleteAssistant( ctx context.Context, assistantID string, ) (response Assistant, err error) { - req, err := c.newRequest(ctx, http.MethodDelete, c.fullURL(assistantsPath+"/"+assistantID)) + urlSuffix := fmt.Sprintf("%s/%s", assistantsSuffix, assistantID) + req, err := c.newRequest(ctx, http.MethodDelete, c.fullURL(urlSuffix)) if err != nil { return } @@ -132,8 +135,7 @@ func (c *Client) DeleteAssistant( return } -// ListFiles Lists the currently available files, -// and provides basic information about each file such as the file name and purpose. +// ListAssistants Lists the currently available assistants, func (c *Client) ListAssistants( ctx context.Context, limit *int, @@ -160,7 +162,8 @@ func (c *Client) ListAssistants( encodedValues = "?" + urlValues.Encode() } - req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(assistantsPath+encodedValues)) + urlSuffix := fmt.Sprintf("%s%s", assistantsSuffix, encodedValues) + req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix)) if err != nil { return } @@ -169,12 +172,14 @@ func (c *Client) ListAssistants( return } +// CreateAssistantFile creates a new assistant file. func (c *Client) CreateAssistantFile( ctx context.Context, assistantID string, request AssistantFileRequest, ) (response AssistantFile, err error) { - req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(assistantsPath+"/"+assistantID+assistantsPath), + urlSuffix := fmt.Sprintf("%s/%s%s", assistantsSuffix, assistantID, assistantsFilesSuffix) + req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix), withBody(request)) if err != nil { return @@ -184,13 +189,14 @@ func (c *Client) CreateAssistantFile( return } +// RetrieveAssistantFile retrieves an assistant file. func (c *Client) RetrieveAssistantFile( ctx context.Context, assistantID string, fileID string, ) (response AssistantFile, err error) { - req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(assistantsPath+"/"+ - assistantID+assistantsFilesPath+"/"+fileID)) + urlSuffix := fmt.Sprintf("%s/%s%s/%s", assistantsSuffix, assistantID, assistantsFilesSuffix, fileID) + req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix)) if err != nil { return } @@ -199,13 +205,14 @@ func (c *Client) RetrieveAssistantFile( return } +// DeleteAssistantFile deletes an existing file. func (c *Client) DeleteAssistantFile( ctx context.Context, assistantID string, fileID string, ) (err error) { - req, err := c.newRequest(ctx, http.MethodDelete, c.fullURL(assistantsPath+"/"+ - assistantID+assistantsFilesPath+"/"+fileID)) + urlSuffix := fmt.Sprintf("%s/%s%s/%s", assistantsSuffix, assistantID, assistantsFilesSuffix, fileID) + req, err := c.newRequest(ctx, http.MethodDelete, c.fullURL(urlSuffix)) if err != nil { return } @@ -214,6 +221,7 @@ func (c *Client) DeleteAssistantFile( return } +// ListAssistantFiles Lists the currently available files for an assistant, func (c *Client) ListAssistantFiles( ctx context.Context, assistantID string, @@ -241,8 +249,8 @@ func (c *Client) ListAssistantFiles( encodedValues = "?" + urlValues.Encode() } - req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(assistantsPath+"/"+ - assistantID+"/files"+encodedValues)) + urlSuffix := fmt.Sprintf("%s/%s%s%s", assistantsSuffix, assistantID, assistantsFilesSuffix, encodedValues) + req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix)) if err != nil { return } From 2f25fc69bb5363da2a5bd8e13dbc8b3df8a21279 Mon Sep 17 00:00:00 2001 From: Simone Vellei Date: Tue, 7 Nov 2023 09:01:04 +0100 Subject: [PATCH 3/6] fix --- assistant.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assistant.go b/assistant.go index c157b5a8f..4c7594521 100644 --- a/assistant.go +++ b/assistant.go @@ -135,7 +135,7 @@ func (c *Client) DeleteAssistant( return } -// ListAssistants Lists the currently available assistants, +// ListAssistants Lists the currently available assistants func (c *Client) ListAssistants( ctx context.Context, limit *int, From 2a53288f2223cdb3ed90056536bac208192dbba0 Mon Sep 17 00:00:00 2001 From: Simone Vellei Date: Tue, 7 Nov 2023 10:00:41 +0100 Subject: [PATCH 4/6] chore: add tests --- assistant.go | 2 +- assistant_test.go | 204 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 assistant_test.go diff --git a/assistant.go b/assistant.go index 4c7594521..6179709a8 100644 --- a/assistant.go +++ b/assistant.go @@ -95,7 +95,7 @@ func (c *Client) RetrieveAssistant( assistantID string, ) (response Assistant, err error) { urlSuffix := fmt.Sprintf("%s/%s", assistantsSuffix, assistantID) - req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix)) + req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix)) if err != nil { return } diff --git a/assistant_test.go b/assistant_test.go new file mode 100644 index 000000000..97a045abc --- /dev/null +++ b/assistant_test.go @@ -0,0 +1,204 @@ +package openai_test + +import ( + "context" + + openai "github.com/sashabaranov/go-openai" + "github.com/sashabaranov/go-openai/internal/test/checks" + + "encoding/json" + "fmt" + "net/http" + "testing" +) + +// const testFineTuninigJobID = "fine-tuning-job-id" + +// TestAssistant Tests the assistant endpoint of the API using the mocked server. +func TestAssistant(t *testing.T) { + assistantID := "asst_abc123" + assistantName := "Ambrogio" + assistantDescription := "Ambrogio is a friendly assistant." + assitantInstructions := "You are a personal math tutor. When asked a question, write and run Python code to answer the question." + assistantFileID := "file-wB6RM6wHdA49HfS2DJ9fEyrH" + limit := 20 + order := "desc" + after := "asst_abc122" + before := "asst_abc124" + + client, server, teardown := setupOpenAITestServer() + defer teardown() + + server.RegisterHandler( + "/v1/assistants/"+assistantID+"/files/"+assistantFileID, + func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodGet { + resBytes, _ := json.Marshal(openai.AssistantFile{ + ID: assistantFileID, + Object: "assistant.file", + CreatedAt: 1234567890, + AssistantID: assistantID, + }) + fmt.Fprintln(w, string(resBytes)) + } else if r.Method == http.MethodDelete { + fmt.Fprintln(w, `{ + id: "file-wB6RM6wHdA49HfS2DJ9fEyrH", + object: "assistant.file.deleted", + deleted: true + }`) + } + }, + ) + + server.RegisterHandler( + "/v1/assistants/"+assistantID+"/files", + func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodGet { + resBytes, _ := json.Marshal(openai.AssistantFilesList{ + AssistantFiles: []openai.AssistantFile{ + { + ID: assistantFileID, + Object: "assistant.file", + CreatedAt: 1234567890, + AssistantID: assistantID, + }, + }, + }) + fmt.Fprintln(w, string(resBytes)) + } else if r.Method == http.MethodPost { + var request openai.AssistantFileRequest + err := json.NewDecoder(r.Body).Decode(&request) + checks.NoError(t, err, "Decode error") + + resBytes, _ := json.Marshal(openai.AssistantFile{ + ID: request.FileID, + Object: "assistant.file", + CreatedAt: 1234567890, + AssistantID: assistantID, + }) + fmt.Fprintln(w, string(resBytes)) + } + }, + ) + + server.RegisterHandler( + "/v1/assistants/"+assistantID, + func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodGet { + resBytes, _ := json.Marshal(openai.Assistant{ + ID: assistantID, + Object: "assistant", + CreatedAt: 1234567890, + Name: &assistantName, + Model: openai.GPT4TurboPreview, + Description: &assistantDescription, + Instructions: &assitantInstructions, + }) + fmt.Fprintln(w, string(resBytes)) + } else if r.Method == http.MethodPost { + var request openai.AssistantRequest + err := json.NewDecoder(r.Body).Decode(&request) + checks.NoError(t, err, "Decode error") + + resBytes, _ := json.Marshal(openai.Assistant{ + ID: assistantID, + Object: "assistant", + CreatedAt: 1234567890, + Name: request.Name, + Model: request.Model, + Description: request.Description, + Instructions: request.Instructions, + Tools: request.Tools, + }) + fmt.Fprintln(w, string(resBytes)) + } else if r.Method == http.MethodDelete { + fmt.Fprintln(w, `{ + "id": "asst_abc123", + "object": "assistant.deleted", + "deleted": true + }`) + } + }, + ) + + server.RegisterHandler( + "/v1/assistants", + func(w http.ResponseWriter, r *http.Request) { + + if r.Method == http.MethodPost { + var request openai.AssistantRequest + err := json.NewDecoder(r.Body).Decode(&request) + checks.NoError(t, err, "Decode error") + + resBytes, _ := json.Marshal(openai.Assistant{ + ID: assistantID, + Object: "assistant", + CreatedAt: 1234567890, + Name: request.Name, + Model: request.Model, + Description: request.Description, + Instructions: request.Instructions, + Tools: request.Tools, + }) + fmt.Fprintln(w, string(resBytes)) + } else if r.Method == http.MethodGet { + resBytes, _ := json.Marshal(openai.AssistantsList{ + Assistants: []openai.Assistant{ + { + ID: assistantID, + Object: "assistant", + CreatedAt: 1234567890, + Name: &assistantName, + Model: openai.GPT4TurboPreview, + Description: &assistantDescription, + Instructions: &assitantInstructions, + }, + }, + }) + fmt.Fprintln(w, string(resBytes)) + } + }, + ) + + ctx := context.Background() + + _, err := client.CreateAssistant(ctx, openai.AssistantRequest{ + Name: &assistantName, + Description: &assistantDescription, + Model: openai.GPT4TurboPreview, + Instructions: &assitantInstructions, + }) + checks.NoError(t, err, "CreateAssistant error") + + _, err = client.RetrieveAssistant(ctx, assistantID) + checks.NoError(t, err, "RetrieveAssistant error") + + _, err = client.ModifyAssistant(ctx, assistantID, openai.AssistantRequest{ + Name: &assistantName, + Description: &assistantDescription, + Model: openai.GPT4TurboPreview, + Instructions: &assitantInstructions, + }) + checks.NoError(t, err, "CreateAssistant error") + + _, err = client.DeleteAssistant(ctx, assistantID) + checks.NoError(t, err, "DeleteAssistant error") + + _, err = client.ListAssistants(ctx, &limit, &order, &after, &before) + checks.NoError(t, err, "ListAssistants error") + + _, err = client.CreateAssistantFile(ctx, assistantID, openai.AssistantFileRequest{ + FileID: assistantFileID, + }) + checks.NoError(t, err, "CreateAssistantFile error") + + _, err = client.ListAssistantFiles(ctx, assistantID, &limit, &order, &after, &before) + checks.NoError(t, err, "ListAssistantFiles error") + + _, err = client.RetrieveAssistantFile(ctx, assistantID, assistantFileID) + checks.NoError(t, err, "RetrieveAssistantFile error") + + err = client.DeleteAssistantFile(ctx, assistantID, assistantFileID) + checks.NoError(t, err, "DeleteAssistantFile error") + +} From 1c0f4e6149b4a29d888d508509f0a9c60df8bb88 Mon Sep 17 00:00:00 2001 From: Simone Vellei Date: Tue, 7 Nov 2023 10:10:31 +0100 Subject: [PATCH 5/6] fix tests --- assistant_test.go | 4 +--- client_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/assistant_test.go b/assistant_test.go index 97a045abc..9f839b2cb 100644 --- a/assistant_test.go +++ b/assistant_test.go @@ -12,8 +12,6 @@ import ( "testing" ) -// const testFineTuninigJobID = "fine-tuning-job-id" - // TestAssistant Tests the assistant endpoint of the API using the mocked server. func TestAssistant(t *testing.T) { assistantID := "asst_abc123" @@ -179,7 +177,7 @@ func TestAssistant(t *testing.T) { Model: openai.GPT4TurboPreview, Instructions: &assitantInstructions, }) - checks.NoError(t, err, "CreateAssistant error") + checks.NoError(t, err, "ModifyAssistant error") _, err = client.DeleteAssistant(ctx, assistantID) checks.NoError(t, err, "DeleteAssistant error") diff --git a/client_test.go b/client_test.go index 2c1d749ed..bff2597c5 100644 --- a/client_test.go +++ b/client_test.go @@ -274,6 +274,33 @@ func TestClientReturnsRequestBuilderErrors(t *testing.T) { {"DeleteFineTuneModel", func() (any, error) { return client.DeleteFineTuneModel(ctx, "") }}, + {"CreateAssistant", func() (any, error) { + return client.CreateAssistant(ctx, AssistantRequest{}) + }}, + {"RetrieveAssistant", func() (any, error) { + return client.RetrieveAssistant(ctx, "") + }}, + {"ModifyAssistant", func() (any, error) { + return client.ModifyAssistant(ctx, "", AssistantRequest{}) + }}, + {"DeleteAssistant", func() (any, error) { + return client.DeleteAssistant(ctx, "") + }}, + {"ListAssistants", func() (any, error) { + return client.ListAssistants(ctx, nil, nil, nil, nil) + }}, + {"CreateAssistantFile", func() (any, error) { + return client.CreateAssistantFile(ctx, "", AssistantFileRequest{}) + }}, + {"ListAssistantFiles", func() (any, error) { + return client.ListAssistantFiles(ctx, "", nil, nil, nil, nil) + }}, + {"RetrieveAssistantFile", func() (any, error) { + return client.RetrieveAssistantFile(ctx, "", "") + }}, + {"DeleteAssistantFile", func() (any, error) { + return nil, client.DeleteAssistantFile(ctx, "", "") + }}, } for _, testCase := range testCases { From 3a6803cda693a6bf68f3498479ec9d8b24a77b03 Mon Sep 17 00:00:00 2001 From: Simone Vellei Date: Tue, 7 Nov 2023 10:13:57 +0100 Subject: [PATCH 6/6] fix linting --- assistant.go | 4 ++-- assistant_test.go | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/assistant.go b/assistant.go index 6179709a8..d75eebef3 100644 --- a/assistant.go +++ b/assistant.go @@ -135,7 +135,7 @@ func (c *Client) DeleteAssistant( return } -// ListAssistants Lists the currently available assistants +// ListAssistants Lists the currently available assistants. func (c *Client) ListAssistants( ctx context.Context, limit *int, @@ -221,7 +221,7 @@ func (c *Client) DeleteAssistantFile( return } -// ListAssistantFiles Lists the currently available files for an assistant, +// ListAssistantFiles Lists the currently available files for an assistant. func (c *Client) ListAssistantFiles( ctx context.Context, assistantID string, diff --git a/assistant_test.go b/assistant_test.go index 9f839b2cb..eb6f42458 100644 --- a/assistant_test.go +++ b/assistant_test.go @@ -17,7 +17,8 @@ func TestAssistant(t *testing.T) { assistantID := "asst_abc123" assistantName := "Ambrogio" assistantDescription := "Ambrogio is a friendly assistant." - assitantInstructions := "You are a personal math tutor. When asked a question, write and run Python code to answer the question." + assitantInstructions := `You are a personal math tutor. +When asked a question, write and run Python code to answer the question.` assistantFileID := "file-wB6RM6wHdA49HfS2DJ9fEyrH" limit := 20 order := "desc" @@ -82,7 +83,8 @@ func TestAssistant(t *testing.T) { server.RegisterHandler( "/v1/assistants/"+assistantID, func(w http.ResponseWriter, r *http.Request) { - if r.Method == http.MethodGet { + switch r.Method { + case http.MethodGet: resBytes, _ := json.Marshal(openai.Assistant{ ID: assistantID, Object: "assistant", @@ -93,7 +95,7 @@ func TestAssistant(t *testing.T) { Instructions: &assitantInstructions, }) fmt.Fprintln(w, string(resBytes)) - } else if r.Method == http.MethodPost { + case http.MethodPost: var request openai.AssistantRequest err := json.NewDecoder(r.Body).Decode(&request) checks.NoError(t, err, "Decode error") @@ -109,7 +111,7 @@ func TestAssistant(t *testing.T) { Tools: request.Tools, }) fmt.Fprintln(w, string(resBytes)) - } else if r.Method == http.MethodDelete { + case http.MethodDelete: fmt.Fprintln(w, `{ "id": "asst_abc123", "object": "assistant.deleted", @@ -122,7 +124,6 @@ func TestAssistant(t *testing.T) { server.RegisterHandler( "/v1/assistants", func(w http.ResponseWriter, r *http.Request) { - if r.Method == http.MethodPost { var request openai.AssistantRequest err := json.NewDecoder(r.Body).Decode(&request) @@ -198,5 +199,4 @@ func TestAssistant(t *testing.T) { err = client.DeleteAssistantFile(ctx, assistantID, assistantFileID) checks.NoError(t, err, "DeleteAssistantFile error") - }