From 1edb2b3eeb980af0f006a6db5d906c551bd208b6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 20:24:17 +0000 Subject: [PATCH] feat(api): api update --- .stats.yml | 2 +- api.md | 4 +- session.go | 220 ++++++++++++++++++++++++------------------------ session_test.go | 96 ++++++++++----------- 4 files changed, 161 insertions(+), 161 deletions(-) diff --git a/.stats.yml b/.stats.yml index a729a61..8d606c8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 43 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-57001be06439e5325d0cb6837dd39d04fb7e438386668dcb67b4375ce6fabcf5.yml openapi_spec_hash: 5c3f5b2a345e5e6cda17865e3bae1fd2 -config_hash: 1b0d220e033fe9f683abf7048e7ad076 +config_hash: 026ef000d34bf2f930e7b41e77d2d3ff diff --git a/api.md b/api.md index ba2a388..02ac42b 100644 --- a/api.md +++ b/api.md @@ -143,10 +143,10 @@ Response Types: - opencode.ToolStatePending - opencode.ToolStateRunning - opencode.UserMessage -- opencode.SessionChatResponse - opencode.SessionCommandResponse - opencode.SessionMessageResponse - opencode.SessionMessagesResponse +- opencode.SessionPromptResponse Methods: @@ -155,13 +155,13 @@ Methods: - client.Session.List(ctx context.Context, query opencode.SessionListParams) ([]opencode.Session, error) - client.Session.Delete(ctx context.Context, id string, body opencode.SessionDeleteParams) (bool, error) - client.Session.Abort(ctx context.Context, id string, body opencode.SessionAbortParams) (bool, error) -- client.Session.Chat(ctx context.Context, id string, params opencode.SessionChatParams) (opencode.SessionChatResponse, error) - client.Session.Children(ctx context.Context, id string, query opencode.SessionChildrenParams) ([]opencode.Session, error) - client.Session.Command(ctx context.Context, id string, params opencode.SessionCommandParams) (opencode.SessionCommandResponse, error) - client.Session.Get(ctx context.Context, id string, query opencode.SessionGetParams) (opencode.Session, error) - client.Session.Init(ctx context.Context, id string, params opencode.SessionInitParams) (bool, error) - client.Session.Message(ctx context.Context, id string, messageID string, query opencode.SessionMessageParams) (opencode.SessionMessageResponse, error) - client.Session.Messages(ctx context.Context, id string, query opencode.SessionMessagesParams) ([]opencode.SessionMessagesResponse, error) +- client.Session.Prompt(ctx context.Context, id string, params opencode.SessionPromptParams) (opencode.SessionPromptResponse, error) - client.Session.Revert(ctx context.Context, id string, params opencode.SessionRevertParams) (opencode.Session, error) - client.Session.Share(ctx context.Context, id string, body opencode.SessionShareParams) (opencode.Session, error) - client.Session.Shell(ctx context.Context, id string, params opencode.SessionShellParams) (opencode.AssistantMessage, error) diff --git a/session.go b/session.go index efdd4c3..88d71b5 100644 --- a/session.go +++ b/session.go @@ -92,18 +92,6 @@ func (r *SessionService) Abort(ctx context.Context, id string, body SessionAbort return } -// Create and send a new message to a session -func (r *SessionService) Chat(ctx context.Context, id string, params SessionChatParams, opts ...option.RequestOption) (res *SessionChatResponse, err error) { - opts = append(r.Options[:], opts...) - if id == "" { - err = errors.New("missing required id parameter") - return - } - path := fmt.Sprintf("session/%s/message", id) - err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, params, &res, opts...) - return -} - // Get a session's children func (r *SessionService) Children(ctx context.Context, id string, query SessionChildrenParams, opts ...option.RequestOption) (res *[]Session, err error) { opts = append(r.Options[:], opts...) @@ -180,6 +168,18 @@ func (r *SessionService) Messages(ctx context.Context, id string, query SessionM return } +// Create and send a new message to a session +func (r *SessionService) Prompt(ctx context.Context, id string, params SessionPromptParams, opts ...option.RequestOption) (res *SessionPromptResponse, err error) { + opts = append(r.Options[:], opts...) + if id == "" { + err = errors.New("missing required id parameter") + return + } + path := fmt.Sprintf("session/%s/message", id) + err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, params, &res, opts...) + return +} + // Revert a message func (r *SessionService) Revert(ctx context.Context, id string, params SessionRevertParams, opts ...option.RequestOption) (res *Session, err error) { opts = append(r.Options[:], opts...) @@ -333,7 +333,7 @@ func (r AgentPartInputParam) MarshalJSON() (data []byte, err error) { return apijson.MarshalRoot(r) } -func (r AgentPartInputParam) implementsSessionChatParamsPartUnion() {} +func (r AgentPartInputParam) implementsSessionPromptParamsPartUnion() {} type AgentPartInputType string @@ -709,7 +709,7 @@ func (r FilePartInputParam) MarshalJSON() (data []byte, err error) { return apijson.MarshalRoot(r) } -func (r FilePartInputParam) implementsSessionChatParamsPartUnion() {} +func (r FilePartInputParam) implementsSessionPromptParamsPartUnion() {} type FilePartInputType string @@ -1820,7 +1820,7 @@ func (r TextPartInputParam) MarshalJSON() (data []byte, err error) { return apijson.MarshalRoot(r) } -func (r TextPartInputParam) implementsSessionChatParamsPartUnion() {} +func (r TextPartInputParam) implementsSessionPromptParamsPartUnion() {} type TextPartInputType string @@ -2296,29 +2296,6 @@ func (r userMessageTimeJSON) RawJSON() string { return r.raw } -type SessionChatResponse struct { - Info AssistantMessage `json:"info,required"` - Parts []Part `json:"parts,required"` - JSON sessionChatResponseJSON `json:"-"` -} - -// sessionChatResponseJSON contains the JSON metadata for the struct -// [SessionChatResponse] -type sessionChatResponseJSON struct { - Info apijson.Field - Parts apijson.Field - raw string - ExtraFields map[string]apijson.Field -} - -func (r *SessionChatResponse) UnmarshalJSON(data []byte) (err error) { - return apijson.UnmarshalRoot(data, r) -} - -func (r sessionChatResponseJSON) RawJSON() string { - return r.raw -} - type SessionCommandResponse struct { Info AssistantMessage `json:"info,required"` Parts []Part `json:"parts,required"` @@ -2388,6 +2365,29 @@ func (r sessionMessagesResponseJSON) RawJSON() string { return r.raw } +type SessionPromptResponse struct { + Info AssistantMessage `json:"info,required"` + Parts []Part `json:"parts,required"` + JSON sessionPromptResponseJSON `json:"-"` +} + +// sessionPromptResponseJSON contains the JSON metadata for the struct +// [SessionPromptResponse] +type sessionPromptResponseJSON struct { + Info apijson.Field + Parts apijson.Field + raw string + ExtraFields map[string]apijson.Field +} + +func (r *SessionPromptResponse) UnmarshalJSON(data []byte) (err error) { + return apijson.UnmarshalRoot(data, r) +} + +func (r sessionPromptResponseJSON) RawJSON() string { + return r.raw +} + type SessionNewParams struct { Directory param.Field[string] `query:"directory"` ParentID param.Field[string] `json:"parentID"` @@ -2459,78 +2459,6 @@ func (r SessionAbortParams) URLQuery() (v url.Values) { }) } -type SessionChatParams struct { - Parts param.Field[[]SessionChatParamsPartUnion] `json:"parts,required"` - Directory param.Field[string] `query:"directory"` - Agent param.Field[string] `json:"agent"` - MessageID param.Field[string] `json:"messageID"` - Model param.Field[SessionChatParamsModel] `json:"model"` - System param.Field[string] `json:"system"` - Tools param.Field[map[string]bool] `json:"tools"` -} - -func (r SessionChatParams) MarshalJSON() (data []byte, err error) { - return apijson.MarshalRoot(r) -} - -// URLQuery serializes [SessionChatParams]'s query parameters as `url.Values`. -func (r SessionChatParams) URLQuery() (v url.Values) { - return apiquery.MarshalWithSettings(r, apiquery.QuerySettings{ - ArrayFormat: apiquery.ArrayQueryFormatComma, - NestedFormat: apiquery.NestedQueryFormatBrackets, - }) -} - -type SessionChatParamsPart struct { - Type param.Field[SessionChatParamsPartsType] `json:"type,required"` - ID param.Field[string] `json:"id"` - Filename param.Field[string] `json:"filename"` - Mime param.Field[string] `json:"mime"` - Name param.Field[string] `json:"name"` - Source param.Field[interface{}] `json:"source"` - Synthetic param.Field[bool] `json:"synthetic"` - Text param.Field[string] `json:"text"` - Time param.Field[interface{}] `json:"time"` - URL param.Field[string] `json:"url"` -} - -func (r SessionChatParamsPart) MarshalJSON() (data []byte, err error) { - return apijson.MarshalRoot(r) -} - -func (r SessionChatParamsPart) implementsSessionChatParamsPartUnion() {} - -// Satisfied by [TextPartInputParam], [FilePartInputParam], [AgentPartInputParam], -// [SessionChatParamsPart]. -type SessionChatParamsPartUnion interface { - implementsSessionChatParamsPartUnion() -} - -type SessionChatParamsPartsType string - -const ( - SessionChatParamsPartsTypeText SessionChatParamsPartsType = "text" - SessionChatParamsPartsTypeFile SessionChatParamsPartsType = "file" - SessionChatParamsPartsTypeAgent SessionChatParamsPartsType = "agent" -) - -func (r SessionChatParamsPartsType) IsKnown() bool { - switch r { - case SessionChatParamsPartsTypeText, SessionChatParamsPartsTypeFile, SessionChatParamsPartsTypeAgent: - return true - } - return false -} - -type SessionChatParamsModel struct { - ModelID param.Field[string] `json:"modelID,required"` - ProviderID param.Field[string] `json:"providerID,required"` -} - -func (r SessionChatParamsModel) MarshalJSON() (data []byte, err error) { - return apijson.MarshalRoot(r) -} - type SessionChildrenParams struct { Directory param.Field[string] `query:"directory"` } @@ -2619,6 +2547,78 @@ func (r SessionMessagesParams) URLQuery() (v url.Values) { }) } +type SessionPromptParams struct { + Parts param.Field[[]SessionPromptParamsPartUnion] `json:"parts,required"` + Directory param.Field[string] `query:"directory"` + Agent param.Field[string] `json:"agent"` + MessageID param.Field[string] `json:"messageID"` + Model param.Field[SessionPromptParamsModel] `json:"model"` + System param.Field[string] `json:"system"` + Tools param.Field[map[string]bool] `json:"tools"` +} + +func (r SessionPromptParams) MarshalJSON() (data []byte, err error) { + return apijson.MarshalRoot(r) +} + +// URLQuery serializes [SessionPromptParams]'s query parameters as `url.Values`. +func (r SessionPromptParams) URLQuery() (v url.Values) { + return apiquery.MarshalWithSettings(r, apiquery.QuerySettings{ + ArrayFormat: apiquery.ArrayQueryFormatComma, + NestedFormat: apiquery.NestedQueryFormatBrackets, + }) +} + +type SessionPromptParamsPart struct { + Type param.Field[SessionPromptParamsPartsType] `json:"type,required"` + ID param.Field[string] `json:"id"` + Filename param.Field[string] `json:"filename"` + Mime param.Field[string] `json:"mime"` + Name param.Field[string] `json:"name"` + Source param.Field[interface{}] `json:"source"` + Synthetic param.Field[bool] `json:"synthetic"` + Text param.Field[string] `json:"text"` + Time param.Field[interface{}] `json:"time"` + URL param.Field[string] `json:"url"` +} + +func (r SessionPromptParamsPart) MarshalJSON() (data []byte, err error) { + return apijson.MarshalRoot(r) +} + +func (r SessionPromptParamsPart) implementsSessionPromptParamsPartUnion() {} + +// Satisfied by [TextPartInputParam], [FilePartInputParam], [AgentPartInputParam], +// [SessionPromptParamsPart]. +type SessionPromptParamsPartUnion interface { + implementsSessionPromptParamsPartUnion() +} + +type SessionPromptParamsPartsType string + +const ( + SessionPromptParamsPartsTypeText SessionPromptParamsPartsType = "text" + SessionPromptParamsPartsTypeFile SessionPromptParamsPartsType = "file" + SessionPromptParamsPartsTypeAgent SessionPromptParamsPartsType = "agent" +) + +func (r SessionPromptParamsPartsType) IsKnown() bool { + switch r { + case SessionPromptParamsPartsTypeText, SessionPromptParamsPartsTypeFile, SessionPromptParamsPartsTypeAgent: + return true + } + return false +} + +type SessionPromptParamsModel struct { + ModelID param.Field[string] `json:"modelID,required"` + ProviderID param.Field[string] `json:"providerID,required"` +} + +func (r SessionPromptParamsModel) MarshalJSON() (data []byte, err error) { + return apijson.MarshalRoot(r) +} + type SessionRevertParams struct { MessageID param.Field[string] `json:"messageID,required"` Directory param.Field[string] `query:"directory"` diff --git a/session_test.go b/session_test.go index 73c7f5b..f4cbc04 100644 --- a/session_test.go +++ b/session_test.go @@ -148,54 +148,6 @@ func TestSessionAbortWithOptionalParams(t *testing.T) { } } -func TestSessionChatWithOptionalParams(t *testing.T) { - t.Skip("Prism tests are disabled") - baseURL := "http://localhost:4010" - if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { - baseURL = envURL - } - if !testutil.CheckTestServer(t, baseURL) { - return - } - client := opencode.NewClient( - option.WithBaseURL(baseURL), - ) - _, err := client.Session.Chat( - context.TODO(), - "id", - opencode.SessionChatParams{ - Parts: opencode.F([]opencode.SessionChatParamsPartUnion{opencode.TextPartInputParam{ - Text: opencode.F("text"), - Type: opencode.F(opencode.TextPartInputTypeText), - ID: opencode.F("id"), - Synthetic: opencode.F(true), - Time: opencode.F(opencode.TextPartInputTimeParam{ - Start: opencode.F(0.000000), - End: opencode.F(0.000000), - }), - }}), - Directory: opencode.F("directory"), - Agent: opencode.F("agent"), - MessageID: opencode.F("msg"), - Model: opencode.F(opencode.SessionChatParamsModel{ - ModelID: opencode.F("modelID"), - ProviderID: opencode.F("providerID"), - }), - System: opencode.F("system"), - Tools: opencode.F(map[string]bool{ - "foo": true, - }), - }, - ) - if err != nil { - var apierr *opencode.Error - if errors.As(err, &apierr) { - t.Log(string(apierr.DumpRequest(true))) - } - t.Fatalf("err should be nil: %s", err.Error()) - } -} - func TestSessionChildrenWithOptionalParams(t *testing.T) { t.Skip("Prism tests are disabled") baseURL := "http://localhost:4010" @@ -373,6 +325,54 @@ func TestSessionMessagesWithOptionalParams(t *testing.T) { } } +func TestSessionPromptWithOptionalParams(t *testing.T) { + t.Skip("Prism tests are disabled") + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := opencode.NewClient( + option.WithBaseURL(baseURL), + ) + _, err := client.Session.Prompt( + context.TODO(), + "id", + opencode.SessionPromptParams{ + Parts: opencode.F([]opencode.SessionPromptParamsPartUnion{opencode.TextPartInputParam{ + Text: opencode.F("text"), + Type: opencode.F(opencode.TextPartInputTypeText), + ID: opencode.F("id"), + Synthetic: opencode.F(true), + Time: opencode.F(opencode.TextPartInputTimeParam{ + Start: opencode.F(0.000000), + End: opencode.F(0.000000), + }), + }}), + Directory: opencode.F("directory"), + Agent: opencode.F("agent"), + MessageID: opencode.F("msg"), + Model: opencode.F(opencode.SessionPromptParamsModel{ + ModelID: opencode.F("modelID"), + ProviderID: opencode.F("providerID"), + }), + System: opencode.F("system"), + Tools: opencode.F(map[string]bool{ + "foo": true, + }), + }, + ) + if err != nil { + var apierr *opencode.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + func TestSessionRevertWithOptionalParams(t *testing.T) { t.Skip("Prism tests are disabled") baseURL := "http://localhost:4010"