feat: Support Delete Message API (#799)

* feat: Add DeleteMessage function to API client

* fix: linter

nolint : Deprecated method
split function: cognitive complexity 21

* rename func name for unit-test
This commit is contained in:
Yamagami ken-ichi
2024-08-22 23:27:44 +09:00
committed by GitHub
parent d86425a5cf
commit 6d021190f0
4 changed files with 59 additions and 6 deletions

View File

@@ -348,6 +348,9 @@ func TestClientReturnsRequestBuilderErrors(t *testing.T) {
{"ModifyMessage", func() (any, error) { {"ModifyMessage", func() (any, error) {
return client.ModifyMessage(ctx, "", "", nil) return client.ModifyMessage(ctx, "", "", nil)
}}, }},
{"DeleteMessage", func() (any, error) {
return client.DeleteMessage(ctx, "", "")
}},
{"RetrieveMessageFile", func() (any, error) { {"RetrieveMessageFile", func() (any, error) {
return client.RetrieveMessageFile(ctx, "", "", "") return client.RetrieveMessageFile(ctx, "", "", "")
}}, }},

View File

@@ -115,7 +115,7 @@ func (c *Client) CreateFineTune(ctx context.Context, request FineTuneRequest) (r
// This API will be officially deprecated on January 4th, 2024. // This API will be officially deprecated on January 4th, 2024.
// OpenAI recommends to migrate to the new fine tuning API implemented in fine_tuning_job.go. // OpenAI recommends to migrate to the new fine tuning API implemented in fine_tuning_job.go.
func (c *Client) CancelFineTune(ctx context.Context, fineTuneID string) (response FineTune, err error) { func (c *Client) CancelFineTune(ctx context.Context, fineTuneID string) (response FineTune, err error) {
req, err := c.newRequest(ctx, http.MethodPost, c.fullURL("/fine-tunes/"+fineTuneID+"/cancel")) req, err := c.newRequest(ctx, http.MethodPost, c.fullURL("/fine-tunes/"+fineTuneID+"/cancel")) //nolint:lll //this method is deprecated
if err != nil { if err != nil {
return return
} }

View File

@@ -73,6 +73,14 @@ type MessageFilesList struct {
httpHeader httpHeader
} }
type MessageDeletionStatus struct {
ID string `json:"id"`
Object string `json:"object"`
Deleted bool `json:"deleted"`
httpHeader
}
// CreateMessage creates a new message. // CreateMessage creates a new message.
func (c *Client) CreateMessage(ctx context.Context, threadID string, request MessageRequest) (msg Message, err error) { func (c *Client) CreateMessage(ctx context.Context, threadID string, request MessageRequest) (msg Message, err error) {
urlSuffix := fmt.Sprintf("/threads/%s/%s", threadID, messagesSuffix) urlSuffix := fmt.Sprintf("/threads/%s/%s", threadID, messagesSuffix)
@@ -186,3 +194,19 @@ func (c *Client) ListMessageFiles(
err = c.sendRequest(req, &files) err = c.sendRequest(req, &files)
return return
} }
// DeleteMessage deletes a message..
func (c *Client) DeleteMessage(
ctx context.Context,
threadID, messageID string,
) (status MessageDeletionStatus, err error) {
urlSuffix := fmt.Sprintf("/threads/%s/%s/%s", threadID, messagesSuffix, messageID)
req, err := c.newRequest(ctx, http.MethodDelete, c.fullURL(urlSuffix),
withBetaAssistantVersion(c.config.AssistantVersion))
if err != nil {
return
}
err = c.sendRequest(req, &status)
return
}

View File

@@ -8,20 +8,17 @@ import (
"testing" "testing"
"github.com/sashabaranov/go-openai" "github.com/sashabaranov/go-openai"
"github.com/sashabaranov/go-openai/internal/test"
"github.com/sashabaranov/go-openai/internal/test/checks" "github.com/sashabaranov/go-openai/internal/test/checks"
) )
var emptyStr = "" var emptyStr = ""
// TestMessages Tests the messages endpoint of the API using the mocked server. func setupServerForTestMessage(t *testing.T, server *test.ServerTest) {
func TestMessages(t *testing.T) {
threadID := "thread_abc123" threadID := "thread_abc123"
messageID := "msg_abc123" messageID := "msg_abc123"
fileID := "file_abc123" fileID := "file_abc123"
client, server, teardown := setupOpenAITestServer()
defer teardown()
server.RegisterHandler( server.RegisterHandler(
"/v1/threads/"+threadID+"/messages/"+messageID+"/files/"+fileID, "/v1/threads/"+threadID+"/messages/"+messageID+"/files/"+fileID,
func(w http.ResponseWriter, r *http.Request) { func(w http.ResponseWriter, r *http.Request) {
@@ -115,6 +112,13 @@ func TestMessages(t *testing.T) {
Metadata: nil, Metadata: nil,
}) })
fmt.Fprintln(w, string(resBytes)) fmt.Fprintln(w, string(resBytes))
case http.MethodDelete:
resBytes, _ := json.Marshal(openai.MessageDeletionStatus{
ID: messageID,
Object: "thread.message.deleted",
Deleted: true,
})
fmt.Fprintln(w, string(resBytes))
default: default:
t.Fatalf("unsupported messages http method: %s", r.Method) t.Fatalf("unsupported messages http method: %s", r.Method)
} }
@@ -176,7 +180,18 @@ func TestMessages(t *testing.T) {
} }
}, },
) )
}
// TestMessages Tests the messages endpoint of the API using the mocked server.
func TestMessages(t *testing.T) {
threadID := "thread_abc123"
messageID := "msg_abc123"
fileID := "file_abc123"
client, server, teardown := setupOpenAITestServer()
defer teardown()
setupServerForTestMessage(t, server)
ctx := context.Background() ctx := context.Background()
// static assertion of return type // static assertion of return type
@@ -225,6 +240,17 @@ func TestMessages(t *testing.T) {
t.Fatalf("expected message metadata to get modified") t.Fatalf("expected message metadata to get modified")
} }
msgDel, err := client.DeleteMessage(ctx, threadID, messageID)
checks.NoError(t, err, "DeleteMessage error")
if msgDel.ID != messageID {
t.Fatalf("unexpected message id: '%s'", msg.ID)
}
if !msgDel.Deleted {
t.Fatalf("expected deleted is true")
}
_, err = client.DeleteMessage(ctx, threadID, "not_exist_id")
checks.HasError(t, err, "DeleteMessage error")
// message files // message files
var msgFile openai.MessageFile var msgFile openai.MessageFile
msgFile, err = client.RetrieveMessageFile(ctx, threadID, messageID, fileID) msgFile, err = client.RetrieveMessageFile(ctx, threadID, messageID, fileID)