moderation.go (301 lines of code) (raw):
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
package openai
import (
"context"
"net/http"
"reflect"
"github.com/openai/openai-go/internal/apijson"
"github.com/openai/openai-go/internal/requestconfig"
"github.com/openai/openai-go/option"
"github.com/openai/openai-go/packages/param"
"github.com/openai/openai-go/packages/resp"
"github.com/openai/openai-go/shared/constant"
"github.com/tidwall/gjson"
)
// ModerationService 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 [NewModerationService] method instead.
type ModerationService struct {
Options []option.RequestOption
}
// NewModerationService 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 NewModerationService(opts ...option.RequestOption) (r ModerationService) {
r = ModerationService{}
r.Options = opts
return
}
// Classifies if text and/or image inputs are potentially harmful. Learn more in
// the [moderation guide](https://platform.openai.com/docs/guides/moderation).
func (r *ModerationService) New(ctx context.Context, body ModerationNewParams, opts ...option.RequestOption) (res *ModerationNewResponse, err error) {
opts = append(r.Options[:], opts...)
path := "moderations"
err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...)
return
}
type Moderation struct {
// A list of the categories, and whether they are flagged or not.
Categories ModerationCategories `json:"categories,required"`
// A list of the categories along with the input type(s) that the score applies to.
CategoryAppliedInputTypes ModerationCategoryAppliedInputTypes `json:"category_applied_input_types,required"`
// A list of the categories along with their scores as predicted by model.
CategoryScores ModerationCategoryScores `json:"category_scores,required"`
// Whether any of the below categories are flagged.
Flagged bool `json:"flagged,required"`
// Metadata for the response, check the presence of optional fields with the
// [resp.Field.IsPresent] method.
JSON struct {
Categories resp.Field
CategoryAppliedInputTypes resp.Field
CategoryScores resp.Field
Flagged resp.Field
ExtraFields map[string]resp.Field
raw string
} `json:"-"`
}
// Returns the unmodified JSON received from the API
func (r Moderation) RawJSON() string { return r.JSON.raw }
func (r *Moderation) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
// A list of the categories, and whether they are flagged or not.
type ModerationCategories struct {
// Content that expresses, incites, or promotes harassing language towards any
// target.
Harassment bool `json:"harassment,required"`
// Harassment content that also includes violence or serious harm towards any
// target.
HarassmentThreatening bool `json:"harassment/threatening,required"`
// Content that expresses, incites, or promotes hate based on race, gender,
// ethnicity, religion, nationality, sexual orientation, disability status, or
// caste. Hateful content aimed at non-protected groups (e.g., chess players) is
// harassment.
Hate bool `json:"hate,required"`
// Hateful content that also includes violence or serious harm towards the targeted
// group based on race, gender, ethnicity, religion, nationality, sexual
// orientation, disability status, or caste.
HateThreatening bool `json:"hate/threatening,required"`
// Content that includes instructions or advice that facilitate the planning or
// execution of wrongdoing, or that gives advice or instruction on how to commit
// illicit acts. For example, "how to shoplift" would fit this category.
Illicit bool `json:"illicit,required"`
// Content that includes instructions or advice that facilitate the planning or
// execution of wrongdoing that also includes violence, or that gives advice or
// instruction on the procurement of any weapon.
IllicitViolent bool `json:"illicit/violent,required"`
// Content that promotes, encourages, or depicts acts of self-harm, such as
// suicide, cutting, and eating disorders.
SelfHarm bool `json:"self-harm,required"`
// Content that encourages performing acts of self-harm, such as suicide, cutting,
// and eating disorders, or that gives instructions or advice on how to commit such
// acts.
SelfHarmInstructions bool `json:"self-harm/instructions,required"`
// Content where the speaker expresses that they are engaging or intend to engage
// in acts of self-harm, such as suicide, cutting, and eating disorders.
SelfHarmIntent bool `json:"self-harm/intent,required"`
// Content meant to arouse sexual excitement, such as the description of sexual
// activity, or that promotes sexual services (excluding sex education and
// wellness).
Sexual bool `json:"sexual,required"`
// Sexual content that includes an individual who is under 18 years old.
SexualMinors bool `json:"sexual/minors,required"`
// Content that depicts death, violence, or physical injury.
Violence bool `json:"violence,required"`
// Content that depicts death, violence, or physical injury in graphic detail.
ViolenceGraphic bool `json:"violence/graphic,required"`
// Metadata for the response, check the presence of optional fields with the
// [resp.Field.IsPresent] method.
JSON struct {
Harassment resp.Field
HarassmentThreatening resp.Field
Hate resp.Field
HateThreatening resp.Field
Illicit resp.Field
IllicitViolent resp.Field
SelfHarm resp.Field
SelfHarmInstructions resp.Field
SelfHarmIntent resp.Field
Sexual resp.Field
SexualMinors resp.Field
Violence resp.Field
ViolenceGraphic resp.Field
ExtraFields map[string]resp.Field
raw string
} `json:"-"`
}
// Returns the unmodified JSON received from the API
func (r ModerationCategories) RawJSON() string { return r.JSON.raw }
func (r *ModerationCategories) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
// A list of the categories along with the input type(s) that the score applies to.
type ModerationCategoryAppliedInputTypes struct {
// The applied input type(s) for the category 'harassment'.
//
// Any of "text".
Harassment []string `json:"harassment,required"`
// The applied input type(s) for the category 'harassment/threatening'.
//
// Any of "text".
HarassmentThreatening []string `json:"harassment/threatening,required"`
// The applied input type(s) for the category 'hate'.
//
// Any of "text".
Hate []string `json:"hate,required"`
// The applied input type(s) for the category 'hate/threatening'.
//
// Any of "text".
HateThreatening []string `json:"hate/threatening,required"`
// The applied input type(s) for the category 'illicit'.
//
// Any of "text".
Illicit []string `json:"illicit,required"`
// The applied input type(s) for the category 'illicit/violent'.
//
// Any of "text".
IllicitViolent []string `json:"illicit/violent,required"`
// The applied input type(s) for the category 'self-harm'.
//
// Any of "text", "image".
SelfHarm []string `json:"self-harm,required"`
// The applied input type(s) for the category 'self-harm/instructions'.
//
// Any of "text", "image".
SelfHarmInstructions []string `json:"self-harm/instructions,required"`
// The applied input type(s) for the category 'self-harm/intent'.
//
// Any of "text", "image".
SelfHarmIntent []string `json:"self-harm/intent,required"`
// The applied input type(s) for the category 'sexual'.
//
// Any of "text", "image".
Sexual []string `json:"sexual,required"`
// The applied input type(s) for the category 'sexual/minors'.
//
// Any of "text".
SexualMinors []string `json:"sexual/minors,required"`
// The applied input type(s) for the category 'violence'.
//
// Any of "text", "image".
Violence []string `json:"violence,required"`
// The applied input type(s) for the category 'violence/graphic'.
//
// Any of "text", "image".
ViolenceGraphic []string `json:"violence/graphic,required"`
// Metadata for the response, check the presence of optional fields with the
// [resp.Field.IsPresent] method.
JSON struct {
Harassment resp.Field
HarassmentThreatening resp.Field
Hate resp.Field
HateThreatening resp.Field
Illicit resp.Field
IllicitViolent resp.Field
SelfHarm resp.Field
SelfHarmInstructions resp.Field
SelfHarmIntent resp.Field
Sexual resp.Field
SexualMinors resp.Field
Violence resp.Field
ViolenceGraphic resp.Field
ExtraFields map[string]resp.Field
raw string
} `json:"-"`
}
// Returns the unmodified JSON received from the API
func (r ModerationCategoryAppliedInputTypes) RawJSON() string { return r.JSON.raw }
func (r *ModerationCategoryAppliedInputTypes) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
// A list of the categories along with their scores as predicted by model.
type ModerationCategoryScores struct {
// The score for the category 'harassment'.
Harassment float64 `json:"harassment,required"`
// The score for the category 'harassment/threatening'.
HarassmentThreatening float64 `json:"harassment/threatening,required"`
// The score for the category 'hate'.
Hate float64 `json:"hate,required"`
// The score for the category 'hate/threatening'.
HateThreatening float64 `json:"hate/threatening,required"`
// The score for the category 'illicit'.
Illicit float64 `json:"illicit,required"`
// The score for the category 'illicit/violent'.
IllicitViolent float64 `json:"illicit/violent,required"`
// The score for the category 'self-harm'.
SelfHarm float64 `json:"self-harm,required"`
// The score for the category 'self-harm/instructions'.
SelfHarmInstructions float64 `json:"self-harm/instructions,required"`
// The score for the category 'self-harm/intent'.
SelfHarmIntent float64 `json:"self-harm/intent,required"`
// The score for the category 'sexual'.
Sexual float64 `json:"sexual,required"`
// The score for the category 'sexual/minors'.
SexualMinors float64 `json:"sexual/minors,required"`
// The score for the category 'violence'.
Violence float64 `json:"violence,required"`
// The score for the category 'violence/graphic'.
ViolenceGraphic float64 `json:"violence/graphic,required"`
// Metadata for the response, check the presence of optional fields with the
// [resp.Field.IsPresent] method.
JSON struct {
Harassment resp.Field
HarassmentThreatening resp.Field
Hate resp.Field
HateThreatening resp.Field
Illicit resp.Field
IllicitViolent resp.Field
SelfHarm resp.Field
SelfHarmInstructions resp.Field
SelfHarmIntent resp.Field
Sexual resp.Field
SexualMinors resp.Field
Violence resp.Field
ViolenceGraphic resp.Field
ExtraFields map[string]resp.Field
raw string
} `json:"-"`
}
// Returns the unmodified JSON received from the API
func (r ModerationCategoryScores) RawJSON() string { return r.JSON.raw }
func (r *ModerationCategoryScores) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
// An object describing an image to classify.
//
// The properties ImageURL, Type are required.
type ModerationImageURLInputParam struct {
// Contains either an image URL or a data URL for a base64 encoded image.
ImageURL ModerationImageURLInputImageURLParam `json:"image_url,omitzero,required"`
// Always `image_url`.
//
// This field can be elided, and will marshal its zero value as "image_url".
Type constant.ImageURL `json:"type,required"`
paramObj
}
// IsPresent returns true if the field's value is not omitted and not the JSON
// "null". To check if this field is omitted, use [param.IsOmitted].
func (f ModerationImageURLInputParam) IsPresent() bool { return !param.IsOmitted(f) && !f.IsNull() }
func (r ModerationImageURLInputParam) MarshalJSON() (data []byte, err error) {
type shadow ModerationImageURLInputParam
return param.MarshalObject(r, (*shadow)(&r))
}
// Contains either an image URL or a data URL for a base64 encoded image.
//
// The property URL is required.
type ModerationImageURLInputImageURLParam struct {
// Either a URL of the image or the base64 encoded image data.
URL string `json:"url,required" format:"uri"`
paramObj
}
// IsPresent returns true if the field's value is not omitted and not the JSON
// "null". To check if this field is omitted, use [param.IsOmitted].
func (f ModerationImageURLInputImageURLParam) IsPresent() bool {
return !param.IsOmitted(f) && !f.IsNull()
}
func (r ModerationImageURLInputImageURLParam) MarshalJSON() (data []byte, err error) {
type shadow ModerationImageURLInputImageURLParam
return param.MarshalObject(r, (*shadow)(&r))
}
type ModerationModel = string
const (
ModerationModelOmniModerationLatest ModerationModel = "omni-moderation-latest"
ModerationModelOmniModeration2024_09_26 ModerationModel = "omni-moderation-2024-09-26"
ModerationModelTextModerationLatest ModerationModel = "text-moderation-latest"
ModerationModelTextModerationStable ModerationModel = "text-moderation-stable"
)
func ModerationMultiModalInputParamOfImageURL(imageURL ModerationImageURLInputImageURLParam) ModerationMultiModalInputUnionParam {
var variant ModerationImageURLInputParam
variant.ImageURL = imageURL
return ModerationMultiModalInputUnionParam{OfImageURL: &variant}
}
func ModerationMultiModalInputParamOfText(text string) ModerationMultiModalInputUnionParam {
var variant ModerationTextInputParam
variant.Text = text
return ModerationMultiModalInputUnionParam{OfText: &variant}
}
// Only one field can be non-zero.
//
// Use [param.IsOmitted] to confirm if a field is set.
type ModerationMultiModalInputUnionParam struct {
OfImageURL *ModerationImageURLInputParam `json:",omitzero,inline"`
OfText *ModerationTextInputParam `json:",omitzero,inline"`
paramUnion
}
// IsPresent returns true if the field's value is not omitted and not the JSON
// "null". To check if this field is omitted, use [param.IsOmitted].
func (u ModerationMultiModalInputUnionParam) IsPresent() bool {
return !param.IsOmitted(u) && !u.IsNull()
}
func (u ModerationMultiModalInputUnionParam) MarshalJSON() ([]byte, error) {
return param.MarshalUnion[ModerationMultiModalInputUnionParam](u.OfImageURL, u.OfText)
}
func (u *ModerationMultiModalInputUnionParam) asAny() any {
if !param.IsOmitted(u.OfImageURL) {
return u.OfImageURL
} else if !param.IsOmitted(u.OfText) {
return u.OfText
}
return nil
}
// Returns a pointer to the underlying variant's property, if present.
func (u ModerationMultiModalInputUnionParam) GetImageURL() *ModerationImageURLInputImageURLParam {
if vt := u.OfImageURL; vt != nil {
return &vt.ImageURL
}
return nil
}
// Returns a pointer to the underlying variant's property, if present.
func (u ModerationMultiModalInputUnionParam) GetText() *string {
if vt := u.OfText; vt != nil {
return &vt.Text
}
return nil
}
// Returns a pointer to the underlying variant's property, if present.
func (u ModerationMultiModalInputUnionParam) GetType() *string {
if vt := u.OfImageURL; vt != nil {
return (*string)(&vt.Type)
} else if vt := u.OfText; vt != nil {
return (*string)(&vt.Type)
}
return nil
}
func init() {
apijson.RegisterUnion[ModerationMultiModalInputUnionParam](
"type",
apijson.UnionVariant{
TypeFilter: gjson.JSON,
Type: reflect.TypeOf(ModerationImageURLInputParam{}),
DiscriminatorValue: "image_url",
},
apijson.UnionVariant{
TypeFilter: gjson.JSON,
Type: reflect.TypeOf(ModerationTextInputParam{}),
DiscriminatorValue: "text",
},
)
}
// An object describing text to classify.
//
// The properties Text, Type are required.
type ModerationTextInputParam struct {
// A string of text to classify.
Text string `json:"text,required"`
// Always `text`.
//
// This field can be elided, and will marshal its zero value as "text".
Type constant.Text `json:"type,required"`
paramObj
}
// IsPresent returns true if the field's value is not omitted and not the JSON
// "null". To check if this field is omitted, use [param.IsOmitted].
func (f ModerationTextInputParam) IsPresent() bool { return !param.IsOmitted(f) && !f.IsNull() }
func (r ModerationTextInputParam) MarshalJSON() (data []byte, err error) {
type shadow ModerationTextInputParam
return param.MarshalObject(r, (*shadow)(&r))
}
// Represents if a given text input is potentially harmful.
type ModerationNewResponse struct {
// The unique identifier for the moderation request.
ID string `json:"id,required"`
// The model used to generate the moderation results.
Model string `json:"model,required"`
// A list of moderation objects.
Results []Moderation `json:"results,required"`
// Metadata for the response, check the presence of optional fields with the
// [resp.Field.IsPresent] method.
JSON struct {
ID resp.Field
Model resp.Field
Results resp.Field
ExtraFields map[string]resp.Field
raw string
} `json:"-"`
}
// Returns the unmodified JSON received from the API
func (r ModerationNewResponse) RawJSON() string { return r.JSON.raw }
func (r *ModerationNewResponse) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
type ModerationNewParams struct {
// Input (or inputs) to classify. Can be a single string, an array of strings, or
// an array of multi-modal input objects similar to other models.
Input ModerationNewParamsInputUnion `json:"input,omitzero,required"`
// The content moderation model you would like to use. Learn more in
// [the moderation guide](https://platform.openai.com/docs/guides/moderation), and
// learn about available models
// [here](https://platform.openai.com/docs/models#moderation).
Model ModerationModel `json:"model,omitzero"`
paramObj
}
// IsPresent returns true if the field's value is not omitted and not the JSON
// "null". To check if this field is omitted, use [param.IsOmitted].
func (f ModerationNewParams) IsPresent() bool { return !param.IsOmitted(f) && !f.IsNull() }
func (r ModerationNewParams) MarshalJSON() (data []byte, err error) {
type shadow ModerationNewParams
return param.MarshalObject(r, (*shadow)(&r))
}
// Only one field can be non-zero.
//
// Use [param.IsOmitted] to confirm if a field is set.
type ModerationNewParamsInputUnion struct {
OfString param.Opt[string] `json:",omitzero,inline"`
OfModerationNewsInputArray []string `json:",omitzero,inline"`
OfModerationMultiModalArray []ModerationMultiModalInputUnionParam `json:",omitzero,inline"`
paramUnion
}
// IsPresent returns true if the field's value is not omitted and not the JSON
// "null". To check if this field is omitted, use [param.IsOmitted].
func (u ModerationNewParamsInputUnion) IsPresent() bool { return !param.IsOmitted(u) && !u.IsNull() }
func (u ModerationNewParamsInputUnion) MarshalJSON() ([]byte, error) {
return param.MarshalUnion[ModerationNewParamsInputUnion](u.OfString, u.OfModerationNewsInputArray, u.OfModerationMultiModalArray)
}
func (u *ModerationNewParamsInputUnion) asAny() any {
if !param.IsOmitted(u.OfString) {
return &u.OfString.Value
} else if !param.IsOmitted(u.OfModerationNewsInputArray) {
return &u.OfModerationNewsInputArray
} else if !param.IsOmitted(u.OfModerationMultiModalArray) {
return &u.OfModerationMultiModalArray
}
return nil
}