mirror of
https://github.com/openai/openai-go.git
synced 2026-03-31 08:37:22 +09:00
437 lines
19 KiB
Go
437 lines
19 KiB
Go
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
||
|
||
package openai
|
||
|
||
import (
|
||
"context"
|
||
"net/http"
|
||
"slices"
|
||
|
||
"github.com/openai/openai-go/v3/internal/apijson"
|
||
"github.com/openai/openai-go/v3/internal/requestconfig"
|
||
"github.com/openai/openai-go/v3/option"
|
||
"github.com/openai/openai-go/v3/packages/param"
|
||
"github.com/openai/openai-go/v3/packages/respjson"
|
||
"github.com/openai/openai-go/v3/packages/ssestream"
|
||
"github.com/openai/openai-go/v3/shared/constant"
|
||
)
|
||
|
||
// Given a prompt, the model will return one or more predicted completions, and can
|
||
// also return the probabilities of alternative tokens at each position.
|
||
//
|
||
// CompletionService contains methods and other services that help with interacting
|
||
// with the openai API.
|
||
//
|
||
// Note, unlike clients, this service does not read variables from the environment
|
||
// automatically. You should not instantiate this service directly, and instead use
|
||
// the [NewCompletionService] method instead.
|
||
type CompletionService struct {
|
||
Options []option.RequestOption
|
||
}
|
||
|
||
// NewCompletionService generates a new service that applies the given options to
|
||
// each request. These options are applied after the parent client's options (if
|
||
// there is one), and before any request-specific options.
|
||
func NewCompletionService(opts ...option.RequestOption) (r CompletionService) {
|
||
r = CompletionService{}
|
||
r.Options = opts
|
||
return
|
||
}
|
||
|
||
// Creates a completion for the provided prompt and parameters.
|
||
//
|
||
// Returns a completion object, or a sequence of completion objects if the request
|
||
// is streamed.
|
||
func (r *CompletionService) New(ctx context.Context, body CompletionNewParams, opts ...option.RequestOption) (res *Completion, err error) {
|
||
opts = slices.Concat(r.Options, opts)
|
||
path := "completions"
|
||
err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...)
|
||
return res, err
|
||
}
|
||
|
||
// Creates a completion for the provided prompt and parameters.
|
||
//
|
||
// Returns a completion object, or a sequence of completion objects if the request
|
||
// is streamed.
|
||
func (r *CompletionService) NewStreaming(ctx context.Context, body CompletionNewParams, opts ...option.RequestOption) (stream *ssestream.Stream[Completion]) {
|
||
var (
|
||
raw *http.Response
|
||
err error
|
||
)
|
||
opts = slices.Concat(r.Options, opts)
|
||
opts = append(opts, option.WithJSONSet("stream", true))
|
||
path := "completions"
|
||
err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &raw, opts...)
|
||
return ssestream.NewStream[Completion](ssestream.NewDecoder(raw), err)
|
||
}
|
||
|
||
// Represents a completion response from the API. Note: both the streamed and
|
||
// non-streamed response objects share the same shape (unlike the chat endpoint).
|
||
type Completion struct {
|
||
// A unique identifier for the completion.
|
||
ID string `json:"id" api:"required"`
|
||
// The list of completion choices the model generated for the input prompt.
|
||
Choices []CompletionChoice `json:"choices" api:"required"`
|
||
// The Unix timestamp (in seconds) of when the completion was created.
|
||
Created int64 `json:"created" api:"required"`
|
||
// The model used for completion.
|
||
Model string `json:"model" api:"required"`
|
||
// The object type, which is always "text_completion"
|
||
Object constant.TextCompletion `json:"object" default:"text_completion"`
|
||
// This fingerprint represents the backend configuration that the model runs with.
|
||
//
|
||
// Can be used in conjunction with the `seed` request parameter to understand when
|
||
// backend changes have been made that might impact determinism.
|
||
SystemFingerprint string `json:"system_fingerprint"`
|
||
// Usage statistics for the completion request.
|
||
Usage CompletionUsage `json:"usage"`
|
||
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
|
||
JSON struct {
|
||
ID respjson.Field
|
||
Choices respjson.Field
|
||
Created respjson.Field
|
||
Model respjson.Field
|
||
Object respjson.Field
|
||
SystemFingerprint respjson.Field
|
||
Usage respjson.Field
|
||
ExtraFields map[string]respjson.Field
|
||
raw string
|
||
} `json:"-"`
|
||
}
|
||
|
||
// Returns the unmodified JSON received from the API
|
||
func (r Completion) RawJSON() string { return r.JSON.raw }
|
||
func (r *Completion) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, r)
|
||
}
|
||
|
||
type CompletionChoice struct {
|
||
// The reason the model stopped generating tokens. This will be `stop` if the model
|
||
// hit a natural stop point or a provided stop sequence, `length` if the maximum
|
||
// number of tokens specified in the request was reached, or `content_filter` if
|
||
// content was omitted due to a flag from our content filters.
|
||
//
|
||
// Any of "stop", "length", "content_filter".
|
||
FinishReason CompletionChoiceFinishReason `json:"finish_reason" api:"required"`
|
||
Index int64 `json:"index" api:"required"`
|
||
Logprobs CompletionChoiceLogprobs `json:"logprobs" api:"required"`
|
||
Text string `json:"text" api:"required"`
|
||
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
|
||
JSON struct {
|
||
FinishReason respjson.Field
|
||
Index respjson.Field
|
||
Logprobs respjson.Field
|
||
Text respjson.Field
|
||
ExtraFields map[string]respjson.Field
|
||
raw string
|
||
} `json:"-"`
|
||
}
|
||
|
||
// Returns the unmodified JSON received from the API
|
||
func (r CompletionChoice) RawJSON() string { return r.JSON.raw }
|
||
func (r *CompletionChoice) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, r)
|
||
}
|
||
|
||
// The reason the model stopped generating tokens. This will be `stop` if the model
|
||
// hit a natural stop point or a provided stop sequence, `length` if the maximum
|
||
// number of tokens specified in the request was reached, or `content_filter` if
|
||
// content was omitted due to a flag from our content filters.
|
||
type CompletionChoiceFinishReason string
|
||
|
||
const (
|
||
CompletionChoiceFinishReasonStop CompletionChoiceFinishReason = "stop"
|
||
CompletionChoiceFinishReasonLength CompletionChoiceFinishReason = "length"
|
||
CompletionChoiceFinishReasonContentFilter CompletionChoiceFinishReason = "content_filter"
|
||
)
|
||
|
||
type CompletionChoiceLogprobs struct {
|
||
TextOffset []int64 `json:"text_offset"`
|
||
TokenLogprobs []float64 `json:"token_logprobs"`
|
||
Tokens []string `json:"tokens"`
|
||
TopLogprobs []map[string]float64 `json:"top_logprobs"`
|
||
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
|
||
JSON struct {
|
||
TextOffset respjson.Field
|
||
TokenLogprobs respjson.Field
|
||
Tokens respjson.Field
|
||
TopLogprobs respjson.Field
|
||
ExtraFields map[string]respjson.Field
|
||
raw string
|
||
} `json:"-"`
|
||
}
|
||
|
||
// Returns the unmodified JSON received from the API
|
||
func (r CompletionChoiceLogprobs) RawJSON() string { return r.JSON.raw }
|
||
func (r *CompletionChoiceLogprobs) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, r)
|
||
}
|
||
|
||
// Usage statistics for the completion request.
|
||
type CompletionUsage struct {
|
||
// Number of tokens in the generated completion.
|
||
CompletionTokens int64 `json:"completion_tokens" api:"required"`
|
||
// Number of tokens in the prompt.
|
||
PromptTokens int64 `json:"prompt_tokens" api:"required"`
|
||
// Total number of tokens used in the request (prompt + completion).
|
||
TotalTokens int64 `json:"total_tokens" api:"required"`
|
||
// Breakdown of tokens used in a completion.
|
||
CompletionTokensDetails CompletionUsageCompletionTokensDetails `json:"completion_tokens_details"`
|
||
// Breakdown of tokens used in the prompt.
|
||
PromptTokensDetails CompletionUsagePromptTokensDetails `json:"prompt_tokens_details"`
|
||
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
|
||
JSON struct {
|
||
CompletionTokens respjson.Field
|
||
PromptTokens respjson.Field
|
||
TotalTokens respjson.Field
|
||
CompletionTokensDetails respjson.Field
|
||
PromptTokensDetails respjson.Field
|
||
ExtraFields map[string]respjson.Field
|
||
raw string
|
||
} `json:"-"`
|
||
}
|
||
|
||
// Returns the unmodified JSON received from the API
|
||
func (r CompletionUsage) RawJSON() string { return r.JSON.raw }
|
||
func (r *CompletionUsage) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, r)
|
||
}
|
||
|
||
// Breakdown of tokens used in a completion.
|
||
type CompletionUsageCompletionTokensDetails struct {
|
||
// When using Predicted Outputs, the number of tokens in the prediction that
|
||
// appeared in the completion.
|
||
AcceptedPredictionTokens int64 `json:"accepted_prediction_tokens"`
|
||
// Audio input tokens generated by the model.
|
||
AudioTokens int64 `json:"audio_tokens"`
|
||
// Tokens generated by the model for reasoning.
|
||
ReasoningTokens int64 `json:"reasoning_tokens"`
|
||
// When using Predicted Outputs, the number of tokens in the prediction that did
|
||
// not appear in the completion. However, like reasoning tokens, these tokens are
|
||
// still counted in the total completion tokens for purposes of billing, output,
|
||
// and context window limits.
|
||
RejectedPredictionTokens int64 `json:"rejected_prediction_tokens"`
|
||
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
|
||
JSON struct {
|
||
AcceptedPredictionTokens respjson.Field
|
||
AudioTokens respjson.Field
|
||
ReasoningTokens respjson.Field
|
||
RejectedPredictionTokens respjson.Field
|
||
ExtraFields map[string]respjson.Field
|
||
raw string
|
||
} `json:"-"`
|
||
}
|
||
|
||
// Returns the unmodified JSON received from the API
|
||
func (r CompletionUsageCompletionTokensDetails) RawJSON() string { return r.JSON.raw }
|
||
func (r *CompletionUsageCompletionTokensDetails) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, r)
|
||
}
|
||
|
||
// Breakdown of tokens used in the prompt.
|
||
type CompletionUsagePromptTokensDetails struct {
|
||
// Audio input tokens present in the prompt.
|
||
AudioTokens int64 `json:"audio_tokens"`
|
||
// Cached tokens present in the prompt.
|
||
CachedTokens int64 `json:"cached_tokens"`
|
||
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
|
||
JSON struct {
|
||
AudioTokens respjson.Field
|
||
CachedTokens respjson.Field
|
||
ExtraFields map[string]respjson.Field
|
||
raw string
|
||
} `json:"-"`
|
||
}
|
||
|
||
// Returns the unmodified JSON received from the API
|
||
func (r CompletionUsagePromptTokensDetails) RawJSON() string { return r.JSON.raw }
|
||
func (r *CompletionUsagePromptTokensDetails) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, r)
|
||
}
|
||
|
||
type CompletionNewParams struct {
|
||
// The prompt(s) to generate completions for, encoded as a string, array of
|
||
// strings, array of tokens, or array of token arrays.
|
||
//
|
||
// Note that <|endoftext|> is the document separator that the model sees during
|
||
// training, so if a prompt is not specified the model will generate as if from the
|
||
// beginning of a new document.
|
||
Prompt CompletionNewParamsPromptUnion `json:"prompt,omitzero" api:"required"`
|
||
// ID of the model to use. You can use the
|
||
// [List models](https://platform.openai.com/docs/api-reference/models/list) API to
|
||
// see all of your available models, or see our
|
||
// [Model overview](https://platform.openai.com/docs/models) for descriptions of
|
||
// them.
|
||
Model CompletionNewParamsModel `json:"model,omitzero" api:"required"`
|
||
// Generates `best_of` completions server-side and returns the "best" (the one with
|
||
// the highest log probability per token). Results cannot be streamed.
|
||
//
|
||
// When used with `n`, `best_of` controls the number of candidate completions and
|
||
// `n` specifies how many to return – `best_of` must be greater than `n`.
|
||
//
|
||
// **Note:** Because this parameter generates many completions, it can quickly
|
||
// consume your token quota. Use carefully and ensure that you have reasonable
|
||
// settings for `max_tokens` and `stop`.
|
||
BestOf param.Opt[int64] `json:"best_of,omitzero"`
|
||
// Echo back the prompt in addition to the completion
|
||
Echo param.Opt[bool] `json:"echo,omitzero"`
|
||
// Number between -2.0 and 2.0. Positive values penalize new tokens based on their
|
||
// existing frequency in the text so far, decreasing the model's likelihood to
|
||
// repeat the same line verbatim.
|
||
//
|
||
// [See more information about frequency and presence penalties.](https://platform.openai.com/docs/guides/text-generation)
|
||
FrequencyPenalty param.Opt[float64] `json:"frequency_penalty,omitzero"`
|
||
// Include the log probabilities on the `logprobs` most likely output tokens, as
|
||
// well the chosen tokens. For example, if `logprobs` is 5, the API will return a
|
||
// list of the 5 most likely tokens. The API will always return the `logprob` of
|
||
// the sampled token, so there may be up to `logprobs+1` elements in the response.
|
||
//
|
||
// The maximum value for `logprobs` is 5.
|
||
Logprobs param.Opt[int64] `json:"logprobs,omitzero"`
|
||
// The maximum number of [tokens](/tokenizer) that can be generated in the
|
||
// completion.
|
||
//
|
||
// The token count of your prompt plus `max_tokens` cannot exceed the model's
|
||
// context length.
|
||
// [Example Python code](https://cookbook.openai.com/examples/how_to_count_tokens_with_tiktoken)
|
||
// for counting tokens.
|
||
MaxTokens param.Opt[int64] `json:"max_tokens,omitzero"`
|
||
// How many completions to generate for each prompt.
|
||
//
|
||
// **Note:** Because this parameter generates many completions, it can quickly
|
||
// consume your token quota. Use carefully and ensure that you have reasonable
|
||
// settings for `max_tokens` and `stop`.
|
||
N param.Opt[int64] `json:"n,omitzero"`
|
||
// Number between -2.0 and 2.0. Positive values penalize new tokens based on
|
||
// whether they appear in the text so far, increasing the model's likelihood to
|
||
// talk about new topics.
|
||
//
|
||
// [See more information about frequency and presence penalties.](https://platform.openai.com/docs/guides/text-generation)
|
||
PresencePenalty param.Opt[float64] `json:"presence_penalty,omitzero"`
|
||
// If specified, our system will make a best effort to sample deterministically,
|
||
// such that repeated requests with the same `seed` and parameters should return
|
||
// the same result.
|
||
//
|
||
// Determinism is not guaranteed, and you should refer to the `system_fingerprint`
|
||
// response parameter to monitor changes in the backend.
|
||
Seed param.Opt[int64] `json:"seed,omitzero"`
|
||
// The suffix that comes after a completion of inserted text.
|
||
//
|
||
// This parameter is only supported for `gpt-3.5-turbo-instruct`.
|
||
Suffix param.Opt[string] `json:"suffix,omitzero"`
|
||
// What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
|
||
// make the output more random, while lower values like 0.2 will make it more
|
||
// focused and deterministic.
|
||
//
|
||
// We generally recommend altering this or `top_p` but not both.
|
||
Temperature param.Opt[float64] `json:"temperature,omitzero"`
|
||
// An alternative to sampling with temperature, called nucleus sampling, where the
|
||
// model considers the results of the tokens with top_p probability mass. So 0.1
|
||
// means only the tokens comprising the top 10% probability mass are considered.
|
||
//
|
||
// We generally recommend altering this or `temperature` but not both.
|
||
TopP param.Opt[float64] `json:"top_p,omitzero"`
|
||
// A unique identifier representing your end-user, which can help OpenAI to monitor
|
||
// and detect abuse.
|
||
// [Learn more](https://platform.openai.com/docs/guides/safety-best-practices#end-user-ids).
|
||
User param.Opt[string] `json:"user,omitzero"`
|
||
// Modify the likelihood of specified tokens appearing in the completion.
|
||
//
|
||
// Accepts a JSON object that maps tokens (specified by their token ID in the GPT
|
||
// tokenizer) to an associated bias value from -100 to 100. You can use this
|
||
// [tokenizer tool](/tokenizer?view=bpe) to convert text to token IDs.
|
||
// Mathematically, the bias is added to the logits generated by the model prior to
|
||
// sampling. The exact effect will vary per model, but values between -1 and 1
|
||
// should decrease or increase likelihood of selection; values like -100 or 100
|
||
// should result in a ban or exclusive selection of the relevant token.
|
||
//
|
||
// As an example, you can pass `{"50256": -100}` to prevent the <|endoftext|> token
|
||
// from being generated.
|
||
LogitBias map[string]int64 `json:"logit_bias,omitzero"`
|
||
// Not supported with latest reasoning models `o3` and `o4-mini`.
|
||
//
|
||
// Up to 4 sequences where the API will stop generating further tokens. The
|
||
// returned text will not contain the stop sequence.
|
||
Stop CompletionNewParamsStopUnion `json:"stop,omitzero"`
|
||
// Options for streaming response. Only set this when you set `stream: true`.
|
||
StreamOptions ChatCompletionStreamOptionsParam `json:"stream_options,omitzero"`
|
||
paramObj
|
||
}
|
||
|
||
func (r CompletionNewParams) MarshalJSON() (data []byte, err error) {
|
||
type shadow CompletionNewParams
|
||
return param.MarshalObject(r, (*shadow)(&r))
|
||
}
|
||
func (r *CompletionNewParams) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, r)
|
||
}
|
||
|
||
// ID of the model to use. You can use the
|
||
// [List models](https://platform.openai.com/docs/api-reference/models/list) API to
|
||
// see all of your available models, or see our
|
||
// [Model overview](https://platform.openai.com/docs/models) for descriptions of
|
||
// them.
|
||
type CompletionNewParamsModel string
|
||
|
||
const (
|
||
CompletionNewParamsModelGPT3_5TurboInstruct CompletionNewParamsModel = "gpt-3.5-turbo-instruct"
|
||
CompletionNewParamsModelDavinci002 CompletionNewParamsModel = "davinci-002"
|
||
CompletionNewParamsModelBabbage002 CompletionNewParamsModel = "babbage-002"
|
||
)
|
||
|
||
// Only one field can be non-zero.
|
||
//
|
||
// Use [param.IsOmitted] to confirm if a field is set.
|
||
type CompletionNewParamsPromptUnion struct {
|
||
OfString param.Opt[string] `json:",omitzero,inline"`
|
||
OfArrayOfStrings []string `json:",omitzero,inline"`
|
||
OfArrayOfTokens []int64 `json:",omitzero,inline"`
|
||
OfArrayOfTokenArrays [][]int64 `json:",omitzero,inline"`
|
||
paramUnion
|
||
}
|
||
|
||
func (u CompletionNewParamsPromptUnion) MarshalJSON() ([]byte, error) {
|
||
return param.MarshalUnion(u, u.OfString, u.OfArrayOfStrings, u.OfArrayOfTokens, u.OfArrayOfTokenArrays)
|
||
}
|
||
func (u *CompletionNewParamsPromptUnion) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, u)
|
||
}
|
||
|
||
func (u *CompletionNewParamsPromptUnion) asAny() any {
|
||
if !param.IsOmitted(u.OfString) {
|
||
return &u.OfString.Value
|
||
} else if !param.IsOmitted(u.OfArrayOfStrings) {
|
||
return &u.OfArrayOfStrings
|
||
} else if !param.IsOmitted(u.OfArrayOfTokens) {
|
||
return &u.OfArrayOfTokens
|
||
} else if !param.IsOmitted(u.OfArrayOfTokenArrays) {
|
||
return &u.OfArrayOfTokenArrays
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// Only one field can be non-zero.
|
||
//
|
||
// Use [param.IsOmitted] to confirm if a field is set.
|
||
type CompletionNewParamsStopUnion struct {
|
||
OfString param.Opt[string] `json:",omitzero,inline"`
|
||
OfStringArray []string `json:",omitzero,inline"`
|
||
paramUnion
|
||
}
|
||
|
||
func (u CompletionNewParamsStopUnion) MarshalJSON() ([]byte, error) {
|
||
return param.MarshalUnion(u, u.OfString, u.OfStringArray)
|
||
}
|
||
func (u *CompletionNewParamsStopUnion) UnmarshalJSON(data []byte) error {
|
||
return apijson.UnmarshalRoot(data, u)
|
||
}
|
||
|
||
func (u *CompletionNewParamsStopUnion) asAny() any {
|
||
if !param.IsOmitted(u.OfString) {
|
||
return &u.OfString.Value
|
||
} else if !param.IsOmitted(u.OfStringArray) {
|
||
return &u.OfStringArray
|
||
}
|
||
return nil
|
||
}
|