packages feed

openai 1.1.0 → 1.1.1

raw patch · 11 files changed

+1350/−741 lines, 11 filesdep ~basenew-component:exe:weather-chatbot-examplePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base

API changes (from Hackage documentation)

- OpenAI.V1: [$sel:addUploadPart:Methods] :: Methods -> UploadID -> AddUploadPart -> IO PartObject
- OpenAI.V1: [$sel:cancelBatch:Methods] :: Methods -> BatchID -> IO BatchObject
- OpenAI.V1: [$sel:cancelFineTuning:Methods] :: Methods -> FineTuningJobID -> IO JobObject
- OpenAI.V1: [$sel:cancelRun:Methods] :: Methods -> ThreadID -> RunID -> IO RunObject
- OpenAI.V1: [$sel:cancelUpload:Methods] :: Methods -> UploadID -> IO (UploadObject (Maybe Void))
- OpenAI.V1: [$sel:cancelVectorStoreFileBatch:Methods] :: Methods -> VectorStoreID -> VectorStoreFileBatchID -> IO VectorStoreFilesBatchObject
- OpenAI.V1: [$sel:completeUpload:Methods] :: Methods -> UploadID -> CompleteUpload -> IO (UploadObject FileObject)
- OpenAI.V1: [$sel:createAssistant:Methods] :: Methods -> CreateAssistant -> IO AssistantObject
- OpenAI.V1: [$sel:createBatch:Methods] :: Methods -> CreateBatch -> IO BatchObject
- OpenAI.V1: [$sel:createChatCompletion:Methods] :: Methods -> CreateChatCompletion -> IO ChatCompletionObject
- OpenAI.V1: [$sel:createEmbeddings:Methods] :: Methods -> CreateEmbeddings -> IO (Vector EmbeddingObject)
- OpenAI.V1: [$sel:createFineTuningJob:Methods] :: Methods -> CreateFineTuningJob -> IO JobObject
- OpenAI.V1: [$sel:createImage:Methods] :: Methods -> CreateImage -> IO (Vector ImageObject)
- OpenAI.V1: [$sel:createImageEdit:Methods] :: Methods -> CreateImageEdit -> IO (Vector ImageObject)
- OpenAI.V1: [$sel:createImageVariation:Methods] :: Methods -> CreateImageVariation -> IO (Vector ImageObject)
- OpenAI.V1: [$sel:createMessage:Methods] :: Methods -> ThreadID -> Message -> IO MessageObject
- OpenAI.V1: [$sel:createModeration:Methods] :: Methods -> CreateModeration -> IO Moderation
- OpenAI.V1: [$sel:createRun:Methods] :: Methods -> ThreadID -> Maybe Text -> CreateRun -> IO RunObject
- OpenAI.V1: [$sel:createSpeech:Methods] :: Methods -> CreateSpeech -> IO ByteString
- OpenAI.V1: [$sel:createThread:Methods] :: Methods -> Thread -> IO ThreadObject
- OpenAI.V1: [$sel:createThreadAndRun:Methods] :: Methods -> CreateThreadAndRun -> IO RunObject
- OpenAI.V1: [$sel:createTranscription:Methods] :: Methods -> CreateTranscription -> IO TranscriptionObject
- OpenAI.V1: [$sel:createTranslation:Methods] :: Methods -> CreateTranslation -> IO TranslationObject
- OpenAI.V1: [$sel:createUpload:Methods] :: Methods -> CreateUpload -> IO (UploadObject (Maybe Void))
- OpenAI.V1: [$sel:createVectorStore:Methods] :: Methods -> CreateVectorStore -> IO VectorStoreObject
- OpenAI.V1: [$sel:createVectorStoreFile:Methods] :: Methods -> VectorStoreID -> CreateVectorStoreFile -> IO VectorStoreFileObject
- OpenAI.V1: [$sel:createVectorStoreFileBatch:Methods] :: Methods -> VectorStoreID -> CreateVectorStoreFileBatch -> IO VectorStoreFilesBatchObject
- OpenAI.V1: [$sel:deleteAssistant:Methods] :: Methods -> AssistantID -> IO DeletionStatus
- OpenAI.V1: [$sel:deleteFile:Methods] :: Methods -> FileID -> IO DeletionStatus
- OpenAI.V1: [$sel:deleteMessage:Methods] :: Methods -> ThreadID -> MessageID -> IO DeletionStatus
- OpenAI.V1: [$sel:deleteModel:Methods] :: Methods -> Model -> IO DeletionStatus
- OpenAI.V1: [$sel:deleteThread:Methods] :: Methods -> ThreadID -> IO DeletionStatus
- OpenAI.V1: [$sel:deleteVectorStore:Methods] :: Methods -> VectorStoreID -> IO DeletionStatus
- OpenAI.V1: [$sel:deleteVectorStoreFile:Methods] :: Methods -> VectorStoreID -> VectorStoreFileID -> IO DeletionStatus
- OpenAI.V1: [$sel:listAssistants:Methods] :: Methods -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector AssistantObject)
- OpenAI.V1: [$sel:listBatch:Methods] :: Methods -> Maybe Text -> Maybe Natural -> IO (Vector BatchObject)
- OpenAI.V1: [$sel:listFiles:Methods] :: Methods -> Maybe Purpose -> Maybe Natural -> Maybe Order -> Maybe Text -> IO (Vector FileObject)
- OpenAI.V1: [$sel:listFineTuningCheckpoints:Methods] :: Methods -> FineTuningJobID -> Maybe Text -> Maybe Natural -> IO (Vector CheckpointObject)
- OpenAI.V1: [$sel:listFineTuningEvents:Methods] :: Methods -> FineTuningJobID -> Maybe Text -> Maybe Natural -> IO (Vector EventObject)
- OpenAI.V1: [$sel:listFineTuningJobs:Methods] :: Methods -> Maybe Text -> Maybe Natural -> IO (Vector JobObject)
- OpenAI.V1: [$sel:listMessages:Methods] :: Methods -> ThreadID -> IO (Vector MessageObject)
- OpenAI.V1: [$sel:listModels:Methods] :: Methods -> IO (Vector ModelObject)
- OpenAI.V1: [$sel:listRunSteps:Methods] :: Methods -> ThreadID -> RunID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Text -> IO (Vector RunStepObject)
- OpenAI.V1: [$sel:listRuns:Methods] :: Methods -> ThreadID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector RunObject)
- OpenAI.V1: [$sel:listVectorStoreFiles:Methods] :: Methods -> VectorStoreID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Status -> IO (Vector VectorStoreFileObject)
- OpenAI.V1: [$sel:listVectorStoreFilesInABatch:Methods] :: Methods -> VectorStoreID -> VectorStoreFileBatchID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Status -> IO (Vector VectorStoreFilesBatchObject)
- OpenAI.V1: [$sel:listVectorStores:Methods] :: Methods -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector VectorStoreObject)
- OpenAI.V1: [$sel:modifyAssistant:Methods] :: Methods -> AssistantID -> ModifyAssistant -> IO AssistantObject
- OpenAI.V1: [$sel:modifyMessage:Methods] :: Methods -> ThreadID -> MessageID -> ModifyMessage -> IO MessageObject
- OpenAI.V1: [$sel:modifyRun:Methods] :: Methods -> ThreadID -> RunID -> ModifyRun -> IO RunObject
- OpenAI.V1: [$sel:modifyThread:Methods] :: Methods -> ThreadID -> ModifyThread -> IO ThreadObject
- OpenAI.V1: [$sel:modifyVectorStore:Methods] :: Methods -> VectorStoreID -> ModifyVectorStore -> IO VectorStoreObject
- OpenAI.V1: [$sel:retrieveAssistant:Methods] :: Methods -> AssistantID -> IO AssistantObject
- OpenAI.V1: [$sel:retrieveBatch:Methods] :: Methods -> BatchID -> IO BatchObject
- OpenAI.V1: [$sel:retrieveFile:Methods] :: Methods -> FileID -> IO FileObject
- OpenAI.V1: [$sel:retrieveFileContent:Methods] :: Methods -> FileID -> IO ByteString
- OpenAI.V1: [$sel:retrieveFineTuningJob:Methods] :: Methods -> FineTuningJobID -> IO JobObject
- OpenAI.V1: [$sel:retrieveMessage:Methods] :: Methods -> ThreadID -> MessageID -> IO MessageObject
- OpenAI.V1: [$sel:retrieveModel:Methods] :: Methods -> Model -> IO ModelObject
- OpenAI.V1: [$sel:retrieveRun:Methods] :: Methods -> ThreadID -> RunID -> IO RunObject
- OpenAI.V1: [$sel:retrieveRunStep:Methods] :: Methods -> ThreadID -> RunID -> StepID -> Maybe Text -> IO RunStepObject
- OpenAI.V1: [$sel:retrieveThread:Methods] :: Methods -> ThreadID -> IO ThreadObject
- OpenAI.V1: [$sel:retrieveVectorStore:Methods] :: Methods -> VectorStoreID -> IO VectorStoreObject
- OpenAI.V1: [$sel:retrieveVectorStoreFile:Methods] :: Methods -> VectorStoreID -> VectorStoreFileID -> IO VectorStoreFileObject
- OpenAI.V1: [$sel:retrieveVectorStoreFileBatch:Methods] :: Methods -> VectorStoreID -> VectorStoreFileBatchID -> IO VectorStoreFilesBatchObject
- OpenAI.V1: [$sel:submitToolOutputsToRun:Methods] :: Methods -> ThreadID -> RunID -> SubmitToolOutputsToRun -> IO RunObject
- OpenAI.V1: [$sel:uploadFile:Methods] :: Methods -> UploadFile -> IO FileObject
- OpenAI.V1.Assistants: [$sel:code_interpreter:ToolResources] :: ToolResources -> Maybe CodeInterpreterResources
- OpenAI.V1.Assistants: [$sel:created_at:AssistantObject] :: AssistantObject -> POSIXTime
- OpenAI.V1.Assistants: [$sel:description:AssistantObject] :: AssistantObject -> Maybe Text
- OpenAI.V1.Assistants: [$sel:description:CreateAssistant] :: CreateAssistant -> Maybe Text
- OpenAI.V1.Assistants: [$sel:description:Function] :: Function -> Maybe Text
- OpenAI.V1.Assistants: [$sel:description:ModifyAssistant] :: ModifyAssistant -> Maybe Text
- OpenAI.V1.Assistants: [$sel:file_ids:CodeInterpreterResources] :: CodeInterpreterResources -> Maybe (Vector FileID)
- OpenAI.V1.Assistants: [$sel:file_search:ToolResources] :: ToolResources -> Maybe FileSearchResources
- OpenAI.V1.Assistants: [$sel:file_search:Tool_Code_Interpreter] :: Tool -> FileSearch
- OpenAI.V1.Assistants: [$sel:function:Tool_Code_Interpreter] :: Tool -> Function
- OpenAI.V1.Assistants: [$sel:id:AssistantObject] :: AssistantObject -> AssistantID
- OpenAI.V1.Assistants: [$sel:instructions:AssistantObject] :: AssistantObject -> Maybe Text
- OpenAI.V1.Assistants: [$sel:instructions:CreateAssistant] :: CreateAssistant -> Maybe Text
- OpenAI.V1.Assistants: [$sel:instructions:ModifyAssistant] :: ModifyAssistant -> Maybe Text
- OpenAI.V1.Assistants: [$sel:max_num_results:FileSearch] :: FileSearch -> Maybe Natural
- OpenAI.V1.Assistants: [$sel:metadata:AssistantObject] :: AssistantObject -> Map Text Text
- OpenAI.V1.Assistants: [$sel:metadata:CreateAssistant] :: CreateAssistant -> Maybe (Map Text Text)
- OpenAI.V1.Assistants: [$sel:metadata:ModifyAssistant] :: ModifyAssistant -> Maybe (Map Text Text)
- OpenAI.V1.Assistants: [$sel:model:AssistantObject] :: AssistantObject -> Model
- OpenAI.V1.Assistants: [$sel:model:CreateAssistant] :: CreateAssistant -> Model
- OpenAI.V1.Assistants: [$sel:model:ModifyAssistant] :: ModifyAssistant -> Model
- OpenAI.V1.Assistants: [$sel:name:AssistantObject] :: AssistantObject -> Maybe Text
- OpenAI.V1.Assistants: [$sel:name:CreateAssistant] :: CreateAssistant -> Maybe Text
- OpenAI.V1.Assistants: [$sel:name:Function] :: Function -> Text
- OpenAI.V1.Assistants: [$sel:name:ModifyAssistant] :: ModifyAssistant -> Maybe Text
- OpenAI.V1.Assistants: [$sel:object:AssistantObject] :: AssistantObject -> Text
- OpenAI.V1.Assistants: [$sel:parameters:Function] :: Function -> Maybe Value
- OpenAI.V1.Assistants: [$sel:ranking_options:FileSearch] :: FileSearch -> Maybe RankingOptions
- OpenAI.V1.Assistants: [$sel:response_format:AssistantObject] :: AssistantObject -> AutoOr ResponseFormat
- OpenAI.V1.Assistants: [$sel:response_format:CreateAssistant] :: CreateAssistant -> Maybe (AutoOr ResponseFormat)
- OpenAI.V1.Assistants: [$sel:response_format:ModifyAssistant] :: ModifyAssistant -> Maybe (AutoOr ResponseFormat)
- OpenAI.V1.Assistants: [$sel:strict:Function] :: Function -> Maybe Bool
- OpenAI.V1.Assistants: [$sel:temperature:AssistantObject] :: AssistantObject -> Maybe Double
- OpenAI.V1.Assistants: [$sel:temperature:CreateAssistant] :: CreateAssistant -> Maybe Double
- OpenAI.V1.Assistants: [$sel:temperature:ModifyAssistant] :: ModifyAssistant -> Maybe Double
- OpenAI.V1.Assistants: [$sel:text:AssistantID] :: AssistantID -> Text
- OpenAI.V1.Assistants: [$sel:tool_resources:AssistantObject] :: AssistantObject -> Maybe ToolResources
- OpenAI.V1.Assistants: [$sel:tool_resources:CreateAssistant] :: CreateAssistant -> Maybe ToolResources
- OpenAI.V1.Assistants: [$sel:tool_resources:ModifyAssistant] :: ModifyAssistant -> Maybe ToolResources
- OpenAI.V1.Assistants: [$sel:tools:AssistantObject] :: AssistantObject -> Maybe (Vector Tool)
- OpenAI.V1.Assistants: [$sel:tools:CreateAssistant] :: CreateAssistant -> Maybe (Vector Tool)
- OpenAI.V1.Assistants: [$sel:tools:ModifyAssistant] :: ModifyAssistant -> Maybe (Vector Tool)
- OpenAI.V1.Assistants: [$sel:top_p:AssistantObject] :: AssistantObject -> Maybe Double
- OpenAI.V1.Assistants: [$sel:top_p:CreateAssistant] :: CreateAssistant -> Maybe Double
- OpenAI.V1.Assistants: [$sel:top_p:ModifyAssistant] :: ModifyAssistant -> Maybe Double
- OpenAI.V1.Assistants: [$sel:vector_store_ids:FileSearchResources] :: FileSearchResources -> Maybe (Vector FileID)
- OpenAI.V1.Assistants: [$sel:vector_stores:FileSearchResources] :: FileSearchResources -> Maybe (Vector VectorStore)
- OpenAI.V1.Audio.Speech: [$sel:input:CreateSpeech] :: CreateSpeech -> Text
- OpenAI.V1.Audio.Speech: [$sel:model:CreateSpeech] :: CreateSpeech -> Model
- OpenAI.V1.Audio.Speech: [$sel:response_format:CreateSpeech] :: CreateSpeech -> Maybe Format
- OpenAI.V1.Audio.Speech: [$sel:speed:CreateSpeech] :: CreateSpeech -> Maybe Double
- OpenAI.V1.Audio.Speech: [$sel:voice:CreateSpeech] :: CreateSpeech -> Voice
- OpenAI.V1.Audio.Transcriptions: [$sel:avg_logprob:Segment] :: Segment -> Double
- OpenAI.V1.Audio.Transcriptions: [$sel:compression_ratio:Segment] :: Segment -> Double
- OpenAI.V1.Audio.Transcriptions: [$sel:duration:TranscriptionObject] :: TranscriptionObject -> Maybe Double
- OpenAI.V1.Audio.Transcriptions: [$sel:end:Segment] :: Segment -> Double
- OpenAI.V1.Audio.Transcriptions: [$sel:file:CreateTranscription] :: CreateTranscription -> FilePath
- OpenAI.V1.Audio.Transcriptions: [$sel:id:Segment] :: Segment -> Integer
- OpenAI.V1.Audio.Transcriptions: [$sel:language:CreateTranscription] :: CreateTranscription -> Maybe Text
- OpenAI.V1.Audio.Transcriptions: [$sel:language:TranscriptionObject] :: TranscriptionObject -> Maybe Text
- OpenAI.V1.Audio.Transcriptions: [$sel:model:CreateTranscription] :: CreateTranscription -> Model
- OpenAI.V1.Audio.Transcriptions: [$sel:no_speech_prob:Segment] :: Segment -> Double
- OpenAI.V1.Audio.Transcriptions: [$sel:prompt:CreateTranscription] :: CreateTranscription -> Maybe Text
- OpenAI.V1.Audio.Transcriptions: [$sel:seek:Segment] :: Segment -> Integer
- OpenAI.V1.Audio.Transcriptions: [$sel:segments:TranscriptionObject] :: TranscriptionObject -> Vector Segment
- OpenAI.V1.Audio.Transcriptions: [$sel:start:Segment] :: Segment -> Double
- OpenAI.V1.Audio.Transcriptions: [$sel:temperature:CreateTranscription] :: CreateTranscription -> Maybe Double
- OpenAI.V1.Audio.Transcriptions: [$sel:temperature:Segment] :: Segment -> Double
- OpenAI.V1.Audio.Transcriptions: [$sel:text:Segment] :: Segment -> Text
- OpenAI.V1.Audio.Transcriptions: [$sel:text:TranscriptionObject] :: TranscriptionObject -> Text
- OpenAI.V1.Audio.Transcriptions: [$sel:tokens:Segment] :: Segment -> Vector Word
- OpenAI.V1.Audio.Translations: [$sel:file:CreateTranslation] :: CreateTranslation -> FilePath
- OpenAI.V1.Audio.Translations: [$sel:model:CreateTranslation] :: CreateTranslation -> Model
- OpenAI.V1.Audio.Translations: [$sel:prompt:CreateTranslation] :: CreateTranslation -> Maybe Text
- OpenAI.V1.Audio.Translations: [$sel:temperature:CreateTranslation] :: CreateTranslation -> Maybe Double
- OpenAI.V1.Audio.Translations: [$sel:text:TranslationObject] :: TranslationObject -> Text
- OpenAI.V1.Batches: [$sel:cancelled_at:BatchObject] :: BatchObject -> Maybe POSIXTime
- OpenAI.V1.Batches: [$sel:cancelling_at:BatchObject] :: BatchObject -> Maybe POSIXTime
- OpenAI.V1.Batches: [$sel:completed:Counts] :: Counts -> Natural
- OpenAI.V1.Batches: [$sel:completed_at:BatchObject] :: BatchObject -> Maybe POSIXTime
- OpenAI.V1.Batches: [$sel:completion_window:BatchObject] :: BatchObject -> Text
- OpenAI.V1.Batches: [$sel:completion_window:CreateBatch] :: CreateBatch -> Text
- OpenAI.V1.Batches: [$sel:created_at:BatchObject] :: BatchObject -> POSIXTime
- OpenAI.V1.Batches: [$sel:endpoint:BatchObject] :: BatchObject -> Text
- OpenAI.V1.Batches: [$sel:endpoint:CreateBatch] :: CreateBatch -> Text
- OpenAI.V1.Batches: [$sel:error_file_id:BatchObject] :: BatchObject -> Maybe FileID
- OpenAI.V1.Batches: [$sel:errors:BatchObject] :: BatchObject -> Maybe (ListOf Error)
- OpenAI.V1.Batches: [$sel:expired_at:BatchObject] :: BatchObject -> Maybe POSIXTime
- OpenAI.V1.Batches: [$sel:expires_at:BatchObject] :: BatchObject -> Maybe POSIXTime
- OpenAI.V1.Batches: [$sel:failed:Counts] :: Counts -> Natural
- OpenAI.V1.Batches: [$sel:failed_at:BatchObject] :: BatchObject -> Maybe POSIXTime
- OpenAI.V1.Batches: [$sel:finalizing_at:BatchObject] :: BatchObject -> Maybe POSIXTime
- OpenAI.V1.Batches: [$sel:id:BatchObject] :: BatchObject -> BatchID
- OpenAI.V1.Batches: [$sel:in_progress_at:BatchObject] :: BatchObject -> Maybe POSIXTime
- OpenAI.V1.Batches: [$sel:input_file_id:BatchObject] :: BatchObject -> FileID
- OpenAI.V1.Batches: [$sel:input_file_id:CreateBatch] :: CreateBatch -> FileID
- OpenAI.V1.Batches: [$sel:metadata:BatchObject] :: BatchObject -> Maybe (Map Text Text)
- OpenAI.V1.Batches: [$sel:metadata:CreateBatch] :: CreateBatch -> Maybe (Map Text Text)
- OpenAI.V1.Batches: [$sel:object:BatchObject] :: BatchObject -> Text
- OpenAI.V1.Batches: [$sel:output_file_id:BatchObject] :: BatchObject -> Maybe FileID
- OpenAI.V1.Batches: [$sel:request_counts:BatchObject] :: BatchObject -> Maybe Counts
- OpenAI.V1.Batches: [$sel:status:BatchObject] :: BatchObject -> Status
- OpenAI.V1.Batches: [$sel:text:BatchID] :: BatchID -> Text
- OpenAI.V1.Batches: [$sel:total:Counts] :: Counts -> Natural
- OpenAI.V1.Chat.Completions: High :: ReasoningEffort
- OpenAI.V1.Chat.Completions: Low :: ReasoningEffort
- OpenAI.V1.Chat.Completions: Medium :: ReasoningEffort
- OpenAI.V1.Chat.Completions: [$sel:assistant_audio:System] :: Message content -> Maybe AudioData
- OpenAI.V1.Chat.Completions: [$sel:assistant_content:System] :: Message content -> Maybe content
- OpenAI.V1.Chat.Completions: [$sel:audio:CreateChatCompletion] :: CreateChatCompletion -> Maybe AudioParameters
- OpenAI.V1.Chat.Completions: [$sel:bytes:Token] :: Token -> Maybe (Vector Word8)
- OpenAI.V1.Chat.Completions: [$sel:choices:ChatCompletionObject] :: ChatCompletionObject -> Vector Choice
- OpenAI.V1.Chat.Completions: [$sel:content:Content] :: Prediction -> Text
- OpenAI.V1.Chat.Completions: [$sel:content:LogProbs] :: LogProbs -> Maybe (Vector Token)
- OpenAI.V1.Chat.Completions: [$sel:content:System] :: Message content -> content
- OpenAI.V1.Chat.Completions: [$sel:created:ChatCompletionObject] :: ChatCompletionObject -> POSIXTime
- OpenAI.V1.Chat.Completions: [$sel:data_:InputAudio] :: InputAudio -> Text
- OpenAI.V1.Chat.Completions: [$sel:detail:ImageURL] :: ImageURL -> Maybe (AutoOr Text)
- OpenAI.V1.Chat.Completions: [$sel:finish_reason:Choice] :: Choice -> Text
- OpenAI.V1.Chat.Completions: [$sel:format:AudioParameters] :: AudioParameters -> AudioFormat
- OpenAI.V1.Chat.Completions: [$sel:format:InputAudio] :: InputAudio -> AudioFormat
- OpenAI.V1.Chat.Completions: [$sel:frequency_penalty:CreateChatCompletion] :: CreateChatCompletion -> Maybe Double
- OpenAI.V1.Chat.Completions: [$sel:id:AudioData] :: AudioData -> Text
- OpenAI.V1.Chat.Completions: [$sel:id:ChatCompletionObject] :: ChatCompletionObject -> Text
- OpenAI.V1.Chat.Completions: [$sel:image_url:Text] :: Content -> ImageURL
- OpenAI.V1.Chat.Completions: [$sel:index:Choice] :: Choice -> Natural
- OpenAI.V1.Chat.Completions: [$sel:input_audio:Text] :: Content -> InputAudio
- OpenAI.V1.Chat.Completions: [$sel:json_schema:ResponseFormat_Text] :: ResponseFormat -> JSONSchema
- OpenAI.V1.Chat.Completions: [$sel:logit_bias:CreateChatCompletion] :: CreateChatCompletion -> Maybe (Map Word Int)
- OpenAI.V1.Chat.Completions: [$sel:logprob:Token] :: Token -> Double
- OpenAI.V1.Chat.Completions: [$sel:logprobs:Choice] :: Choice -> Maybe LogProbs
- OpenAI.V1.Chat.Completions: [$sel:logprobs:CreateChatCompletion] :: CreateChatCompletion -> Maybe Bool
- OpenAI.V1.Chat.Completions: [$sel:max_completion_tokens:CreateChatCompletion] :: CreateChatCompletion -> Maybe Natural
- OpenAI.V1.Chat.Completions: [$sel:message:Choice] :: Choice -> Message Text
- OpenAI.V1.Chat.Completions: [$sel:messages:CreateChatCompletion] :: CreateChatCompletion -> Vector (Message (Vector Content))
- OpenAI.V1.Chat.Completions: [$sel:metadata:CreateChatCompletion] :: CreateChatCompletion -> Maybe (Map Text Text)
- OpenAI.V1.Chat.Completions: [$sel:modalities:CreateChatCompletion] :: CreateChatCompletion -> Maybe (Vector Modality)
- OpenAI.V1.Chat.Completions: [$sel:model:ChatCompletionObject] :: ChatCompletionObject -> Model
- OpenAI.V1.Chat.Completions: [$sel:model:CreateChatCompletion] :: CreateChatCompletion -> Model
- OpenAI.V1.Chat.Completions: [$sel:n:CreateChatCompletion] :: CreateChatCompletion -> Maybe Natural
- OpenAI.V1.Chat.Completions: [$sel:name:System] :: Message content -> Maybe Text
- OpenAI.V1.Chat.Completions: [$sel:object:ChatCompletionObject] :: ChatCompletionObject -> Text
- OpenAI.V1.Chat.Completions: [$sel:parallel_tool_calls:CreateChatCompletion] :: CreateChatCompletion -> Maybe Bool
- OpenAI.V1.Chat.Completions: [$sel:prediction:CreateChatCompletion] :: CreateChatCompletion -> Maybe Prediction
- OpenAI.V1.Chat.Completions: [$sel:presence_penalty:CreateChatCompletion] :: CreateChatCompletion -> Maybe Double
- OpenAI.V1.Chat.Completions: [$sel:reasoning_effort:ChatCompletionObject] :: ChatCompletionObject -> Maybe ReasoningEffort
- OpenAI.V1.Chat.Completions: [$sel:reasoning_effort:CreateChatCompletion] :: CreateChatCompletion -> Maybe ReasoningEffort
- OpenAI.V1.Chat.Completions: [$sel:refusal:LogProbs] :: LogProbs -> Maybe (Vector Token)
- OpenAI.V1.Chat.Completions: [$sel:refusal:System] :: Message content -> Maybe Text
- OpenAI.V1.Chat.Completions: [$sel:response_format:CreateChatCompletion] :: CreateChatCompletion -> Maybe ResponseFormat
- OpenAI.V1.Chat.Completions: [$sel:seed:CreateChatCompletion] :: CreateChatCompletion -> Maybe Integer
- OpenAI.V1.Chat.Completions: [$sel:service_tier:ChatCompletionObject] :: ChatCompletionObject -> Maybe ServiceTier
- OpenAI.V1.Chat.Completions: [$sel:service_tier:CreateChatCompletion] :: CreateChatCompletion -> Maybe (AutoOr ServiceTier)
- OpenAI.V1.Chat.Completions: [$sel:stop:CreateChatCompletion] :: CreateChatCompletion -> Maybe (Vector Text)
- OpenAI.V1.Chat.Completions: [$sel:store:CreateChatCompletion] :: CreateChatCompletion -> Maybe Bool
- OpenAI.V1.Chat.Completions: [$sel:system_fingerprint:ChatCompletionObject] :: ChatCompletionObject -> Maybe Text
- OpenAI.V1.Chat.Completions: [$sel:temperature:CreateChatCompletion] :: CreateChatCompletion -> Maybe Double
- OpenAI.V1.Chat.Completions: [$sel:text:Text] :: Content -> Text
- OpenAI.V1.Chat.Completions: [$sel:token:Token] :: Token -> Text
- OpenAI.V1.Chat.Completions: [$sel:tool_call_id:System] :: Message content -> Text
- OpenAI.V1.Chat.Completions: [$sel:tool_calls:System] :: Message content -> Maybe (Vector ToolCall)
- OpenAI.V1.Chat.Completions: [$sel:tool_choice:CreateChatCompletion] :: CreateChatCompletion -> Maybe ToolChoice
- OpenAI.V1.Chat.Completions: [$sel:tools:CreateChatCompletion] :: CreateChatCompletion -> Maybe (Vector Tool)
- OpenAI.V1.Chat.Completions: [$sel:top_logprobs:CreateChatCompletion] :: CreateChatCompletion -> Maybe Word
- OpenAI.V1.Chat.Completions: [$sel:top_logprobs:Token] :: Token -> Maybe (Vector Token)
- OpenAI.V1.Chat.Completions: [$sel:top_p:CreateChatCompletion] :: CreateChatCompletion -> Maybe Double
- OpenAI.V1.Chat.Completions: [$sel:url:ImageURL] :: ImageURL -> Text
- OpenAI.V1.Chat.Completions: [$sel:usage:ChatCompletionObject] :: ChatCompletionObject -> Usage CompletionTokensDetails PromptTokensDetails
- OpenAI.V1.Chat.Completions: [$sel:user:CreateChatCompletion] :: CreateChatCompletion -> Maybe Text
- OpenAI.V1.Chat.Completions: [$sel:voice:AudioParameters] :: AudioParameters -> Voice
- OpenAI.V1.ChunkingStrategy: [$sel:chunk_overlap_tokens:Static] :: Static -> Natural
- OpenAI.V1.ChunkingStrategy: [$sel:max_chunk_size_tokens:Static] :: Static -> Natural
- OpenAI.V1.ChunkingStrategy: [$sel:static:ChunkingStrategy_Static] :: ChunkingStrategy -> Static
- OpenAI.V1.DeletionStatus: [$sel:deleted:DeletionStatus] :: DeletionStatus -> Bool
- OpenAI.V1.DeletionStatus: [$sel:id:DeletionStatus] :: DeletionStatus -> Text
- OpenAI.V1.DeletionStatus: [$sel:object:DeletionStatus] :: DeletionStatus -> Text
- OpenAI.V1.Embeddings: [$sel:dimensions:CreateEmbeddings] :: CreateEmbeddings -> Maybe Natural
- OpenAI.V1.Embeddings: [$sel:embedding:EmbbeddingObject] :: EmbeddingObject -> Vector Double
- OpenAI.V1.Embeddings: [$sel:encoding_format:CreateEmbeddings] :: CreateEmbeddings -> Maybe EncodingFormat
- OpenAI.V1.Embeddings: [$sel:index:EmbbeddingObject] :: EmbeddingObject -> Natural
- OpenAI.V1.Embeddings: [$sel:input:CreateEmbeddings] :: CreateEmbeddings -> Text
- OpenAI.V1.Embeddings: [$sel:model:CreateEmbeddings] :: CreateEmbeddings -> Model
- OpenAI.V1.Embeddings: [$sel:object:EmbbeddingObject] :: EmbeddingObject -> Text
- OpenAI.V1.Embeddings: [$sel:user:CreateEmbeddings] :: CreateEmbeddings -> Maybe Text
- OpenAI.V1.Error: [$sel:code:Error] :: Error -> Maybe Text
- OpenAI.V1.Error: [$sel:line:Error] :: Error -> Maybe Natural
- OpenAI.V1.Error: [$sel:message:Error] :: Error -> Maybe Text
- OpenAI.V1.Error: [$sel:param:Error] :: Error -> Maybe Text
- OpenAI.V1.Files: [$sel:bytes:FileObject] :: FileObject -> Natural
- OpenAI.V1.Files: [$sel:created_at:FileObject] :: FileObject -> POSIXTime
- OpenAI.V1.Files: [$sel:deleted:DeletionStatus] :: DeletionStatus -> Bool
- OpenAI.V1.Files: [$sel:file:UploadFile] :: UploadFile -> FilePath
- OpenAI.V1.Files: [$sel:filename:FileObject] :: FileObject -> Text
- OpenAI.V1.Files: [$sel:id:DeletionStatus] :: DeletionStatus -> Text
- OpenAI.V1.Files: [$sel:id:FileObject] :: FileObject -> FileID
- OpenAI.V1.Files: [$sel:object:DeletionStatus] :: DeletionStatus -> Text
- OpenAI.V1.Files: [$sel:object:FileObject] :: FileObject -> Text
- OpenAI.V1.Files: [$sel:purpose:FileObject] :: FileObject -> Purpose
- OpenAI.V1.Files: [$sel:purpose:UploadFile] :: UploadFile -> Purpose
- OpenAI.V1.Files: [$sel:text:FileID] :: FileID -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:batch_size:Hyperparameters] :: Hyperparameters -> Maybe (AutoOr Natural)
- OpenAI.V1.FineTuning.Jobs: [$sel:created_at:CheckpointObject] :: CheckpointObject -> POSIXTime
- OpenAI.V1.FineTuning.Jobs: [$sel:created_at:EventObject] :: EventObject -> POSIXTime
- OpenAI.V1.FineTuning.Jobs: [$sel:created_at:JobObject] :: JobObject -> POSIXTime
- OpenAI.V1.FineTuning.Jobs: [$sel:entity:WAndB] :: WAndB -> Maybe Text
- OpenAI.V1.FineTuning.Jobs: [$sel:error:JobObject] :: JobObject -> Maybe Error
- OpenAI.V1.FineTuning.Jobs: [$sel:estimated_finish:JobObject] :: JobObject -> Maybe POSIXTime
- OpenAI.V1.FineTuning.Jobs: [$sel:fine_tuned_model:JobObject] :: JobObject -> Maybe Model
- OpenAI.V1.FineTuning.Jobs: [$sel:fine_tuned_model_checkpoint:CheckpointObject] :: CheckpointObject -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:fine_tuning_job_id:CheckpointObject] :: CheckpointObject -> FineTuningJobID
- OpenAI.V1.FineTuning.Jobs: [$sel:finished_at:JobObject] :: JobObject -> Maybe POSIXTime
- OpenAI.V1.FineTuning.Jobs: [$sel:full_valid_loss:Metrics] :: Metrics -> Double
- OpenAI.V1.FineTuning.Jobs: [$sel:full_valid_mean_token_accuracy:Metrics] :: Metrics -> Double
- OpenAI.V1.FineTuning.Jobs: [$sel:hyperparameters:CreateFineTuningJob] :: CreateFineTuningJob -> Maybe Hyperparameters
- OpenAI.V1.FineTuning.Jobs: [$sel:hyperparameters:JobObject] :: JobObject -> Hyperparameters
- OpenAI.V1.FineTuning.Jobs: [$sel:id:CheckpointObject] :: CheckpointObject -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:id:EventObject] :: EventObject -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:id:JobObject] :: JobObject -> FineTuningJobID
- OpenAI.V1.FineTuning.Jobs: [$sel:integrations:CreateFineTuningJob] :: CreateFineTuningJob -> Maybe (Vector Integration)
- OpenAI.V1.FineTuning.Jobs: [$sel:integrations:JobObject] :: JobObject -> Maybe (Vector Integration)
- OpenAI.V1.FineTuning.Jobs: [$sel:learning_rate_multiplier:Hyperparameters] :: Hyperparameters -> Maybe (AutoOr Double)
- OpenAI.V1.FineTuning.Jobs: [$sel:level:EventObject] :: EventObject -> Level
- OpenAI.V1.FineTuning.Jobs: [$sel:message:EventObject] :: EventObject -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:metrics:CheckpointObject] :: CheckpointObject -> Metrics
- OpenAI.V1.FineTuning.Jobs: [$sel:model:CreateFineTuningJob] :: CreateFineTuningJob -> Model
- OpenAI.V1.FineTuning.Jobs: [$sel:model:JobObject] :: JobObject -> Model
- OpenAI.V1.FineTuning.Jobs: [$sel:n_epochs:Hyperparameters] :: Hyperparameters -> Maybe (AutoOr Natural)
- OpenAI.V1.FineTuning.Jobs: [$sel:name:WAndB] :: WAndB -> Maybe Text
- OpenAI.V1.FineTuning.Jobs: [$sel:object:CheckpointObject] :: CheckpointObject -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:object:EventObject] :: EventObject -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:object:JobObject] :: JobObject -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:organization_id:JobObject] :: JobObject -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:project:WAndB] :: WAndB -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:result_files:JobObject] :: JobObject -> Vector FileID
- OpenAI.V1.FineTuning.Jobs: [$sel:seed:CreateFineTuningJob] :: CreateFineTuningJob -> Maybe Integer
- OpenAI.V1.FineTuning.Jobs: [$sel:seed:JobObject] :: JobObject -> Integer
- OpenAI.V1.FineTuning.Jobs: [$sel:status:JobObject] :: JobObject -> Status
- OpenAI.V1.FineTuning.Jobs: [$sel:step:Metrics] :: Metrics -> Double
- OpenAI.V1.FineTuning.Jobs: [$sel:step_number:CheckpointObject] :: CheckpointObject -> Natural
- OpenAI.V1.FineTuning.Jobs: [$sel:suffix:CreateFineTuningJob] :: CreateFineTuningJob -> Maybe Text
- OpenAI.V1.FineTuning.Jobs: [$sel:tags:WAndB] :: WAndB -> Maybe (Vector Text)
- OpenAI.V1.FineTuning.Jobs: [$sel:text:FineTuningJobID] :: FineTuningJobID -> Text
- OpenAI.V1.FineTuning.Jobs: [$sel:train_loss:Metrics] :: Metrics -> Double
- OpenAI.V1.FineTuning.Jobs: [$sel:train_mean_token_accuracy:Metrics] :: Metrics -> Double
- OpenAI.V1.FineTuning.Jobs: [$sel:trained_tokens:JobObject] :: JobObject -> Maybe Natural
- OpenAI.V1.FineTuning.Jobs: [$sel:training_file:CreateFineTuningJob] :: CreateFineTuningJob -> FileID
- OpenAI.V1.FineTuning.Jobs: [$sel:training_file:JobObject] :: JobObject -> FileID
- OpenAI.V1.FineTuning.Jobs: [$sel:valid_loss:Metrics] :: Metrics -> Double
- OpenAI.V1.FineTuning.Jobs: [$sel:valid_mean_token_accuracy:Metrics] :: Metrics -> Double
- OpenAI.V1.FineTuning.Jobs: [$sel:validation_file:CreateFineTuningJob] :: CreateFineTuningJob -> Maybe FileID
- OpenAI.V1.FineTuning.Jobs: [$sel:validation_file:JobObject] :: JobObject -> Maybe FileID
- OpenAI.V1.FineTuning.Jobs: [$sel:wandb:Integration_WAndB] :: Integration -> WAndB
- OpenAI.V1.Images.Edits: [$sel:image:CreateImageEdit] :: CreateImageEdit -> FilePath
- OpenAI.V1.Images.Edits: [$sel:mask:CreateImageEdit] :: CreateImageEdit -> Maybe FilePath
- OpenAI.V1.Images.Edits: [$sel:model:CreateImageEdit] :: CreateImageEdit -> Maybe Model
- OpenAI.V1.Images.Edits: [$sel:n:CreateImageEdit] :: CreateImageEdit -> Maybe Natural
- OpenAI.V1.Images.Edits: [$sel:prompt:CreateImageEdit] :: CreateImageEdit -> Text
- OpenAI.V1.Images.Edits: [$sel:response_format:CreateImageEdit] :: CreateImageEdit -> Maybe ResponseFormat
- OpenAI.V1.Images.Edits: [$sel:size:CreateImageEdit] :: CreateImageEdit -> Maybe Text
- OpenAI.V1.Images.Edits: [$sel:user:CreateImageEdit] :: CreateImageEdit -> Maybe Text
- OpenAI.V1.Images.Generations: [$sel:model:CreateImage] :: CreateImage -> Maybe Model
- OpenAI.V1.Images.Generations: [$sel:n:CreateImage] :: CreateImage -> Maybe Natural
- OpenAI.V1.Images.Generations: [$sel:prompt:CreateImage] :: CreateImage -> Text
- OpenAI.V1.Images.Generations: [$sel:quality:CreateImage] :: CreateImage -> Maybe Quality
- OpenAI.V1.Images.Generations: [$sel:response_format:CreateImage] :: CreateImage -> Maybe ResponseFormat
- OpenAI.V1.Images.Generations: [$sel:size:CreateImage] :: CreateImage -> Maybe Text
- OpenAI.V1.Images.Generations: [$sel:style:CreateImage] :: CreateImage -> Maybe Style
- OpenAI.V1.Images.Generations: [$sel:user:CreateImage] :: CreateImage -> Maybe Text
- OpenAI.V1.Images.Image: [$sel:b64_json:ImageObject] :: ImageObject -> Maybe Text
- OpenAI.V1.Images.Image: [$sel:revised_prompt:ImageObject] :: ImageObject -> Maybe Text
- OpenAI.V1.Images.Image: [$sel:url:ImageObject] :: ImageObject -> Maybe Text
- OpenAI.V1.Images.Variations: [$sel:image:CreateImageVariation] :: CreateImageVariation -> FilePath
- OpenAI.V1.Images.Variations: [$sel:model:CreateImageVariation] :: CreateImageVariation -> Maybe Model
- OpenAI.V1.Images.Variations: [$sel:n:CreateImageVariation] :: CreateImageVariation -> Maybe Natural
- OpenAI.V1.Images.Variations: [$sel:response_format:CreateImageVariation] :: CreateImageVariation -> Maybe ResponseFormat
- OpenAI.V1.Images.Variations: [$sel:size:CreateImageVariation] :: CreateImageVariation -> Maybe Text
- OpenAI.V1.Images.Variations: [$sel:user:CreateImageVariation] :: CreateImageVariation -> Maybe Text
- OpenAI.V1.ListOf: [$sel:data_:List] :: ListOf a -> Vector a
- OpenAI.V1.Message: [$sel:attachments:User] :: Message -> Maybe (Vector Attachment)
- OpenAI.V1.Message: [$sel:content:User] :: Message -> Vector (Content Text)
- OpenAI.V1.Message: [$sel:detail:ImageFile] :: ImageFile -> Maybe (AutoOr Text)
- OpenAI.V1.Message: [$sel:detail:ImageURL] :: ImageURL -> Maybe (AutoOr Text)
- OpenAI.V1.Message: [$sel:file_id:Attachment] :: Attachment -> FileID
- OpenAI.V1.Message: [$sel:file_id:ImageFile] :: ImageFile -> FileID
- OpenAI.V1.Message: [$sel:image_file:Image_File] :: Content text -> ImageFile
- OpenAI.V1.Message: [$sel:image_url:ImageURL] :: ImageURL -> Text
- OpenAI.V1.Message: [$sel:image_url:Image_File] :: Content text -> ImageURL
- OpenAI.V1.Message: [$sel:metadata:User] :: Message -> Maybe (Map Text Text)
- OpenAI.V1.Message: [$sel:text:Image_File] :: Content text -> text
- OpenAI.V1.Message: [$sel:tools:Attachment] :: Attachment -> Maybe (Vector Tool)
- OpenAI.V1.Models: [$sel:created:ModelObject] :: ModelObject -> POSIXTime
- OpenAI.V1.Models: [$sel:id:ModelObject] :: ModelObject -> Model
- OpenAI.V1.Models: [$sel:object:ModelObject] :: ModelObject -> Text
- OpenAI.V1.Models: [$sel:owned_by:ModelObject] :: ModelObject -> Text
- OpenAI.V1.Models: [$sel:text:Model] :: Model -> Text
- OpenAI.V1.Moderations: [$sel:categories:Result] :: Result -> Map Text Bool
- OpenAI.V1.Moderations: [$sel:category_applied_input_types:Result] :: Result -> Maybe (Map Text InputType)
- OpenAI.V1.Moderations: [$sel:category_scores:Result] :: Result -> Map Text Double
- OpenAI.V1.Moderations: [$sel:flagged:Result] :: Result -> Bool
- OpenAI.V1.Moderations: [$sel:id:Moderation] :: Moderation -> Text
- OpenAI.V1.Moderations: [$sel:input:CreateModeration] :: CreateModeration -> Text
- OpenAI.V1.Moderations: [$sel:model:CreateModeration] :: CreateModeration -> Maybe Model
- OpenAI.V1.Moderations: [$sel:model:Moderation] :: Moderation -> Model
- OpenAI.V1.Moderations: [$sel:results:Moderation] :: Moderation -> Vector Result
- OpenAI.V1.ResponseFormat: [$sel:description:JSONSchema] :: JSONSchema -> Maybe Text
- OpenAI.V1.ResponseFormat: [$sel:json_schema:ResponseFormat_Text] :: ResponseFormat -> JSONSchema
- OpenAI.V1.ResponseFormat: [$sel:name:JSONSchema] :: JSONSchema -> Text
- OpenAI.V1.ResponseFormat: [$sel:schema:JSONSchema] :: JSONSchema -> Maybe Value
- OpenAI.V1.ResponseFormat: [$sel:strict:JSONSchema] :: JSONSchema -> Maybe Bool
- OpenAI.V1.Threads: [$sel:attachments:User] :: Message -> Maybe (Vector Attachment)
- OpenAI.V1.Threads: [$sel:content:User] :: Message -> Vector (Content Text)
- OpenAI.V1.Threads: [$sel:created_at:ThreadObject] :: ThreadObject -> POSIXTime
- OpenAI.V1.Threads: [$sel:detail:ImageFile] :: ImageFile -> Maybe (AutoOr Text)
- OpenAI.V1.Threads: [$sel:detail:ImageURL] :: ImageURL -> Maybe (AutoOr Text)
- OpenAI.V1.Threads: [$sel:file_id:Attachment] :: Attachment -> FileID
- OpenAI.V1.Threads: [$sel:file_id:ImageFile] :: ImageFile -> FileID
- OpenAI.V1.Threads: [$sel:id:ThreadObject] :: ThreadObject -> ThreadID
- OpenAI.V1.Threads: [$sel:image_file:Image_File] :: Content text -> ImageFile
- OpenAI.V1.Threads: [$sel:image_url:ImageURL] :: ImageURL -> Text
- OpenAI.V1.Threads: [$sel:image_url:Image_File] :: Content text -> ImageURL
- OpenAI.V1.Threads: [$sel:messages:Thread] :: Thread -> Maybe (Vector Message)
- OpenAI.V1.Threads: [$sel:metadata:ModifyThread] :: ModifyThread -> Maybe (Map Text Text)
- OpenAI.V1.Threads: [$sel:metadata:ThreadObject] :: ThreadObject -> Maybe (Map Text Text)
- OpenAI.V1.Threads: [$sel:metadata:Thread] :: Thread -> Maybe (Map Text Text)
- OpenAI.V1.Threads: [$sel:metadata:User] :: Message -> Maybe (Map Text Text)
- OpenAI.V1.Threads: [$sel:object:ThreadObject] :: ThreadObject -> Text
- OpenAI.V1.Threads: [$sel:text:Image_File] :: Content text -> text
- OpenAI.V1.Threads: [$sel:text:ThreadID] :: ThreadID -> Text
- OpenAI.V1.Threads: [$sel:tool_resources:ModifyThread] :: ModifyThread -> Maybe ToolResources
- OpenAI.V1.Threads: [$sel:tool_resources:ThreadObject] :: ThreadObject -> Maybe ToolResources
- OpenAI.V1.Threads: [$sel:tool_resources:Thread] :: Thread -> Maybe ToolResources
- OpenAI.V1.Threads: [$sel:tools:Attachment] :: Attachment -> Maybe (Vector Tool)
- OpenAI.V1.Threads.Messages: [$sel:annotations:TextObject] :: TextObject -> Vector Annotation
- OpenAI.V1.Threads.Messages: [$sel:assistant_id:MessageObject] :: MessageObject -> Maybe AssistantID
- OpenAI.V1.Threads.Messages: [$sel:attachments:MessageObject] :: MessageObject -> Maybe (Vector Attachment)
- OpenAI.V1.Threads.Messages: [$sel:attachments:User] :: Message -> Maybe (Vector Attachment)
- OpenAI.V1.Threads.Messages: [$sel:completed_at:MessageObject] :: MessageObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Messages: [$sel:content:MessageObject] :: MessageObject -> Vector (Content TextObject)
- OpenAI.V1.Threads.Messages: [$sel:content:User] :: Message -> Vector (Content Text)
- OpenAI.V1.Threads.Messages: [$sel:created_at:MessageObject] :: MessageObject -> POSIXTime
- OpenAI.V1.Threads.Messages: [$sel:end_index:File_Citation] :: Annotation -> Natural
- OpenAI.V1.Threads.Messages: [$sel:file_citation:File_Citation] :: Annotation -> File
- OpenAI.V1.Threads.Messages: [$sel:file_id:File] :: File -> FileID
- OpenAI.V1.Threads.Messages: [$sel:file_path:File_Citation] :: Annotation -> File
- OpenAI.V1.Threads.Messages: [$sel:id:MessageObject] :: MessageObject -> MessageID
- OpenAI.V1.Threads.Messages: [$sel:incomplete_at:MessageObject] :: MessageObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Messages: [$sel:incomplete_details:MessageObject] :: MessageObject -> Maybe IncompleteDetails
- OpenAI.V1.Threads.Messages: [$sel:metadata:MessageObject] :: MessageObject -> Map Text Text
- OpenAI.V1.Threads.Messages: [$sel:metadata:ModifyMessage] :: ModifyMessage -> Maybe (Map Text Text)
- OpenAI.V1.Threads.Messages: [$sel:metadata:User] :: Message -> Maybe (Map Text Text)
- OpenAI.V1.Threads.Messages: [$sel:object:MessageObject] :: MessageObject -> Text
- OpenAI.V1.Threads.Messages: [$sel:reason:IncompleteDetails] :: IncompleteDetails -> Text
- OpenAI.V1.Threads.Messages: [$sel:role:MessageObject] :: MessageObject -> Text
- OpenAI.V1.Threads.Messages: [$sel:run_id:MessageObject] :: MessageObject -> Maybe RunID
- OpenAI.V1.Threads.Messages: [$sel:start_index:File_Citation] :: Annotation -> Natural
- OpenAI.V1.Threads.Messages: [$sel:status:MessageObject] :: MessageObject -> Maybe Status
- OpenAI.V1.Threads.Messages: [$sel:text:File_Citation] :: Annotation -> Text
- OpenAI.V1.Threads.Messages: [$sel:text:MessageID] :: MessageID -> Text
- OpenAI.V1.Threads.Messages: [$sel:thread_id:MessageObject] :: MessageObject -> ThreadID
- OpenAI.V1.Threads.Messages: [$sel:value:TextObject] :: TextObject -> Text
- OpenAI.V1.Threads.Runs: [$sel:additional_instructions:CreateRun] :: CreateRun -> Maybe Text
- OpenAI.V1.Threads.Runs: [$sel:additional_messages:CreateRun] :: CreateRun -> Maybe (Vector Message)
- OpenAI.V1.Threads.Runs: [$sel:assistant_id:CreateRun] :: CreateRun -> AssistantID
- OpenAI.V1.Threads.Runs: [$sel:assistant_id:CreateThreadAndRun] :: CreateThreadAndRun -> AssistantID
- OpenAI.V1.Threads.Runs: [$sel:assistant_id:RunObject] :: RunObject -> AssistantID
- OpenAI.V1.Threads.Runs: [$sel:cancelled_at:RunObject] :: RunObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs: [$sel:completed_at:RunObject] :: RunObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs: [$sel:created_at:RunObject] :: RunObject -> POSIXTime
- OpenAI.V1.Threads.Runs: [$sel:expires_at:RunObject] :: RunObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs: [$sel:failed_at:RunObject] :: RunObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs: [$sel:id:RunObject] :: RunObject -> RunID
- OpenAI.V1.Threads.Runs: [$sel:incomplete_details:RunObject] :: RunObject -> Maybe IncompleteDetails
- OpenAI.V1.Threads.Runs: [$sel:instructions:CreateRun] :: CreateRun -> Maybe Text
- OpenAI.V1.Threads.Runs: [$sel:instructions:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe Text
- OpenAI.V1.Threads.Runs: [$sel:instructions:RunObject] :: RunObject -> Maybe Text
- OpenAI.V1.Threads.Runs: [$sel:last_error:RunObject] :: RunObject -> Maybe Error
- OpenAI.V1.Threads.Runs: [$sel:last_messages:Auto] :: TruncationStrategy -> Maybe Natural
- OpenAI.V1.Threads.Runs: [$sel:max_completion_tokens:CreateRun] :: CreateRun -> Maybe Natural
- OpenAI.V1.Threads.Runs: [$sel:max_completion_tokens:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe Natural
- OpenAI.V1.Threads.Runs: [$sel:max_completion_tokens:RunObject] :: RunObject -> Maybe Natural
- OpenAI.V1.Threads.Runs: [$sel:max_prompt_tokens:CreateRun] :: CreateRun -> Maybe Natural
- OpenAI.V1.Threads.Runs: [$sel:max_prompt_tokens:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe Natural
- OpenAI.V1.Threads.Runs: [$sel:max_prompt_tokens:RunObject] :: RunObject -> Maybe Natural
- OpenAI.V1.Threads.Runs: [$sel:metadata:CreateRun] :: CreateRun -> Maybe (Map Text Text)
- OpenAI.V1.Threads.Runs: [$sel:metadata:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe (Map Text Text)
- OpenAI.V1.Threads.Runs: [$sel:metadata:ModifyRun] :: ModifyRun -> Maybe (Map Text Text)
- OpenAI.V1.Threads.Runs: [$sel:metadata:RunObject] :: RunObject -> Map Text Text
- OpenAI.V1.Threads.Runs: [$sel:model:CreateRun] :: CreateRun -> Maybe Model
- OpenAI.V1.Threads.Runs: [$sel:model:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe Model
- OpenAI.V1.Threads.Runs: [$sel:model:RunObject] :: RunObject -> Model
- OpenAI.V1.Threads.Runs: [$sel:object:RunObject] :: RunObject -> Text
- OpenAI.V1.Threads.Runs: [$sel:output:ToolOutput] :: ToolOutput -> Text
- OpenAI.V1.Threads.Runs: [$sel:parallel_tool_calls:CreateRun] :: CreateRun -> Maybe Bool
- OpenAI.V1.Threads.Runs: [$sel:parallel_tool_calls:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe Bool
- OpenAI.V1.Threads.Runs: [$sel:parallel_tool_calls:RunObject] :: RunObject -> Bool
- OpenAI.V1.Threads.Runs: [$sel:reason:IncompleteDetails] :: IncompleteDetails -> Text
- OpenAI.V1.Threads.Runs: [$sel:required_action:RunObject] :: RunObject -> Maybe RequiredAction
- OpenAI.V1.Threads.Runs: [$sel:response_format:CreateRun] :: CreateRun -> Maybe (AutoOr ResponseFormat)
- OpenAI.V1.Threads.Runs: [$sel:response_format:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe (AutoOr ResponseFormat)
- OpenAI.V1.Threads.Runs: [$sel:response_format:RunObject] :: RunObject -> AutoOr ResponseFormat
- OpenAI.V1.Threads.Runs: [$sel:started_at:RunObject] :: RunObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs: [$sel:status:RunObject] :: RunObject -> Status
- OpenAI.V1.Threads.Runs: [$sel:submit_tool_outputs:RequiredAction_Submit_Tool_Outputs] :: RequiredAction -> SubmitToolOutputs
- OpenAI.V1.Threads.Runs: [$sel:temperature:CreateRun] :: CreateRun -> Maybe Double
- OpenAI.V1.Threads.Runs: [$sel:temperature:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe Double
- OpenAI.V1.Threads.Runs: [$sel:temperature:RunObject] :: RunObject -> Maybe Double
- OpenAI.V1.Threads.Runs: [$sel:text:RunID] :: RunID -> Text
- OpenAI.V1.Threads.Runs: [$sel:thread:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe Thread
- OpenAI.V1.Threads.Runs: [$sel:thread_id:RunObject] :: RunObject -> ThreadID
- OpenAI.V1.Threads.Runs: [$sel:toolResources:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe ToolResources
- OpenAI.V1.Threads.Runs: [$sel:tool_call_id:ToolOutput] :: ToolOutput -> Maybe Text
- OpenAI.V1.Threads.Runs: [$sel:tool_calls:SubmitToolOutputs] :: SubmitToolOutputs -> Vector ToolCall
- OpenAI.V1.Threads.Runs: [$sel:tool_choice:CreateRun] :: CreateRun -> Maybe ToolChoice
- OpenAI.V1.Threads.Runs: [$sel:tool_choice:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe ToolChoice
- OpenAI.V1.Threads.Runs: [$sel:tool_choice:RunObject] :: RunObject -> ToolChoice
- OpenAI.V1.Threads.Runs: [$sel:tool_outputs:SubmitToolOutputsToRun] :: SubmitToolOutputsToRun -> Vector ToolOutput
- OpenAI.V1.Threads.Runs: [$sel:tools:CreateRun] :: CreateRun -> Maybe (Vector Tool)
- OpenAI.V1.Threads.Runs: [$sel:tools:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe (Vector Tool)
- OpenAI.V1.Threads.Runs: [$sel:tools:RunObject] :: RunObject -> Vector Tool
- OpenAI.V1.Threads.Runs: [$sel:top_p:CreateRun] :: CreateRun -> Maybe Double
- OpenAI.V1.Threads.Runs: [$sel:top_p:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe Double
- OpenAI.V1.Threads.Runs: [$sel:top_p:RunObject] :: RunObject -> Maybe Double
- OpenAI.V1.Threads.Runs: [$sel:truncation_strategy:CreateRun] :: CreateRun -> Maybe TruncationStrategy
- OpenAI.V1.Threads.Runs: [$sel:truncation_strategy:CreateThreadAndRun] :: CreateThreadAndRun -> Maybe TruncationStrategy
- OpenAI.V1.Threads.Runs: [$sel:truncation_strategy:RunObject] :: RunObject -> Maybe TruncationStrategy
- OpenAI.V1.Threads.Runs: [$sel:usage:RunObject] :: RunObject -> Maybe (Usage (Maybe CompletionTokensDetails) (Maybe PromptTokensDetails))
- OpenAI.V1.Threads.Runs.Steps: [$sel:arguments:Function] :: Function -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:assistant_id:RunStepObject] :: RunStepObject -> AssistantID
- OpenAI.V1.Threads.Runs.Steps: [$sel:cancelled_at:RunStepObject] :: RunStepObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs.Steps: [$sel:code_interpreter:ToolCall_Code_Interpreter] :: ToolCall -> CodeInterpreter
- OpenAI.V1.Threads.Runs.Steps: [$sel:completed_at:RunStepObject] :: RunStepObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs.Steps: [$sel:content:Result] :: Result -> Vector Content
- OpenAI.V1.Threads.Runs.Steps: [$sel:created_at:RunStepObject] :: RunStepObject -> POSIXTime
- OpenAI.V1.Threads.Runs.Steps: [$sel:expired_at:RunStepObject] :: RunStepObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs.Steps: [$sel:failed_at:RunStepObject] :: RunStepObject -> Maybe POSIXTime
- OpenAI.V1.Threads.Runs.Steps: [$sel:file_id:Image] :: Image -> FileID
- OpenAI.V1.Threads.Runs.Steps: [$sel:file_id:Result] :: Result -> FileID
- OpenAI.V1.Threads.Runs.Steps: [$sel:file_name:Result] :: Result -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:file_search:ToolCall_Code_Interpreter] :: ToolCall -> Map Text FileSearch
- OpenAI.V1.Threads.Runs.Steps: [$sel:function:ToolCall_Code_Interpreter] :: ToolCall -> Function
- OpenAI.V1.Threads.Runs.Steps: [$sel:id:RunStepObject] :: RunStepObject -> StepID
- OpenAI.V1.Threads.Runs.Steps: [$sel:id:ToolCall_Code_Interpreter] :: ToolCall -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:image:Output_Logs] :: Output -> Image
- OpenAI.V1.Threads.Runs.Steps: [$sel:input:CodeInterpreter] :: CodeInterpreter -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:last_error:RunStepObject] :: RunStepObject -> Maybe Error
- OpenAI.V1.Threads.Runs.Steps: [$sel:logs:Output_Logs] :: Output -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:message_id:Message_Creation] :: StepDetails -> MessageID
- OpenAI.V1.Threads.Runs.Steps: [$sel:metadata:RunStepObject] :: RunStepObject -> Map Text Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:name:Function] :: Function -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:object:RunStepObject] :: RunStepObject -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:output:Function] :: Function -> Maybe Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:outputs:CodeInterpreter] :: CodeInterpreter -> Vector Output
- OpenAI.V1.Threads.Runs.Steps: [$sel:ranker:RankingOptions] :: RankingOptions -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:ranking_options:FileSearch] :: FileSearch -> RankingOptions
- OpenAI.V1.Threads.Runs.Steps: [$sel:results:FileSearch] :: FileSearch -> Vector Result
- OpenAI.V1.Threads.Runs.Steps: [$sel:run_id:RunStepObject] :: RunStepObject -> RunID
- OpenAI.V1.Threads.Runs.Steps: [$sel:score:Result] :: Result -> Double
- OpenAI.V1.Threads.Runs.Steps: [$sel:score_threshold:RankingOptions] :: RankingOptions -> Double
- OpenAI.V1.Threads.Runs.Steps: [$sel:status:RunStepObject] :: RunStepObject -> Status
- OpenAI.V1.Threads.Runs.Steps: [$sel:step_details:RunStepObject] :: RunStepObject -> StepDetails
- OpenAI.V1.Threads.Runs.Steps: [$sel:text:Content] :: Content -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:text:StepID] :: StepID -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:thread_id:RunStepObject] :: RunStepObject -> ThreadID
- OpenAI.V1.Threads.Runs.Steps: [$sel:tool_calls:Message_Creation] :: StepDetails -> Vector ToolCall
- OpenAI.V1.Threads.Runs.Steps: [$sel:type_:Content] :: Content -> Text
- OpenAI.V1.Threads.Runs.Steps: [$sel:usage:RunStepObject] :: RunStepObject -> Maybe (Usage CompletionTokensDetails PromptTokensDetails)
- OpenAI.V1.Tool: [$sel:description:Function] :: Function -> Maybe Text
- OpenAI.V1.Tool: [$sel:file_search:Tool_Code_Interpreter] :: Tool -> FileSearch
- OpenAI.V1.Tool: [$sel:function:Tool_Code_Interpreter] :: Tool -> Function
- OpenAI.V1.Tool: [$sel:max_num_results:FileSearch] :: FileSearch -> Maybe Natural
- OpenAI.V1.Tool: [$sel:name:Function] :: Function -> Text
- OpenAI.V1.Tool: [$sel:parameters:Function] :: Function -> Maybe Value
- OpenAI.V1.Tool: [$sel:ranker:RankingOptions] :: RankingOptions -> Maybe Text
- OpenAI.V1.Tool: [$sel:ranking_options:FileSearch] :: FileSearch -> Maybe RankingOptions
- OpenAI.V1.Tool: [$sel:score_threshold:RankingOptions] :: RankingOptions -> Double
- OpenAI.V1.Tool: [$sel:strict:Function] :: Function -> Maybe Bool
- OpenAI.V1.ToolCall: [$sel:arguments:Function] :: Function -> Text
- OpenAI.V1.ToolCall: [$sel:function:ToolCall_Function] :: ToolCall -> Function
- OpenAI.V1.ToolCall: [$sel:id:ToolCall_Function] :: ToolCall -> Text
- OpenAI.V1.ToolCall: [$sel:name:Function] :: Function -> Text
- OpenAI.V1.ToolResources: [$sel:chunk_overlap_tokens:Static] :: Static -> Natural
- OpenAI.V1.ToolResources: [$sel:chunking_strategy:VectorStore] :: VectorStore -> Maybe (AutoOr ChunkingStrategy)
- OpenAI.V1.ToolResources: [$sel:code_interpreter:ToolResources] :: ToolResources -> Maybe CodeInterpreterResources
- OpenAI.V1.ToolResources: [$sel:file_ids:CodeInterpreterResources] :: CodeInterpreterResources -> Maybe (Vector FileID)
- OpenAI.V1.ToolResources: [$sel:file_ids:VectorStore] :: VectorStore -> Maybe (Vector FileID)
- OpenAI.V1.ToolResources: [$sel:file_search:ToolResources] :: ToolResources -> Maybe FileSearchResources
- OpenAI.V1.ToolResources: [$sel:max_chunk_size_tokens:Static] :: Static -> Natural
- OpenAI.V1.ToolResources: [$sel:vector_store_ids:FileSearchResources] :: FileSearchResources -> Maybe (Vector FileID)
- OpenAI.V1.ToolResources: [$sel:vector_stores:FileSearchResources] :: FileSearchResources -> Maybe (Vector VectorStore)
- OpenAI.V1.Uploads: [$sel:bytes:CreateUpload] :: CreateUpload -> Natural
- OpenAI.V1.Uploads: [$sel:bytes:UploadObject] :: UploadObject file -> Natural
- OpenAI.V1.Uploads: [$sel:created_at:PartObject] :: PartObject -> POSIXTime
- OpenAI.V1.Uploads: [$sel:created_at:UploadObject] :: UploadObject file -> POSIXTime
- OpenAI.V1.Uploads: [$sel:data_:AddUploadPart] :: AddUploadPart -> FilePath
- OpenAI.V1.Uploads: [$sel:expires_at:UploadObject] :: UploadObject file -> POSIXTime
- OpenAI.V1.Uploads: [$sel:file:UploadObject] :: UploadObject file -> file
- OpenAI.V1.Uploads: [$sel:filename:CreateUpload] :: CreateUpload -> Text
- OpenAI.V1.Uploads: [$sel:filename:UploadObject] :: UploadObject file -> Text
- OpenAI.V1.Uploads: [$sel:id:PartObject] :: PartObject -> Text
- OpenAI.V1.Uploads: [$sel:id:UploadObject] :: UploadObject file -> UploadID
- OpenAI.V1.Uploads: [$sel:md5:CompleteUpload] :: CompleteUpload -> Maybe Text
- OpenAI.V1.Uploads: [$sel:mime_type:CreateUpload] :: CreateUpload -> Text
- OpenAI.V1.Uploads: [$sel:object:PartObject] :: PartObject -> Text
- OpenAI.V1.Uploads: [$sel:object:UploadObject] :: UploadObject file -> Text
- OpenAI.V1.Uploads: [$sel:part_ids:CompleteUpload] :: CompleteUpload -> Vector Text
- OpenAI.V1.Uploads: [$sel:purpose:CreateUpload] :: CreateUpload -> Purpose
- OpenAI.V1.Uploads: [$sel:purpose:UploadObject] :: UploadObject file -> Purpose
- OpenAI.V1.Uploads: [$sel:status:UploadObject] :: UploadObject file -> Status
- OpenAI.V1.Uploads: [$sel:text:UploadID] :: UploadID -> Text
- OpenAI.V1.Uploads: [$sel:upload_id:PartObject] :: PartObject -> UploadID
- OpenAI.V1.Usage: [$sel:accepted_prediction_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:audio_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:audio_tokens:PromptTokensDetails] :: PromptTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:cached_tokens:PromptTokensDetails] :: PromptTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:completion_tokens:Usage] :: Usage completionTokensDetails promptTokensDetails -> Natural
- OpenAI.V1.Usage: [$sel:completion_tokens_details:Usage] :: Usage completionTokensDetails promptTokensDetails -> Maybe completionTokensDetails
- OpenAI.V1.Usage: [$sel:prompt_tokens:Usage] :: Usage completionTokensDetails promptTokensDetails -> Natural
- OpenAI.V1.Usage: [$sel:prompt_tokens_details:Usage] :: Usage completionTokensDetails promptTokensDetails -> Maybe promptTokensDetails
- OpenAI.V1.Usage: [$sel:reasoning_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:rejected_prediction_tokens:CompletionTokensDetails] :: CompletionTokensDetails -> Maybe Natural
- OpenAI.V1.Usage: [$sel:total_tokens:Usage] :: Usage completionTokensDetails promptTokensDetails -> Natural
- OpenAI.V1.VectorStores: [$sel:anchor:ExpiresAfter] :: ExpiresAfter -> Text
- OpenAI.V1.VectorStores: [$sel:chunking_strategy:CreateVectorStore] :: CreateVectorStore -> Maybe (AutoOr ChunkingStrategy)
- OpenAI.V1.VectorStores: [$sel:created_at:VectorStoreObject] :: VectorStoreObject -> POSIXTime
- OpenAI.V1.VectorStores: [$sel:days:ExpiresAfter] :: ExpiresAfter -> Natural
- OpenAI.V1.VectorStores: [$sel:expires_after:CreateVectorStore] :: CreateVectorStore -> Maybe ExpiresAfter
- OpenAI.V1.VectorStores: [$sel:expires_after:ModifyVectorStore] :: ModifyVectorStore -> Maybe ExpiresAfter
- OpenAI.V1.VectorStores: [$sel:expires_after:VectorStoreObject] :: VectorStoreObject -> Maybe ExpiresAfter
- OpenAI.V1.VectorStores: [$sel:expires_at:VectorStoreObject] :: VectorStoreObject -> Maybe POSIXTime
- OpenAI.V1.VectorStores: [$sel:file_counts:VectorStoreObject] :: VectorStoreObject -> FileCounts
- OpenAI.V1.VectorStores: [$sel:file_ids:CreateVectorStore] :: CreateVectorStore -> Vector FileID
- OpenAI.V1.VectorStores: [$sel:id:VectorStoreObject] :: VectorStoreObject -> VectorStoreID
- OpenAI.V1.VectorStores: [$sel:last_active_at:VectorStoreObject] :: VectorStoreObject -> Maybe POSIXTime
- OpenAI.V1.VectorStores: [$sel:metadata:CreateVectorStore] :: CreateVectorStore -> Maybe (Map Text Text)
- OpenAI.V1.VectorStores: [$sel:metadata:ModifyVectorStore] :: ModifyVectorStore -> Maybe (Map Text Text)
- OpenAI.V1.VectorStores: [$sel:metadata:VectorStoreObject] :: VectorStoreObject -> Map Text Text
- OpenAI.V1.VectorStores: [$sel:name:CreateVectorStore] :: CreateVectorStore -> Maybe Text
- OpenAI.V1.VectorStores: [$sel:name:ModifyVectorStore] :: ModifyVectorStore -> Maybe Text
- OpenAI.V1.VectorStores: [$sel:name:VectorStoreObject] :: VectorStoreObject -> Maybe Text
- OpenAI.V1.VectorStores: [$sel:object:VectorStoreObject] :: VectorStoreObject -> Text
- OpenAI.V1.VectorStores: [$sel:status:VectorStoreObject] :: VectorStoreObject -> Status
- OpenAI.V1.VectorStores: [$sel:text:VectorStoreID] :: VectorStoreID -> Text
- OpenAI.V1.VectorStores: [$sel:usage_bytes:VectorStoreObject] :: VectorStoreObject -> Natural
- OpenAI.V1.VectorStores.FileBatches: [$sel:chunking_strategy:CreateVectorStoreFileBatch] :: CreateVectorStoreFileBatch -> Maybe ChunkingStrategy
- OpenAI.V1.VectorStores.FileBatches: [$sel:created_at:VectorStoreFilesBatchObject] :: VectorStoreFilesBatchObject -> POSIXTime
- OpenAI.V1.VectorStores.FileBatches: [$sel:file_counts:VectorStoreFilesBatchObject] :: VectorStoreFilesBatchObject -> Maybe FileCounts
- OpenAI.V1.VectorStores.FileBatches: [$sel:file_ids:CreateVectorStoreFileBatch] :: CreateVectorStoreFileBatch -> Vector FileID
- OpenAI.V1.VectorStores.FileBatches: [$sel:id:VectorStoreFilesBatchObject] :: VectorStoreFilesBatchObject -> VectorStoreFileBatchID
- OpenAI.V1.VectorStores.FileBatches: [$sel:object:VectorStoreFilesBatchObject] :: VectorStoreFilesBatchObject -> Text
- OpenAI.V1.VectorStores.FileBatches: [$sel:status:VectorStoreFilesBatchObject] :: VectorStoreFilesBatchObject -> Status
- OpenAI.V1.VectorStores.FileBatches: [$sel:text:VectorStoreFileBatchID] :: VectorStoreFileBatchID -> Text
- OpenAI.V1.VectorStores.FileBatches: [$sel:vector_store_id:VectorStoreFilesBatchObject] :: VectorStoreFilesBatchObject -> VectorStoreID
- OpenAI.V1.VectorStores.FileCounts: [$sel:cancelled:FileCounts] :: FileCounts -> Natural
- OpenAI.V1.VectorStores.FileCounts: [$sel:completed:FileCounts] :: FileCounts -> Natural
- OpenAI.V1.VectorStores.FileCounts: [$sel:failed:FileCounts] :: FileCounts -> Natural
- OpenAI.V1.VectorStores.FileCounts: [$sel:in_progress:FileCounts] :: FileCounts -> Natural
- OpenAI.V1.VectorStores.FileCounts: [$sel:total:FileCounts] :: FileCounts -> Natural
- OpenAI.V1.VectorStores.Files: [$sel:chunking_strategy:CreateVectorStoreFile] :: CreateVectorStoreFile -> Maybe ChunkingStrategy
- OpenAI.V1.VectorStores.Files: [$sel:chunking_strategy:VectorStoreFileObject] :: VectorStoreFileObject -> ChunkingStrategy
- OpenAI.V1.VectorStores.Files: [$sel:created_at:VectorStoreFileObject] :: VectorStoreFileObject -> POSIXTime
- OpenAI.V1.VectorStores.Files: [$sel:file_id:CreateVectorStoreFile] :: CreateVectorStoreFile -> FileID
- OpenAI.V1.VectorStores.Files: [$sel:id:VectorStoreFileObject] :: VectorStoreFileObject -> VectorStoreFileID
- OpenAI.V1.VectorStores.Files: [$sel:last_error:VectorStoreFileObject] :: VectorStoreFileObject -> Maybe Error
- OpenAI.V1.VectorStores.Files: [$sel:object:VectorStoreFileObject] :: VectorStoreFileObject -> Text
- OpenAI.V1.VectorStores.Files: [$sel:status:VectorStoreFileObject] :: VectorStoreFileObject -> Status
- OpenAI.V1.VectorStores.Files: [$sel:text:VectorStoreFileID] :: VectorStoreFileID -> Text
- OpenAI.V1.VectorStores.Files: [$sel:usage_bytes:VectorStoreFileObject] :: VectorStoreFileObject -> Natural
- OpenAI.V1.VectorStores.Files: [$sel:vector_store_id:VectorStoreFileObject] :: VectorStoreFileObject -> VectorStoreID
+ OpenAI.V1: [addUploadPart] :: Methods -> UploadID -> AddUploadPart -> IO PartObject
+ OpenAI.V1: [cancelBatch] :: Methods -> BatchID -> IO BatchObject
+ OpenAI.V1: [cancelFineTuning] :: Methods -> FineTuningJobID -> IO JobObject
+ OpenAI.V1: [cancelRun] :: Methods -> ThreadID -> RunID -> IO RunObject
+ OpenAI.V1: [cancelUpload] :: Methods -> UploadID -> IO (UploadObject (Maybe Void))
+ OpenAI.V1: [cancelVectorStoreFileBatch] :: Methods -> VectorStoreID -> VectorStoreFileBatchID -> IO VectorStoreFilesBatchObject
+ OpenAI.V1: [completeUpload] :: Methods -> UploadID -> CompleteUpload -> IO (UploadObject FileObject)
+ OpenAI.V1: [createAssistant] :: Methods -> CreateAssistant -> IO AssistantObject
+ OpenAI.V1: [createBatch] :: Methods -> CreateBatch -> IO BatchObject
+ OpenAI.V1: [createChatCompletion] :: Methods -> CreateChatCompletion -> IO ChatCompletionObject
+ OpenAI.V1: [createEmbeddings] :: Methods -> CreateEmbeddings -> IO (Vector EmbeddingObject)
+ OpenAI.V1: [createFineTuningJob] :: Methods -> CreateFineTuningJob -> IO JobObject
+ OpenAI.V1: [createImageEdit] :: Methods -> CreateImageEdit -> IO (Vector ImageObject)
+ OpenAI.V1: [createImageVariation] :: Methods -> CreateImageVariation -> IO (Vector ImageObject)
+ OpenAI.V1: [createImage] :: Methods -> CreateImage -> IO (Vector ImageObject)
+ OpenAI.V1: [createMessage] :: Methods -> ThreadID -> Message -> IO MessageObject
+ OpenAI.V1: [createModeration] :: Methods -> CreateModeration -> IO Moderation
+ OpenAI.V1: [createRun] :: Methods -> ThreadID -> Maybe Text -> CreateRun -> IO RunObject
+ OpenAI.V1: [createSpeech] :: Methods -> CreateSpeech -> IO ByteString
+ OpenAI.V1: [createThreadAndRun] :: Methods -> CreateThreadAndRun -> IO RunObject
+ OpenAI.V1: [createThread] :: Methods -> Thread -> IO ThreadObject
+ OpenAI.V1: [createTranscription] :: Methods -> CreateTranscription -> IO TranscriptionObject
+ OpenAI.V1: [createTranslation] :: Methods -> CreateTranslation -> IO TranslationObject
+ OpenAI.V1: [createUpload] :: Methods -> CreateUpload -> IO (UploadObject (Maybe Void))
+ OpenAI.V1: [createVectorStoreFileBatch] :: Methods -> VectorStoreID -> CreateVectorStoreFileBatch -> IO VectorStoreFilesBatchObject
+ OpenAI.V1: [createVectorStoreFile] :: Methods -> VectorStoreID -> CreateVectorStoreFile -> IO VectorStoreFileObject
+ OpenAI.V1: [createVectorStore] :: Methods -> CreateVectorStore -> IO VectorStoreObject
+ OpenAI.V1: [deleteAssistant] :: Methods -> AssistantID -> IO DeletionStatus
+ OpenAI.V1: [deleteFile] :: Methods -> FileID -> IO DeletionStatus
+ OpenAI.V1: [deleteMessage] :: Methods -> ThreadID -> MessageID -> IO DeletionStatus
+ OpenAI.V1: [deleteModel] :: Methods -> Model -> IO DeletionStatus
+ OpenAI.V1: [deleteThread] :: Methods -> ThreadID -> IO DeletionStatus
+ OpenAI.V1: [deleteVectorStoreFile] :: Methods -> VectorStoreID -> VectorStoreFileID -> IO DeletionStatus
+ OpenAI.V1: [deleteVectorStore] :: Methods -> VectorStoreID -> IO DeletionStatus
+ OpenAI.V1: [listAssistants] :: Methods -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector AssistantObject)
+ OpenAI.V1: [listBatch] :: Methods -> Maybe Text -> Maybe Natural -> IO (Vector BatchObject)
+ OpenAI.V1: [listFiles] :: Methods -> Maybe Purpose -> Maybe Natural -> Maybe Order -> Maybe Text -> IO (Vector FileObject)
+ OpenAI.V1: [listFineTuningCheckpoints] :: Methods -> FineTuningJobID -> Maybe Text -> Maybe Natural -> IO (Vector CheckpointObject)
+ OpenAI.V1: [listFineTuningEvents] :: Methods -> FineTuningJobID -> Maybe Text -> Maybe Natural -> IO (Vector EventObject)
+ OpenAI.V1: [listFineTuningJobs] :: Methods -> Maybe Text -> Maybe Natural -> IO (Vector JobObject)
+ OpenAI.V1: [listMessages] :: Methods -> ThreadID -> IO (Vector MessageObject)
+ OpenAI.V1: [listModels] :: Methods -> IO (Vector ModelObject)
+ OpenAI.V1: [listRunSteps] :: Methods -> ThreadID -> RunID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Text -> IO (Vector RunStepObject)
+ OpenAI.V1: [listRuns] :: Methods -> ThreadID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector RunObject)
+ OpenAI.V1: [listVectorStoreFilesInABatch] :: Methods -> VectorStoreID -> VectorStoreFileBatchID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Status -> IO (Vector VectorStoreFilesBatchObject)
+ OpenAI.V1: [listVectorStoreFiles] :: Methods -> VectorStoreID -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> Maybe Status -> IO (Vector VectorStoreFileObject)
+ OpenAI.V1: [listVectorStores] :: Methods -> Maybe Natural -> Maybe Order -> Maybe Text -> Maybe Text -> IO (Vector VectorStoreObject)
+ OpenAI.V1: [modifyAssistant] :: Methods -> AssistantID -> ModifyAssistant -> IO AssistantObject
+ OpenAI.V1: [modifyMessage] :: Methods -> ThreadID -> MessageID -> ModifyMessage -> IO MessageObject
+ OpenAI.V1: [modifyRun] :: Methods -> ThreadID -> RunID -> ModifyRun -> IO RunObject
+ OpenAI.V1: [modifyThread] :: Methods -> ThreadID -> ModifyThread -> IO ThreadObject
+ OpenAI.V1: [modifyVectorStore] :: Methods -> VectorStoreID -> ModifyVectorStore -> IO VectorStoreObject
+ OpenAI.V1: [retrieveAssistant] :: Methods -> AssistantID -> IO AssistantObject
+ OpenAI.V1: [retrieveBatch] :: Methods -> BatchID -> IO BatchObject
+ OpenAI.V1: [retrieveFileContent] :: Methods -> FileID -> IO ByteString
+ OpenAI.V1: [retrieveFile] :: Methods -> FileID -> IO FileObject
+ OpenAI.V1: [retrieveFineTuningJob] :: Methods -> FineTuningJobID -> IO JobObject
+ OpenAI.V1: [retrieveMessage] :: Methods -> ThreadID -> MessageID -> IO MessageObject
+ OpenAI.V1: [retrieveModel] :: Methods -> Model -> IO ModelObject
+ OpenAI.V1: [retrieveRunStep] :: Methods -> ThreadID -> RunID -> StepID -> Maybe Text -> IO RunStepObject
+ OpenAI.V1: [retrieveRun] :: Methods -> ThreadID -> RunID -> IO RunObject
+ OpenAI.V1: [retrieveThread] :: Methods -> ThreadID -> IO ThreadObject
+ OpenAI.V1: [retrieveVectorStoreFileBatch] :: Methods -> VectorStoreID -> VectorStoreFileBatchID -> IO VectorStoreFilesBatchObject
+ OpenAI.V1: [retrieveVectorStoreFile] :: Methods -> VectorStoreID -> VectorStoreFileID -> IO VectorStoreFileObject
+ OpenAI.V1: [retrieveVectorStore] :: Methods -> VectorStoreID -> IO VectorStoreObject
+ OpenAI.V1: [submitToolOutputsToRun] :: Methods -> ThreadID -> RunID -> SubmitToolOutputsToRun -> IO RunObject
+ OpenAI.V1: [uploadFile] :: Methods -> UploadFile -> IO FileObject
+ OpenAI.V1.Assistants: [code_interpreter] :: ToolResources -> Maybe CodeInterpreterResources
+ OpenAI.V1.Assistants: [created_at] :: AssistantObject -> POSIXTime
+ OpenAI.V1.Assistants: [description] :: Function -> Maybe Text
+ OpenAI.V1.Assistants: [file_ids] :: CodeInterpreterResources -> Maybe (Vector FileID)
+ OpenAI.V1.Assistants: [file_search] :: ToolResources -> Maybe FileSearchResources
+ OpenAI.V1.Assistants: [function] :: Tool -> Function
+ OpenAI.V1.Assistants: [id] :: AssistantObject -> AssistantID
+ OpenAI.V1.Assistants: [instructions] :: AssistantObject -> Maybe Text
+ OpenAI.V1.Assistants: [max_num_results] :: FileSearch -> Maybe Natural
+ OpenAI.V1.Assistants: [metadata] :: AssistantObject -> Map Text Text
+ OpenAI.V1.Assistants: [model] :: AssistantObject -> Model
+ OpenAI.V1.Assistants: [name] :: Function -> Text
+ OpenAI.V1.Assistants: [object] :: AssistantObject -> Text
+ OpenAI.V1.Assistants: [parameters] :: Function -> Maybe Value
+ OpenAI.V1.Assistants: [ranking_options] :: FileSearch -> Maybe RankingOptions
+ OpenAI.V1.Assistants: [response_format] :: AssistantObject -> AutoOr ResponseFormat
+ OpenAI.V1.Assistants: [strict] :: Function -> Maybe Bool
+ OpenAI.V1.Assistants: [temperature] :: AssistantObject -> Maybe Double
+ OpenAI.V1.Assistants: [text] :: AssistantID -> Text
+ OpenAI.V1.Assistants: [tool_resources] :: AssistantObject -> Maybe ToolResources
+ OpenAI.V1.Assistants: [tools] :: AssistantObject -> Maybe (Vector Tool)
+ OpenAI.V1.Assistants: [top_p] :: AssistantObject -> Maybe Double
+ OpenAI.V1.Assistants: [vector_store_ids] :: FileSearchResources -> Maybe (Vector FileID)
+ OpenAI.V1.Assistants: [vector_stores] :: FileSearchResources -> Maybe (Vector VectorStore)
+ OpenAI.V1.Audio.Speech: Ash :: Voice
+ OpenAI.V1.Audio.Speech: Ballad :: Voice
+ OpenAI.V1.Audio.Speech: Coral :: Voice
+ OpenAI.V1.Audio.Speech: Sage :: Voice
+ OpenAI.V1.Audio.Speech: [input] :: CreateSpeech -> Text
+ OpenAI.V1.Audio.Speech: [instructions] :: CreateSpeech -> Maybe Text
+ OpenAI.V1.Audio.Speech: [model] :: CreateSpeech -> Model
+ OpenAI.V1.Audio.Speech: [response_format] :: CreateSpeech -> Maybe Format
+ OpenAI.V1.Audio.Speech: [speed] :: CreateSpeech -> Maybe Double
+ OpenAI.V1.Audio.Speech: [voice] :: CreateSpeech -> Voice
+ OpenAI.V1.Audio.Transcriptions: [avg_logprob] :: Segment -> Double
+ OpenAI.V1.Audio.Transcriptions: [compression_ratio] :: Segment -> Double
+ OpenAI.V1.Audio.Transcriptions: [duration] :: TranscriptionObject -> Maybe Double
+ OpenAI.V1.Audio.Transcriptions: [end] :: Segment -> Double
+ OpenAI.V1.Audio.Transcriptions: [file] :: CreateTranscription -> FilePath
+ OpenAI.V1.Audio.Transcriptions: [id] :: Segment -> Integer
+ OpenAI.V1.Audio.Transcriptions: [language] :: TranscriptionObject -> Maybe Text
+ OpenAI.V1.Audio.Transcriptions: [model] :: CreateTranscription -> Model
+ OpenAI.V1.Audio.Transcriptions: [no_speech_prob] :: Segment -> Double
+ OpenAI.V1.Audio.Transcriptions: [prompt] :: CreateTranscription -> Maybe Text
+ OpenAI.V1.Audio.Transcriptions: [seek] :: Segment -> Integer
+ OpenAI.V1.Audio.Transcriptions: [segments] :: TranscriptionObject -> Vector Segment
+ OpenAI.V1.Audio.Transcriptions: [start] :: Segment -> Double
+ OpenAI.V1.Audio.Transcriptions: [temperature] :: Segment -> Double
+ OpenAI.V1.Audio.Transcriptions: [text] :: Segment -> Text
+ OpenAI.V1.Audio.Transcriptions: [tokens] :: Segment -> Vector Word
+ OpenAI.V1.Audio.Translations: [file] :: CreateTranslation -> FilePath
+ OpenAI.V1.Audio.Translations: [model] :: CreateTranslation -> Model
+ OpenAI.V1.Audio.Translations: [prompt] :: CreateTranslation -> Maybe Text
+ OpenAI.V1.Audio.Translations: [temperature] :: CreateTranslation -> Maybe Double
+ OpenAI.V1.Audio.Translations: [text] :: TranslationObject -> Text
+ OpenAI.V1.Batches: [cancelled_at] :: BatchObject -> Maybe POSIXTime
+ OpenAI.V1.Batches: [cancelling_at] :: BatchObject -> Maybe POSIXTime
+ OpenAI.V1.Batches: [completed] :: Counts -> Natural
+ OpenAI.V1.Batches: [completed_at] :: BatchObject -> Maybe POSIXTime
+ OpenAI.V1.Batches: [completion_window] :: BatchObject -> Text
+ OpenAI.V1.Batches: [created_at] :: BatchObject -> POSIXTime
+ OpenAI.V1.Batches: [endpoint] :: BatchObject -> Text
+ OpenAI.V1.Batches: [error_file_id] :: BatchObject -> Maybe FileID
+ OpenAI.V1.Batches: [errors] :: BatchObject -> Maybe (ListOf Error)
+ OpenAI.V1.Batches: [expired_at] :: BatchObject -> Maybe POSIXTime
+ OpenAI.V1.Batches: [expires_at] :: BatchObject -> Maybe POSIXTime
+ OpenAI.V1.Batches: [failed] :: Counts -> Natural
+ OpenAI.V1.Batches: [failed_at] :: BatchObject -> Maybe POSIXTime
+ OpenAI.V1.Batches: [finalizing_at] :: BatchObject -> Maybe POSIXTime
+ OpenAI.V1.Batches: [id] :: BatchObject -> BatchID
+ OpenAI.V1.Batches: [in_progress_at] :: BatchObject -> Maybe POSIXTime
+ OpenAI.V1.Batches: [input_file_id] :: BatchObject -> FileID
+ OpenAI.V1.Batches: [metadata] :: BatchObject -> Maybe (Map Text Text)
+ OpenAI.V1.Batches: [object] :: BatchObject -> Text
+ OpenAI.V1.Batches: [output_file_id] :: BatchObject -> Maybe FileID
+ OpenAI.V1.Batches: [request_counts] :: BatchObject -> Maybe Counts
+ OpenAI.V1.Batches: [status] :: BatchObject -> Status
+ OpenAI.V1.Batches: [text] :: BatchID -> Text
+ OpenAI.V1.Batches: [total] :: Counts -> Natural
+ OpenAI.V1.Chat.Completions: Approximate :: Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> UserLocation
+ OpenAI.V1.Chat.Completions: ReasoningEffort_High :: ReasoningEffort
+ OpenAI.V1.Chat.Completions: ReasoningEffort_Low :: ReasoningEffort
+ OpenAI.V1.Chat.Completions: ReasoningEffort_Medium :: ReasoningEffort
+ OpenAI.V1.Chat.Completions: SearchContextSize_High :: SearchContextSize
+ OpenAI.V1.Chat.Completions: SearchContextSize_Low :: SearchContextSize
+ OpenAI.V1.Chat.Completions: SearchContextSize_Medium :: SearchContextSize
+ OpenAI.V1.Chat.Completions: WebSearchOptions :: Maybe SearchContextSize -> Maybe UserLocation -> WebSearchOptions
+ OpenAI.V1.Chat.Completions: [assistant_audio] :: Message content -> Maybe AudioData
+ OpenAI.V1.Chat.Completions: [assistant_content] :: Message content -> Maybe content
+ OpenAI.V1.Chat.Completions: [audio] :: CreateChatCompletion -> Maybe AudioParameters
+ OpenAI.V1.Chat.Completions: [bytes] :: Token -> Maybe (Vector Word8)
+ OpenAI.V1.Chat.Completions: [choices] :: ChatCompletionObject -> Vector Choice
+ OpenAI.V1.Chat.Completions: [city] :: UserLocation -> Maybe Text
+ OpenAI.V1.Chat.Completions: [content] :: LogProbs -> Maybe (Vector Token)
+ OpenAI.V1.Chat.Completions: [country] :: UserLocation -> Maybe Text
+ OpenAI.V1.Chat.Completions: [created] :: ChatCompletionObject -> POSIXTime
+ OpenAI.V1.Chat.Completions: [data_] :: InputAudio -> Text
+ OpenAI.V1.Chat.Completions: [detail] :: ImageURL -> Maybe (AutoOr Text)
+ OpenAI.V1.Chat.Completions: [finish_reason] :: Choice -> Text
+ OpenAI.V1.Chat.Completions: [format] :: AudioParameters -> AudioFormat
+ OpenAI.V1.Chat.Completions: [frequency_penalty] :: CreateChatCompletion -> Maybe Double
+ OpenAI.V1.Chat.Completions: [id] :: AudioData -> Text
+ OpenAI.V1.Chat.Completions: [image_url] :: Content -> ImageURL
+ OpenAI.V1.Chat.Completions: [index] :: Choice -> Natural
+ OpenAI.V1.Chat.Completions: [input_audio] :: Content -> InputAudio
+ OpenAI.V1.Chat.Completions: [json_schema] :: ResponseFormat -> JSONSchema
+ OpenAI.V1.Chat.Completions: [logit_bias] :: CreateChatCompletion -> Maybe (Map Word Int)
+ OpenAI.V1.Chat.Completions: [logprob] :: Token -> Double
+ OpenAI.V1.Chat.Completions: [logprobs] :: Choice -> Maybe LogProbs
+ OpenAI.V1.Chat.Completions: [max_completion_tokens] :: CreateChatCompletion -> Maybe Natural
+ OpenAI.V1.Chat.Completions: [message] :: Choice -> Message Text
+ OpenAI.V1.Chat.Completions: [messages] :: CreateChatCompletion -> Vector (Message (Vector Content))
+ OpenAI.V1.Chat.Completions: [metadata] :: CreateChatCompletion -> Maybe (Map Text Text)
+ OpenAI.V1.Chat.Completions: [modalities] :: CreateChatCompletion -> Maybe (Vector Modality)
+ OpenAI.V1.Chat.Completions: [model] :: ChatCompletionObject -> Model
+ OpenAI.V1.Chat.Completions: [n] :: CreateChatCompletion -> Maybe Natural
+ OpenAI.V1.Chat.Completions: [name] :: Message content -> Maybe Text
+ OpenAI.V1.Chat.Completions: [object] :: ChatCompletionObject -> Text
+ OpenAI.V1.Chat.Completions: [parallel_tool_calls] :: CreateChatCompletion -> Maybe Bool
+ OpenAI.V1.Chat.Completions: [prediction] :: CreateChatCompletion -> Maybe Prediction
+ OpenAI.V1.Chat.Completions: [presence_penalty] :: CreateChatCompletion -> Maybe Double
+ OpenAI.V1.Chat.Completions: [reasoning_effort] :: ChatCompletionObject -> Maybe ReasoningEffort
+ OpenAI.V1.Chat.Completions: [refusal] :: LogProbs -> Maybe (Vector Token)
+ OpenAI.V1.Chat.Completions: [region] :: UserLocation -> Maybe Text
+ OpenAI.V1.Chat.Completions: [response_format] :: CreateChatCompletion -> Maybe ResponseFormat
+ OpenAI.V1.Chat.Completions: [search_context_size] :: WebSearchOptions -> Maybe SearchContextSize
+ OpenAI.V1.Chat.Completions: [seed] :: CreateChatCompletion -> Maybe Integer
+ OpenAI.V1.Chat.Completions: [service_tier] :: ChatCompletionObject -> Maybe ServiceTier
+ OpenAI.V1.Chat.Completions: [stop] :: CreateChatCompletion -> Maybe (Vector Text)
+ OpenAI.V1.Chat.Completions: [store] :: CreateChatCompletion -> Maybe Bool
+ OpenAI.V1.Chat.Completions: [system_fingerprint] :: ChatCompletionObject -> Maybe Text
+ OpenAI.V1.Chat.Completions: [temperature] :: CreateChatCompletion -> Maybe Double
+ OpenAI.V1.Chat.Completions: [text] :: Content -> Text
+ OpenAI.V1.Chat.Completions: [timezone] :: UserLocation -> Maybe Text
+ OpenAI.V1.Chat.Completions: [token] :: Token -> Text
+ OpenAI.V1.Chat.Completions: [tool_call_id] :: Message content -> Text
+ OpenAI.V1.Chat.Completions: [tool_calls] :: Message content -> Maybe (Vector ToolCall)
+ OpenAI.V1.Chat.Completions: [tool_choice] :: CreateChatCompletion -> Maybe ToolChoice
+ OpenAI.V1.Chat.Completions: [tools] :: CreateChatCompletion -> Maybe (Vector Tool)
+ OpenAI.V1.Chat.Completions: [top_logprobs] :: Token -> Maybe (Vector Token)
+ OpenAI.V1.Chat.Completions: [top_p] :: CreateChatCompletion -> Maybe Double
+ OpenAI.V1.Chat.Completions: [url] :: ImageURL -> Text
+ OpenAI.V1.Chat.Completions: [usage] :: ChatCompletionObject -> Usage CompletionTokensDetails PromptTokensDetails
+ OpenAI.V1.Chat.Completions: [user] :: CreateChatCompletion -> Maybe Text
+ OpenAI.V1.Chat.Completions: [user_location] :: WebSearchOptions -> Maybe UserLocation
+ OpenAI.V1.Chat.Completions: [voice] :: AudioParameters -> Voice
+ OpenAI.V1.Chat.Completions: [web_search_options] :: CreateChatCompletion -> Maybe WebSearchOptions
+ OpenAI.V1.Chat.Completions: data SearchContextSize
+ OpenAI.V1.Chat.Completions: data UserLocation
+ OpenAI.V1.Chat.Completions: data WebSearchOptions
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.SearchContextSize
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.UserLocation
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.FromJSON.FromJSON OpenAI.V1.Chat.Completions.WebSearchOptions
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.SearchContextSize
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.UserLocation
+ OpenAI.V1.Chat.Completions: instance Data.Aeson.Types.ToJSON.ToJSON OpenAI.V1.Chat.Completions.WebSearchOptions
+ OpenAI.V1.Chat.Completions: instance GHC.Generics.Generic OpenAI.V1.Chat.Completions.SearchContextSize
+ OpenAI.V1.Chat.Completions: instance GHC.Generics.Generic OpenAI.V1.Chat.Completions.UserLocation
+ OpenAI.V1.Chat.Completions: instance GHC.Generics.Generic OpenAI.V1.Chat.Completions.WebSearchOptions
+ OpenAI.V1.Chat.Completions: instance GHC.Show.Show OpenAI.V1.Chat.Completions.SearchContextSize
+ OpenAI.V1.Chat.Completions: instance GHC.Show.Show OpenAI.V1.Chat.Completions.UserLocation
+ OpenAI.V1.Chat.Completions: instance GHC.Show.Show OpenAI.V1.Chat.Completions.WebSearchOptions
+ OpenAI.V1.ChunkingStrategy: [chunk_overlap_tokens] :: Static -> Natural
+ OpenAI.V1.ChunkingStrategy: [max_chunk_size_tokens] :: Static -> Natural
+ OpenAI.V1.ChunkingStrategy: [static] :: ChunkingStrategy -> Static
+ OpenAI.V1.DeletionStatus: [deleted] :: DeletionStatus -> Bool
+ OpenAI.V1.DeletionStatus: [id] :: DeletionStatus -> Text
+ OpenAI.V1.DeletionStatus: [object] :: DeletionStatus -> Text
+ OpenAI.V1.Embeddings: [dimensions] :: CreateEmbeddings -> Maybe Natural
+ OpenAI.V1.Embeddings: [embedding] :: EmbeddingObject -> Vector Double
+ OpenAI.V1.Embeddings: [encoding_format] :: CreateEmbeddings -> Maybe EncodingFormat
+ OpenAI.V1.Embeddings: [index] :: EmbeddingObject -> Natural
+ OpenAI.V1.Embeddings: [input] :: CreateEmbeddings -> Text
+ OpenAI.V1.Embeddings: [model] :: CreateEmbeddings -> Model
+ OpenAI.V1.Embeddings: [object] :: EmbeddingObject -> Text
+ OpenAI.V1.Embeddings: [user] :: CreateEmbeddings -> Maybe Text
+ OpenAI.V1.Error: [code] :: Error -> Maybe Text
+ OpenAI.V1.Error: [line] :: Error -> Maybe Natural
+ OpenAI.V1.Error: [message] :: Error -> Maybe Text
+ OpenAI.V1.Error: [param] :: Error -> Maybe Text
+ OpenAI.V1.Files: [bytes] :: FileObject -> Natural
+ OpenAI.V1.Files: [created_at] :: FileObject -> POSIXTime
+ OpenAI.V1.Files: [deleted] :: DeletionStatus -> Bool
+ OpenAI.V1.Files: [file] :: UploadFile -> FilePath
+ OpenAI.V1.Files: [filename] :: FileObject -> Text
+ OpenAI.V1.Files: [id] :: DeletionStatus -> Text
+ OpenAI.V1.Files: [object] :: DeletionStatus -> Text
+ OpenAI.V1.Files: [purpose] :: FileObject -> Purpose
+ OpenAI.V1.Files: [text] :: FileID -> Text
+ OpenAI.V1.FineTuning.Jobs: [batch_size] :: Hyperparameters -> Maybe (AutoOr Natural)
+ OpenAI.V1.FineTuning.Jobs: [created_at] :: CheckpointObject -> POSIXTime
+ OpenAI.V1.FineTuning.Jobs: [entity] :: WAndB -> Maybe Text
+ OpenAI.V1.FineTuning.Jobs: [error] :: JobObject -> Maybe Error
+ OpenAI.V1.FineTuning.Jobs: [estimated_finish] :: JobObject -> Maybe POSIXTime
+ OpenAI.V1.FineTuning.Jobs: [fine_tuned_model] :: JobObject -> Maybe Model
+ OpenAI.V1.FineTuning.Jobs: [fine_tuned_model_checkpoint] :: CheckpointObject -> Text
+ OpenAI.V1.FineTuning.Jobs: [fine_tuning_job_id] :: CheckpointObject -> FineTuningJobID
+ OpenAI.V1.FineTuning.Jobs: [finished_at] :: JobObject -> Maybe POSIXTime
+ OpenAI.V1.FineTuning.Jobs: [full_valid_loss] :: Metrics -> Double
+ OpenAI.V1.FineTuning.Jobs: [full_valid_mean_token_accuracy] :: Metrics -> Double
+ OpenAI.V1.FineTuning.Jobs: [hyperparameters] :: JobObject -> Hyperparameters
+ OpenAI.V1.FineTuning.Jobs: [id] :: CheckpointObject -> Text
+ OpenAI.V1.FineTuning.Jobs: [integrations] :: JobObject -> Maybe (Vector Integration)
+ OpenAI.V1.FineTuning.Jobs: [learning_rate_multiplier] :: Hyperparameters -> Maybe (AutoOr Double)
+ OpenAI.V1.FineTuning.Jobs: [level] :: EventObject -> Level
+ OpenAI.V1.FineTuning.Jobs: [message] :: EventObject -> Text
+ OpenAI.V1.FineTuning.Jobs: [metrics] :: CheckpointObject -> Metrics
+ OpenAI.V1.FineTuning.Jobs: [model] :: JobObject -> Model
+ OpenAI.V1.FineTuning.Jobs: [n_epochs] :: Hyperparameters -> Maybe (AutoOr Natural)
+ OpenAI.V1.FineTuning.Jobs: [name] :: WAndB -> Maybe Text
+ OpenAI.V1.FineTuning.Jobs: [object] :: CheckpointObject -> Text
+ OpenAI.V1.FineTuning.Jobs: [organization_id] :: JobObject -> Text
+ OpenAI.V1.FineTuning.Jobs: [project] :: WAndB -> Text
+ OpenAI.V1.FineTuning.Jobs: [result_files] :: JobObject -> Vector FileID
+ OpenAI.V1.FineTuning.Jobs: [seed] :: JobObject -> Integer
+ OpenAI.V1.FineTuning.Jobs: [status] :: JobObject -> Status
+ OpenAI.V1.FineTuning.Jobs: [step] :: Metrics -> Double
+ OpenAI.V1.FineTuning.Jobs: [step_number] :: CheckpointObject -> Natural
+ OpenAI.V1.FineTuning.Jobs: [suffix] :: CreateFineTuningJob -> Maybe Text
+ OpenAI.V1.FineTuning.Jobs: [tags] :: WAndB -> Maybe (Vector Text)
+ OpenAI.V1.FineTuning.Jobs: [text] :: FineTuningJobID -> Text
+ OpenAI.V1.FineTuning.Jobs: [train_loss] :: Metrics -> Double
+ OpenAI.V1.FineTuning.Jobs: [train_mean_token_accuracy] :: Metrics -> Double
+ OpenAI.V1.FineTuning.Jobs: [trained_tokens] :: JobObject -> Maybe Natural
+ OpenAI.V1.FineTuning.Jobs: [training_file] :: JobObject -> FileID
+ OpenAI.V1.FineTuning.Jobs: [valid_loss] :: Metrics -> Double
+ OpenAI.V1.FineTuning.Jobs: [valid_mean_token_accuracy] :: Metrics -> Double
+ OpenAI.V1.FineTuning.Jobs: [validation_file] :: JobObject -> Maybe FileID
+ OpenAI.V1.FineTuning.Jobs: [wandb] :: Integration -> WAndB
+ OpenAI.V1.Images.Edits: [image] :: CreateImageEdit -> FilePath
+ OpenAI.V1.Images.Edits: [mask] :: CreateImageEdit -> Maybe FilePath
+ OpenAI.V1.Images.Edits: [model] :: CreateImageEdit -> Maybe Model
+ OpenAI.V1.Images.Edits: [n] :: CreateImageEdit -> Maybe Natural
+ OpenAI.V1.Images.Edits: [prompt] :: CreateImageEdit -> Text
+ OpenAI.V1.Images.Edits: [response_format] :: CreateImageEdit -> Maybe ResponseFormat
+ OpenAI.V1.Images.Edits: [size] :: CreateImageEdit -> Maybe Text
+ OpenAI.V1.Images.Edits: [user] :: CreateImageEdit -> Maybe Text
+ OpenAI.V1.Images.Generations: [model] :: CreateImage -> Maybe Model
+ OpenAI.V1.Images.Generations: [n] :: CreateImage -> Maybe Natural
+ OpenAI.V1.Images.Generations: [prompt] :: CreateImage -> Text
+ OpenAI.V1.Images.Generations: [quality] :: CreateImage -> Maybe Quality
+ OpenAI.V1.Images.Generations: [response_format] :: CreateImage -> Maybe ResponseFormat
+ OpenAI.V1.Images.Generations: [size] :: CreateImage -> Maybe Text
+ OpenAI.V1.Images.Generations: [style] :: CreateImage -> Maybe Style
+ OpenAI.V1.Images.Generations: [user] :: CreateImage -> Maybe Text
+ OpenAI.V1.Images.Image: [b64_json] :: ImageObject -> Maybe Text
+ OpenAI.V1.Images.Image: [revised_prompt] :: ImageObject -> Maybe Text
+ OpenAI.V1.Images.Image: [url] :: ImageObject -> Maybe Text
+ OpenAI.V1.Images.Variations: [image] :: CreateImageVariation -> FilePath
+ OpenAI.V1.Images.Variations: [model] :: CreateImageVariation -> Maybe Model
+ OpenAI.V1.Images.Variations: [n] :: CreateImageVariation -> Maybe Natural
+ OpenAI.V1.Images.Variations: [response_format] :: CreateImageVariation -> Maybe ResponseFormat
+ OpenAI.V1.Images.Variations: [size] :: CreateImageVariation -> Maybe Text
+ OpenAI.V1.Images.Variations: [user] :: CreateImageVariation -> Maybe Text
+ OpenAI.V1.ListOf: [data_] :: ListOf a -> Vector a
+ OpenAI.V1.Message: [attachments] :: Message -> Maybe (Vector Attachment)
+ OpenAI.V1.Message: [content] :: Message -> Vector (Content Text)
+ OpenAI.V1.Message: [detail] :: ImageURL -> Maybe (AutoOr Text)
+ OpenAI.V1.Message: [file_id] :: Attachment -> FileID
+ OpenAI.V1.Message: [image_file] :: Content text -> ImageFile
+ OpenAI.V1.Message: [image_url] :: Content text -> ImageURL
+ OpenAI.V1.Message: [metadata] :: Message -> Maybe (Map Text Text)
+ OpenAI.V1.Message: [text] :: Content text -> text
+ OpenAI.V1.Message: [tools] :: Attachment -> Maybe (Vector Tool)
+ OpenAI.V1.Models: [created] :: ModelObject -> POSIXTime
+ OpenAI.V1.Models: [id] :: ModelObject -> Model
+ OpenAI.V1.Models: [object] :: ModelObject -> Text
+ OpenAI.V1.Models: [owned_by] :: ModelObject -> Text
+ OpenAI.V1.Models: [text] :: Model -> Text
+ OpenAI.V1.Moderations: [categories] :: Result -> Map Text Bool
+ OpenAI.V1.Moderations: [category_applied_input_types] :: Result -> Maybe (Map Text InputType)
+ OpenAI.V1.Moderations: [category_scores] :: Result -> Map Text Double
+ OpenAI.V1.Moderations: [flagged] :: Result -> Bool
+ OpenAI.V1.Moderations: [id] :: Moderation -> Text
+ OpenAI.V1.Moderations: [input] :: CreateModeration -> Text
+ OpenAI.V1.Moderations: [model] :: Moderation -> Model
+ OpenAI.V1.Moderations: [results] :: Moderation -> Vector Result
+ OpenAI.V1.ResponseFormat: [description] :: JSONSchema -> Maybe Text
+ OpenAI.V1.ResponseFormat: [json_schema] :: ResponseFormat -> JSONSchema
+ OpenAI.V1.ResponseFormat: [name] :: JSONSchema -> Text
+ OpenAI.V1.ResponseFormat: [schema] :: JSONSchema -> Maybe Value
+ OpenAI.V1.ResponseFormat: [strict] :: JSONSchema -> Maybe Bool
+ OpenAI.V1.Threads: [attachments] :: Message -> Maybe (Vector Attachment)
+ OpenAI.V1.Threads: [content] :: Message -> Vector (Content Text)
+ OpenAI.V1.Threads: [created_at] :: ThreadObject -> POSIXTime
+ OpenAI.V1.Threads: [detail] :: ImageFile -> Maybe (AutoOr Text)
+ OpenAI.V1.Threads: [file_id] :: Attachment -> FileID
+ OpenAI.V1.Threads: [id] :: ThreadObject -> ThreadID
+ OpenAI.V1.Threads: [image_file] :: Content text -> ImageFile
+ OpenAI.V1.Threads: [image_url] :: ImageURL -> Text
+ OpenAI.V1.Threads: [messages] :: Thread -> Maybe (Vector Message)
+ OpenAI.V1.Threads: [metadata] :: ThreadObject -> Maybe (Map Text Text)
+ OpenAI.V1.Threads: [object] :: ThreadObject -> Text
+ OpenAI.V1.Threads: [text] :: Content text -> text
+ OpenAI.V1.Threads: [tool_resources] :: ThreadObject -> Maybe ToolResources
+ OpenAI.V1.Threads: [tools] :: Attachment -> Maybe (Vector Tool)
+ OpenAI.V1.Threads.Messages: [annotations] :: TextObject -> Vector Annotation
+ OpenAI.V1.Threads.Messages: [assistant_id] :: MessageObject -> Maybe AssistantID
+ OpenAI.V1.Threads.Messages: [attachments] :: MessageObject -> Maybe (Vector Attachment)
+ OpenAI.V1.Threads.Messages: [completed_at] :: MessageObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Messages: [content] :: MessageObject -> Vector (Content TextObject)
+ OpenAI.V1.Threads.Messages: [created_at] :: MessageObject -> POSIXTime
+ OpenAI.V1.Threads.Messages: [end_index] :: Annotation -> Natural
+ OpenAI.V1.Threads.Messages: [file_citation] :: Annotation -> File
+ OpenAI.V1.Threads.Messages: [file_id] :: File -> FileID
+ OpenAI.V1.Threads.Messages: [file_path] :: Annotation -> File
+ OpenAI.V1.Threads.Messages: [id] :: MessageObject -> MessageID
+ OpenAI.V1.Threads.Messages: [incomplete_at] :: MessageObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Messages: [incomplete_details] :: MessageObject -> Maybe IncompleteDetails
+ OpenAI.V1.Threads.Messages: [metadata] :: MessageObject -> Map Text Text
+ OpenAI.V1.Threads.Messages: [object] :: MessageObject -> Text
+ OpenAI.V1.Threads.Messages: [reason] :: IncompleteDetails -> Text
+ OpenAI.V1.Threads.Messages: [role] :: MessageObject -> Text
+ OpenAI.V1.Threads.Messages: [run_id] :: MessageObject -> Maybe RunID
+ OpenAI.V1.Threads.Messages: [start_index] :: Annotation -> Natural
+ OpenAI.V1.Threads.Messages: [status] :: MessageObject -> Maybe Status
+ OpenAI.V1.Threads.Messages: [text] :: Annotation -> Text
+ OpenAI.V1.Threads.Messages: [thread_id] :: MessageObject -> ThreadID
+ OpenAI.V1.Threads.Messages: [value] :: TextObject -> Text
+ OpenAI.V1.Threads.Runs: [additional_instructions] :: CreateRun -> Maybe Text
+ OpenAI.V1.Threads.Runs: [additional_messages] :: CreateRun -> Maybe (Vector Message)
+ OpenAI.V1.Threads.Runs: [assistant_id] :: RunObject -> AssistantID
+ OpenAI.V1.Threads.Runs: [cancelled_at] :: RunObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs: [completed_at] :: RunObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs: [created_at] :: RunObject -> POSIXTime
+ OpenAI.V1.Threads.Runs: [expires_at] :: RunObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs: [failed_at] :: RunObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs: [id] :: RunObject -> RunID
+ OpenAI.V1.Threads.Runs: [incomplete_details] :: RunObject -> Maybe IncompleteDetails
+ OpenAI.V1.Threads.Runs: [instructions] :: RunObject -> Maybe Text
+ OpenAI.V1.Threads.Runs: [last_error] :: RunObject -> Maybe Error
+ OpenAI.V1.Threads.Runs: [last_messages] :: TruncationStrategy -> Maybe Natural
+ OpenAI.V1.Threads.Runs: [max_completion_tokens] :: RunObject -> Maybe Natural
+ OpenAI.V1.Threads.Runs: [max_prompt_tokens] :: RunObject -> Maybe Natural
+ OpenAI.V1.Threads.Runs: [metadata] :: RunObject -> Map Text Text
+ OpenAI.V1.Threads.Runs: [model] :: RunObject -> Model
+ OpenAI.V1.Threads.Runs: [object] :: RunObject -> Text
+ OpenAI.V1.Threads.Runs: [output] :: ToolOutput -> Text
+ OpenAI.V1.Threads.Runs: [parallel_tool_calls] :: RunObject -> Bool
+ OpenAI.V1.Threads.Runs: [reason] :: IncompleteDetails -> Text
+ OpenAI.V1.Threads.Runs: [required_action] :: RunObject -> Maybe RequiredAction
+ OpenAI.V1.Threads.Runs: [response_format] :: RunObject -> AutoOr ResponseFormat
+ OpenAI.V1.Threads.Runs: [started_at] :: RunObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs: [status] :: RunObject -> Status
+ OpenAI.V1.Threads.Runs: [submit_tool_outputs] :: RequiredAction -> SubmitToolOutputs
+ OpenAI.V1.Threads.Runs: [temperature] :: RunObject -> Maybe Double
+ OpenAI.V1.Threads.Runs: [text] :: RunID -> Text
+ OpenAI.V1.Threads.Runs: [thread] :: CreateThreadAndRun -> Maybe Thread
+ OpenAI.V1.Threads.Runs: [thread_id] :: RunObject -> ThreadID
+ OpenAI.V1.Threads.Runs: [toolResources] :: CreateThreadAndRun -> Maybe ToolResources
+ OpenAI.V1.Threads.Runs: [tool_call_id] :: ToolOutput -> Maybe Text
+ OpenAI.V1.Threads.Runs: [tool_calls] :: SubmitToolOutputs -> Vector ToolCall
+ OpenAI.V1.Threads.Runs: [tool_choice] :: RunObject -> ToolChoice
+ OpenAI.V1.Threads.Runs: [tool_outputs] :: SubmitToolOutputsToRun -> Vector ToolOutput
+ OpenAI.V1.Threads.Runs: [tools] :: RunObject -> Vector Tool
+ OpenAI.V1.Threads.Runs: [top_p] :: RunObject -> Maybe Double
+ OpenAI.V1.Threads.Runs: [truncation_strategy] :: RunObject -> Maybe TruncationStrategy
+ OpenAI.V1.Threads.Runs: [usage] :: RunObject -> Maybe (Usage (Maybe CompletionTokensDetails) (Maybe PromptTokensDetails))
+ OpenAI.V1.Threads.Runs.Steps: [arguments] :: Function -> Text
+ OpenAI.V1.Threads.Runs.Steps: [assistant_id] :: RunStepObject -> AssistantID
+ OpenAI.V1.Threads.Runs.Steps: [cancelled_at] :: RunStepObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs.Steps: [code_interpreter] :: ToolCall -> CodeInterpreter
+ OpenAI.V1.Threads.Runs.Steps: [completed_at] :: RunStepObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs.Steps: [content] :: Result -> Vector Content
+ OpenAI.V1.Threads.Runs.Steps: [created_at] :: RunStepObject -> POSIXTime
+ OpenAI.V1.Threads.Runs.Steps: [expired_at] :: RunStepObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs.Steps: [failed_at] :: RunStepObject -> Maybe POSIXTime
+ OpenAI.V1.Threads.Runs.Steps: [file_id] :: Result -> FileID
+ OpenAI.V1.Threads.Runs.Steps: [file_name] :: Result -> Text
+ OpenAI.V1.Threads.Runs.Steps: [file_search] :: ToolCall -> Map Text FileSearch
+ OpenAI.V1.Threads.Runs.Steps: [function] :: ToolCall -> Function
+ OpenAI.V1.Threads.Runs.Steps: [id] :: ToolCall -> Text
+ OpenAI.V1.Threads.Runs.Steps: [image] :: Output -> Image
+ OpenAI.V1.Threads.Runs.Steps: [input] :: CodeInterpreter -> Text
+ OpenAI.V1.Threads.Runs.Steps: [last_error] :: RunStepObject -> Maybe Error
+ OpenAI.V1.Threads.Runs.Steps: [logs] :: Output -> Text
+ OpenAI.V1.Threads.Runs.Steps: [message_id] :: StepDetails -> MessageID
+ OpenAI.V1.Threads.Runs.Steps: [metadata] :: RunStepObject -> Map Text Text
+ OpenAI.V1.Threads.Runs.Steps: [name] :: Function -> Text
+ OpenAI.V1.Threads.Runs.Steps: [object] :: RunStepObject -> Text
+ OpenAI.V1.Threads.Runs.Steps: [output] :: Function -> Maybe Text
+ OpenAI.V1.Threads.Runs.Steps: [outputs] :: CodeInterpreter -> Vector Output
+ OpenAI.V1.Threads.Runs.Steps: [ranker] :: RankingOptions -> Text
+ OpenAI.V1.Threads.Runs.Steps: [ranking_options] :: FileSearch -> RankingOptions
+ OpenAI.V1.Threads.Runs.Steps: [results] :: FileSearch -> Vector Result
+ OpenAI.V1.Threads.Runs.Steps: [run_id] :: RunStepObject -> RunID
+ OpenAI.V1.Threads.Runs.Steps: [score] :: Result -> Double
+ OpenAI.V1.Threads.Runs.Steps: [score_threshold] :: RankingOptions -> Double
+ OpenAI.V1.Threads.Runs.Steps: [status] :: RunStepObject -> Status
+ OpenAI.V1.Threads.Runs.Steps: [step_details] :: RunStepObject -> StepDetails
+ OpenAI.V1.Threads.Runs.Steps: [text] :: Content -> Text
+ OpenAI.V1.Threads.Runs.Steps: [thread_id] :: RunStepObject -> ThreadID
+ OpenAI.V1.Threads.Runs.Steps: [tool_calls] :: StepDetails -> Vector ToolCall
+ OpenAI.V1.Threads.Runs.Steps: [type_] :: Content -> Text
+ OpenAI.V1.Threads.Runs.Steps: [usage] :: RunStepObject -> Maybe (Usage CompletionTokensDetails PromptTokensDetails)
+ OpenAI.V1.Tool: [description] :: Function -> Maybe Text
+ OpenAI.V1.Tool: [file_search] :: Tool -> FileSearch
+ OpenAI.V1.Tool: [function] :: Tool -> Function
+ OpenAI.V1.Tool: [max_num_results] :: FileSearch -> Maybe Natural
+ OpenAI.V1.Tool: [name] :: Function -> Text
+ OpenAI.V1.Tool: [parameters] :: Function -> Maybe Value
+ OpenAI.V1.Tool: [ranker] :: RankingOptions -> Maybe Text
+ OpenAI.V1.Tool: [ranking_options] :: FileSearch -> Maybe RankingOptions
+ OpenAI.V1.Tool: [score_threshold] :: RankingOptions -> Double
+ OpenAI.V1.Tool: [strict] :: Function -> Maybe Bool
+ OpenAI.V1.ToolCall: [arguments] :: Function -> Text
+ OpenAI.V1.ToolCall: [function] :: ToolCall -> Function
+ OpenAI.V1.ToolCall: [id] :: ToolCall -> Text
+ OpenAI.V1.ToolCall: [name] :: Function -> Text
+ OpenAI.V1.ToolResources: [chunk_overlap_tokens] :: Static -> Natural
+ OpenAI.V1.ToolResources: [chunking_strategy] :: VectorStore -> Maybe (AutoOr ChunkingStrategy)
+ OpenAI.V1.ToolResources: [code_interpreter] :: ToolResources -> Maybe CodeInterpreterResources
+ OpenAI.V1.ToolResources: [file_ids] :: VectorStore -> Maybe (Vector FileID)
+ OpenAI.V1.ToolResources: [file_search] :: ToolResources -> Maybe FileSearchResources
+ OpenAI.V1.ToolResources: [max_chunk_size_tokens] :: Static -> Natural
+ OpenAI.V1.ToolResources: [vector_store_ids] :: FileSearchResources -> Maybe (Vector FileID)
+ OpenAI.V1.ToolResources: [vector_stores] :: FileSearchResources -> Maybe (Vector VectorStore)
+ OpenAI.V1.Uploads: [bytes] :: UploadObject file -> Natural
+ OpenAI.V1.Uploads: [created_at] :: PartObject -> POSIXTime
+ OpenAI.V1.Uploads: [data_] :: AddUploadPart -> FilePath
+ OpenAI.V1.Uploads: [expires_at] :: UploadObject file -> POSIXTime
+ OpenAI.V1.Uploads: [file] :: UploadObject file -> file
+ OpenAI.V1.Uploads: [filename] :: UploadObject file -> Text
+ OpenAI.V1.Uploads: [id] :: PartObject -> Text
+ OpenAI.V1.Uploads: [md5] :: CompleteUpload -> Maybe Text
+ OpenAI.V1.Uploads: [mime_type] :: CreateUpload -> Text
+ OpenAI.V1.Uploads: [object] :: PartObject -> Text
+ OpenAI.V1.Uploads: [part_ids] :: CompleteUpload -> Vector Text
+ OpenAI.V1.Uploads: [purpose] :: UploadObject file -> Purpose
+ OpenAI.V1.Uploads: [status] :: UploadObject file -> Status
+ OpenAI.V1.Uploads: [text] :: UploadID -> Text
+ OpenAI.V1.Uploads: [upload_id] :: PartObject -> UploadID
+ OpenAI.V1.Usage: [accepted_prediction_tokens] :: CompletionTokensDetails -> Maybe Natural
+ OpenAI.V1.Usage: [audio_tokens] :: PromptTokensDetails -> Maybe Natural
+ OpenAI.V1.Usage: [cached_tokens] :: PromptTokensDetails -> Maybe Natural
+ OpenAI.V1.Usage: [completion_tokens] :: Usage completionTokensDetails promptTokensDetails -> Natural
+ OpenAI.V1.Usage: [completion_tokens_details] :: Usage completionTokensDetails promptTokensDetails -> Maybe completionTokensDetails
+ OpenAI.V1.Usage: [prompt_tokens] :: Usage completionTokensDetails promptTokensDetails -> Natural
+ OpenAI.V1.Usage: [prompt_tokens_details] :: Usage completionTokensDetails promptTokensDetails -> Maybe promptTokensDetails
+ OpenAI.V1.Usage: [reasoning_tokens] :: CompletionTokensDetails -> Maybe Natural
+ OpenAI.V1.Usage: [rejected_prediction_tokens] :: CompletionTokensDetails -> Maybe Natural
+ OpenAI.V1.Usage: [total_tokens] :: Usage completionTokensDetails promptTokensDetails -> Natural
+ OpenAI.V1.VectorStores: [anchor] :: ExpiresAfter -> Text
+ OpenAI.V1.VectorStores: [chunking_strategy] :: CreateVectorStore -> Maybe (AutoOr ChunkingStrategy)
+ OpenAI.V1.VectorStores: [created_at] :: VectorStoreObject -> POSIXTime
+ OpenAI.V1.VectorStores: [days] :: ExpiresAfter -> Natural
+ OpenAI.V1.VectorStores: [expires_after] :: VectorStoreObject -> Maybe ExpiresAfter
+ OpenAI.V1.VectorStores: [expires_at] :: VectorStoreObject -> Maybe POSIXTime
+ OpenAI.V1.VectorStores: [file_counts] :: VectorStoreObject -> FileCounts
+ OpenAI.V1.VectorStores: [file_ids] :: CreateVectorStore -> Vector FileID
+ OpenAI.V1.VectorStores: [id] :: VectorStoreObject -> VectorStoreID
+ OpenAI.V1.VectorStores: [last_active_at] :: VectorStoreObject -> Maybe POSIXTime
+ OpenAI.V1.VectorStores: [metadata] :: VectorStoreObject -> Map Text Text
+ OpenAI.V1.VectorStores: [name] :: VectorStoreObject -> Maybe Text
+ OpenAI.V1.VectorStores: [object] :: VectorStoreObject -> Text
+ OpenAI.V1.VectorStores: [status] :: VectorStoreObject -> Status
+ OpenAI.V1.VectorStores: [text] :: VectorStoreID -> Text
+ OpenAI.V1.VectorStores: [usage_bytes] :: VectorStoreObject -> Natural
+ OpenAI.V1.VectorStores.FileBatches: [chunking_strategy] :: CreateVectorStoreFileBatch -> Maybe ChunkingStrategy
+ OpenAI.V1.VectorStores.FileBatches: [created_at] :: VectorStoreFilesBatchObject -> POSIXTime
+ OpenAI.V1.VectorStores.FileBatches: [file_counts] :: VectorStoreFilesBatchObject -> Maybe FileCounts
+ OpenAI.V1.VectorStores.FileBatches: [file_ids] :: CreateVectorStoreFileBatch -> Vector FileID
+ OpenAI.V1.VectorStores.FileBatches: [id] :: VectorStoreFilesBatchObject -> VectorStoreFileBatchID
+ OpenAI.V1.VectorStores.FileBatches: [object] :: VectorStoreFilesBatchObject -> Text
+ OpenAI.V1.VectorStores.FileBatches: [status] :: VectorStoreFilesBatchObject -> Status
+ OpenAI.V1.VectorStores.FileBatches: [text] :: VectorStoreFileBatchID -> Text
+ OpenAI.V1.VectorStores.FileBatches: [vector_store_id] :: VectorStoreFilesBatchObject -> VectorStoreID
+ OpenAI.V1.VectorStores.FileCounts: [cancelled] :: FileCounts -> Natural
+ OpenAI.V1.VectorStores.FileCounts: [completed] :: FileCounts -> Natural
+ OpenAI.V1.VectorStores.FileCounts: [failed] :: FileCounts -> Natural
+ OpenAI.V1.VectorStores.FileCounts: [in_progress] :: FileCounts -> Natural
+ OpenAI.V1.VectorStores.FileCounts: [total] :: FileCounts -> Natural
+ OpenAI.V1.VectorStores.Files: [chunking_strategy] :: VectorStoreFileObject -> ChunkingStrategy
+ OpenAI.V1.VectorStores.Files: [created_at] :: VectorStoreFileObject -> POSIXTime
+ OpenAI.V1.VectorStores.Files: [file_id] :: CreateVectorStoreFile -> FileID
+ OpenAI.V1.VectorStores.Files: [id] :: VectorStoreFileObject -> VectorStoreFileID
+ OpenAI.V1.VectorStores.Files: [last_error] :: VectorStoreFileObject -> Maybe Error
+ OpenAI.V1.VectorStores.Files: [object] :: VectorStoreFileObject -> Text
+ OpenAI.V1.VectorStores.Files: [status] :: VectorStoreFileObject -> Status
+ OpenAI.V1.VectorStores.Files: [text] :: VectorStoreFileID -> Text
+ OpenAI.V1.VectorStores.Files: [usage_bytes] :: VectorStoreFileObject -> Natural
+ OpenAI.V1.VectorStores.Files: [vector_store_id] :: VectorStoreFileObject -> VectorStoreID
- OpenAI.V1: type API = Header' [Required, Strict] "Authorization" Text :> "v1" :> (API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API)
+ OpenAI.V1: type API = Header' '[Required, Strict] "Authorization" Text :> "v1" :> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API :<|> API
- OpenAI.V1.Assistants: type API = Header' '[Required, Strict] "OpenAI-Beta" Text :> "assistants" :> (ReqBody '[JSON] CreateAssistant :> Post '[JSON] AssistantObject :<|> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> Get '[JSON] (ListOf AssistantObject) :<|> Capture "assistant_id" AssistantID :> Get '[JSON] AssistantObject :<|> Capture "assistant_id" AssistantID :> ReqBody '[JSON] ModifyAssistant :> Post '[JSON] AssistantObject :<|> Capture "assistant_id" AssistantID :> Delete '[JSON] DeletionStatus)
+ OpenAI.V1.Assistants: type API = Header' '[Required, Strict] "OpenAI-Beta" Text :> "assistants" :> ReqBody '[JSON] CreateAssistant :> Post '[JSON] AssistantObject :<|> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> Get '[JSON] ListOf AssistantObject :<|> Capture "assistant_id" AssistantID :> Get '[JSON] AssistantObject :<|> Capture "assistant_id" AssistantID :> ReqBody '[JSON] ModifyAssistant :> Post '[JSON] AssistantObject :<|> Capture "assistant_id" AssistantID :> Delete '[JSON] DeletionStatus
- OpenAI.V1.Audio: type API = "audio" :> (API :<|> API :<|> API)
+ OpenAI.V1.Audio: type API = "audio" :> API :<|> API :<|> API
- OpenAI.V1.Audio.Speech: CreateSpeech :: Model -> Text -> Voice -> Maybe Format -> Maybe Double -> CreateSpeech
+ OpenAI.V1.Audio.Speech: CreateSpeech :: Model -> Text -> Voice -> Maybe Text -> Maybe Format -> Maybe Double -> CreateSpeech
- OpenAI.V1.Batches: type API = "batches" :> (ReqBody '[JSON] CreateBatch :> Post '[JSON] BatchObject :<|> Capture "batch_id" BatchID :> Get '[JSON] BatchObject :<|> Capture "batch_id" BatchID :> "cancel" :> Post '[JSON] BatchObject :<|> QueryParam "after" Text :> QueryParam "limit" Natural :> Get '[JSON] (ListOf BatchObject))
+ OpenAI.V1.Batches: type API = "batches" :> ReqBody '[JSON] CreateBatch :> Post '[JSON] BatchObject :<|> Capture "batch_id" BatchID :> Get '[JSON] BatchObject :<|> Capture "batch_id" BatchID :> "cancel" :> Post '[JSON] BatchObject :<|> QueryParam "after" Text :> QueryParam "limit" Natural :> Get '[JSON] ListOf BatchObject
- OpenAI.V1.Chat.Completions: CreateChatCompletion :: Vector (Message (Vector Content)) -> Model -> Maybe Bool -> Maybe (Map Text Text) -> Maybe Double -> Maybe (Map Word Int) -> Maybe Bool -> Maybe Word -> Maybe Natural -> Maybe Natural -> Maybe (Vector Modality) -> Maybe Prediction -> Maybe AudioParameters -> Maybe Double -> Maybe ReasoningEffort -> Maybe ResponseFormat -> Maybe Integer -> Maybe (AutoOr ServiceTier) -> Maybe (Vector Text) -> Maybe Double -> Maybe Double -> Maybe (Vector Tool) -> Maybe ToolChoice -> Maybe Bool -> Maybe Text -> CreateChatCompletion
+ OpenAI.V1.Chat.Completions: CreateChatCompletion :: Vector (Message (Vector Content)) -> Model -> Maybe Bool -> Maybe (Map Text Text) -> Maybe Double -> Maybe (Map Word Int) -> Maybe Bool -> Maybe Word -> Maybe Natural -> Maybe Natural -> Maybe (Vector Modality) -> Maybe Prediction -> Maybe AudioParameters -> Maybe Double -> Maybe ReasoningEffort -> Maybe ResponseFormat -> Maybe Integer -> Maybe (AutoOr ServiceTier) -> Maybe (Vector Text) -> Maybe Double -> Maybe Double -> Maybe (Vector Tool) -> Maybe ToolChoice -> Maybe Bool -> Maybe Text -> Maybe WebSearchOptions -> CreateChatCompletion
- OpenAI.V1.Embeddings: type API = "embeddings" :> ReqBody '[JSON] CreateEmbeddings :> Post '[JSON] (ListOf EmbeddingObject)
+ OpenAI.V1.Embeddings: type API = "embeddings" :> ReqBody '[JSON] CreateEmbeddings :> Post '[JSON] ListOf EmbeddingObject
- OpenAI.V1.Files: type API = "files" :> (MultipartForm Tmp UploadFile :> Post '[JSON] FileObject :<|> QueryParam "purpose" Purpose :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> Get '[JSON] (ListOf FileObject) :<|> Capture "file_id" FileID :> Get '[JSON] FileObject :<|> Capture "file_id" FileID :> Delete '[JSON] DeletionStatus :<|> Capture "file_id" FileID :> "content" :> Get '[OctetStream] ByteString)
+ OpenAI.V1.Files: type API = "files" :> MultipartForm Tmp UploadFile :> Post '[JSON] FileObject :<|> QueryParam "purpose" Purpose :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> Get '[JSON] ListOf FileObject :<|> Capture "file_id" FileID :> Get '[JSON] FileObject :<|> Capture "file_id" FileID :> Delete '[JSON] DeletionStatus :<|> Capture "file_id" FileID :> "content" :> Get '[OctetStream] ByteString
- OpenAI.V1.FineTuning.Jobs: type API = "fine_tuning" :> "jobs" :> (ReqBody '[JSON] CreateFineTuningJob :> Post '[JSON] JobObject :<|> QueryParam "after" Text :> QueryParam "limit" Natural :> Get '[JSON] (ListOf JobObject) :<|> Capture "fine_tuning_job_id" FineTuningJobID :> "events" :> QueryParam "after" Text :> QueryParam "limit" Natural :> Get '[JSON] (ListOf EventObject) :<|> Capture "fine_tuning_job_id" FineTuningJobID :> "checkpoints" :> QueryParam "after" Text :> QueryParam "limit" Natural :> Get '[JSON] (ListOf CheckpointObject) :<|> Capture "fine_tuning_job_id" FineTuningJobID :> Get '[JSON] JobObject :<|> Capture "fine_tuning_job_id" FineTuningJobID :> "cancel" :> Post '[JSON] JobObject)
+ OpenAI.V1.FineTuning.Jobs: type API = "fine_tuning" :> "jobs" :> ReqBody '[JSON] CreateFineTuningJob :> Post '[JSON] JobObject :<|> QueryParam "after" Text :> QueryParam "limit" Natural :> Get '[JSON] ListOf JobObject :<|> Capture "fine_tuning_job_id" FineTuningJobID :> "events" :> QueryParam "after" Text :> QueryParam "limit" Natural :> Get '[JSON] ListOf EventObject :<|> Capture "fine_tuning_job_id" FineTuningJobID :> "checkpoints" :> QueryParam "after" Text :> QueryParam "limit" Natural :> Get '[JSON] ListOf CheckpointObject :<|> Capture "fine_tuning_job_id" FineTuningJobID :> Get '[JSON] JobObject :<|> Capture "fine_tuning_job_id" FineTuningJobID :> "cancel" :> Post '[JSON] JobObject
- OpenAI.V1.Images: type API = "images" :> (API :<|> API :<|> API)
+ OpenAI.V1.Images: type API = "images" :> API :<|> API :<|> API
- OpenAI.V1.Images.Edits: type API = "edits" :> MultipartForm Tmp CreateImageEdit :> Post '[JSON] (ListOf ImageObject)
+ OpenAI.V1.Images.Edits: type API = "edits" :> MultipartForm Tmp CreateImageEdit :> Post '[JSON] ListOf ImageObject
- OpenAI.V1.Images.Generations: type API = "generations" :> ReqBody '[JSON] CreateImage :> Post '[JSON] (ListOf ImageObject)
+ OpenAI.V1.Images.Generations: type API = "generations" :> ReqBody '[JSON] CreateImage :> Post '[JSON] ListOf ImageObject
- OpenAI.V1.Images.Variations: type API = "variations" :> MultipartForm Tmp CreateImageVariation :> Post '[JSON] (ListOf ImageObject)
+ OpenAI.V1.Images.Variations: type API = "variations" :> MultipartForm Tmp CreateImageVariation :> Post '[JSON] ListOf ImageObject
- OpenAI.V1.Models: type API = "models" :> (Get '[JSON] (ListOf ModelObject) :<|> Capture "model" Model :> Get '[JSON] ModelObject :<|> Capture "model" Model :> Delete '[JSON] DeletionStatus)
+ OpenAI.V1.Models: type API = "models" :> Get '[JSON] ListOf ModelObject :<|> Capture "model" Model :> Get '[JSON] ModelObject :<|> Capture "model" Model :> Delete '[JSON] DeletionStatus
- OpenAI.V1.Threads: type API = "threads" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> (ReqBody '[JSON] Thread :> Post '[JSON] ThreadObject :<|> Capture "thread_id" ThreadID :> Get '[JSON] ThreadObject :<|> Capture "thread_id" ThreadID :> ReqBody '[JSON] ModifyThread :> Post '[JSON] ThreadObject :<|> Capture "thread_id" ThreadID :> Delete '[JSON] DeletionStatus)
+ OpenAI.V1.Threads: type API = "threads" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> ReqBody '[JSON] Thread :> Post '[JSON] ThreadObject :<|> Capture "thread_id" ThreadID :> Get '[JSON] ThreadObject :<|> Capture "thread_id" ThreadID :> ReqBody '[JSON] ModifyThread :> Post '[JSON] ThreadObject :<|> Capture "thread_id" ThreadID :> Delete '[JSON] DeletionStatus
- OpenAI.V1.Threads.Messages: type API = Header' '[Required, Strict] "OpenAI-Beta" Text :> "threads" :> (Capture "thread_id" ThreadID :> "messages" :> ReqBody '[JSON] Message :> Post '[JSON] MessageObject :<|> Capture "thread_id" ThreadID :> "messages" :> Get '[JSON] (ListOf MessageObject) :<|> Capture "thread_id" ThreadID :> "messages" :> Capture "message_id" MessageID :> Get '[JSON] MessageObject :<|> Capture "thread_id" ThreadID :> "messages" :> Capture "message_id" MessageID :> ReqBody '[JSON] ModifyMessage :> Post '[JSON] MessageObject :<|> Capture "thread_id" ThreadID :> "messages" :> Capture "message_id" MessageID :> Delete '[JSON] DeletionStatus)
+ OpenAI.V1.Threads.Messages: type API = Header' '[Required, Strict] "OpenAI-Beta" Text :> "threads" :> Capture "thread_id" ThreadID :> "messages" :> ReqBody '[JSON] Message :> Post '[JSON] MessageObject :<|> Capture "thread_id" ThreadID :> "messages" :> Get '[JSON] ListOf MessageObject :<|> Capture "thread_id" ThreadID :> "messages" :> Capture "message_id" MessageID :> Get '[JSON] MessageObject :<|> Capture "thread_id" ThreadID :> "messages" :> Capture "message_id" MessageID :> ReqBody '[JSON] ModifyMessage :> Post '[JSON] MessageObject :<|> Capture "thread_id" ThreadID :> "messages" :> Capture "message_id" MessageID :> Delete '[JSON] DeletionStatus
- OpenAI.V1.Threads.Runs: type API = "threads" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> (Capture "thread_id" ThreadID :> "runs" :> QueryParam "include[]" Text :> ReqBody '[JSON] CreateRun :> Post '[JSON] RunObject :<|> "runs" :> ReqBody '[JSON] CreateThreadAndRun :> Post '[JSON] RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> Get '[JSON] (ListOf RunObject) :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> Get '[JSON] RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> ReqBody '[JSON] ModifyRun :> Post '[JSON] RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> "submit_tool_outputs" :> ReqBody '[JSON] SubmitToolOutputsToRun :> Post '[JSON] RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> "cancel" :> Post '[JSON] RunObject)
+ OpenAI.V1.Threads.Runs: type API = "threads" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> Capture "thread_id" ThreadID :> "runs" :> QueryParam "include[]" Text :> ReqBody '[JSON] CreateRun :> Post '[JSON] RunObject :<|> "runs" :> ReqBody '[JSON] CreateThreadAndRun :> Post '[JSON] RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> Get '[JSON] ListOf RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> Get '[JSON] RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> ReqBody '[JSON] ModifyRun :> Post '[JSON] RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> "submit_tool_outputs" :> ReqBody '[JSON] SubmitToolOutputsToRun :> Post '[JSON] RunObject :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> "cancel" :> Post '[JSON] RunObject
- OpenAI.V1.Threads.Runs.Steps: type API = "threads" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> (Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> "steps" :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> QueryParam "include[]" Text :> Get '[JSON] (ListOf RunStepObject) :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> "steps" :> Capture "step_id" StepID :> QueryParam "include[]" Text :> Get '[JSON] RunStepObject)
+ OpenAI.V1.Threads.Runs.Steps: type API = "threads" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> "steps" :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> QueryParam "include[]" Text :> Get '[JSON] ListOf RunStepObject :<|> Capture "thread_id" ThreadID :> "runs" :> Capture "run_id" RunID :> "steps" :> Capture "step_id" StepID :> QueryParam "include[]" Text :> Get '[JSON] RunStepObject
- OpenAI.V1.Uploads: type API = "uploads" :> (ReqBody '[JSON] CreateUpload :> Post '[JSON] (UploadObject (Maybe Void)) :<|> Capture "upload_id" UploadID :> "parts" :> MultipartForm Tmp AddUploadPart :> Post '[JSON] PartObject :<|> Capture "upload_id" UploadID :> "complete" :> ReqBody '[JSON] CompleteUpload :> Post '[JSON] (UploadObject FileObject) :<|> Capture "upload_id" UploadID :> "cancel" :> Post '[JSON] (UploadObject (Maybe Void)))
+ OpenAI.V1.Uploads: type API = "uploads" :> ReqBody '[JSON] CreateUpload :> Post '[JSON] UploadObject Maybe Void :<|> Capture "upload_id" UploadID :> "parts" :> MultipartForm Tmp AddUploadPart :> Post '[JSON] PartObject :<|> Capture "upload_id" UploadID :> "complete" :> ReqBody '[JSON] CompleteUpload :> Post '[JSON] UploadObject FileObject :<|> Capture "upload_id" UploadID :> "cancel" :> Post '[JSON] UploadObject Maybe Void
- OpenAI.V1.VectorStores: type API = "vector_stores" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> (ReqBody '[JSON] CreateVectorStore :> Post '[JSON] VectorStoreObject :<|> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> Get '[JSON] (ListOf VectorStoreObject) :<|> Capture "vector_store_id" VectorStoreID :> Get '[JSON] VectorStoreObject :<|> Capture "vector_store_id" VectorStoreID :> ReqBody '[JSON] ModifyVectorStore :> Post '[JSON] VectorStoreObject :<|> Capture "vector_store_id" VectorStoreID :> Delete '[JSON] DeletionStatus)
+ OpenAI.V1.VectorStores: type API = "vector_stores" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> ReqBody '[JSON] CreateVectorStore :> Post '[JSON] VectorStoreObject :<|> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> Get '[JSON] ListOf VectorStoreObject :<|> Capture "vector_store_id" VectorStoreID :> Get '[JSON] VectorStoreObject :<|> Capture "vector_store_id" VectorStoreID :> ReqBody '[JSON] ModifyVectorStore :> Post '[JSON] VectorStoreObject :<|> Capture "vector_store_id" VectorStoreID :> Delete '[JSON] DeletionStatus
- OpenAI.V1.VectorStores.FileBatches: type API = "vector_stores" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> (Capture "vector_store_id" VectorStoreID :> "file_batches" :> ReqBody '[JSON] CreateVectorStoreFileBatch :> Post '[JSON] VectorStoreFilesBatchObject :<|> Capture "vector_store_id" VectorStoreID :> "file_batches" :> Capture "batch_id" VectorStoreFileBatchID :> Get '[JSON] VectorStoreFilesBatchObject :<|> Capture "vector_store_id" VectorStoreID :> "file_batches" :> Capture "batch_id" VectorStoreFileBatchID :> "cancel" :> Post '[JSON] VectorStoreFilesBatchObject :<|> Capture "vector_store_id" VectorStoreID :> "file_batches" :> Capture "batch_id" VectorStoreFileBatchID :> "files" :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> QueryParam "filter" Status :> Get '[JSON] (ListOf VectorStoreFilesBatchObject))
+ OpenAI.V1.VectorStores.FileBatches: type API = "vector_stores" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> Capture "vector_store_id" VectorStoreID :> "file_batches" :> ReqBody '[JSON] CreateVectorStoreFileBatch :> Post '[JSON] VectorStoreFilesBatchObject :<|> Capture "vector_store_id" VectorStoreID :> "file_batches" :> Capture "batch_id" VectorStoreFileBatchID :> Get '[JSON] VectorStoreFilesBatchObject :<|> Capture "vector_store_id" VectorStoreID :> "file_batches" :> Capture "batch_id" VectorStoreFileBatchID :> "cancel" :> Post '[JSON] VectorStoreFilesBatchObject :<|> Capture "vector_store_id" VectorStoreID :> "file_batches" :> Capture "batch_id" VectorStoreFileBatchID :> "files" :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> QueryParam "filter" Status :> Get '[JSON] ListOf VectorStoreFilesBatchObject
- OpenAI.V1.VectorStores.Files: type API = "vector_stores" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> (Capture "vector_store_id" VectorStoreID :> "files" :> ReqBody '[JSON] CreateVectorStoreFile :> Post '[JSON] VectorStoreFileObject :<|> Capture "vector_store_id" VectorStoreID :> "files" :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> QueryParam "filter" Status :> Get '[JSON] (ListOf VectorStoreFileObject) :<|> Capture "vector_store_id" VectorStoreID :> "files" :> Capture "file_id" VectorStoreFileID :> Get '[JSON] VectorStoreFileObject :<|> Capture "vector_store_id" VectorStoreID :> "files" :> Capture "file_id" VectorStoreFileID :> Delete '[JSON] DeletionStatus)
+ OpenAI.V1.VectorStores.Files: type API = "vector_stores" :> Header' '[Required, Strict] "OpenAI-Beta" Text :> Capture "vector_store_id" VectorStoreID :> "files" :> ReqBody '[JSON] CreateVectorStoreFile :> Post '[JSON] VectorStoreFileObject :<|> Capture "vector_store_id" VectorStoreID :> "files" :> QueryParam "limit" Natural :> QueryParam "order" Order :> QueryParam "after" Text :> QueryParam "before" Text :> QueryParam "filter" Status :> Get '[JSON] ListOf VectorStoreFileObject :<|> Capture "vector_store_id" VectorStoreID :> "files" :> Capture "file_id" VectorStoreFileID :> Get '[JSON] VectorStoreFileObject :<|> Capture "vector_store_id" VectorStoreID :> "files" :> Capture "file_id" VectorStoreFileID :> Delete '[JSON] DeletionStatus

Files

CHANGELOG.md view
@@ -1,3 +1,11 @@+1.1.1:++- [Remove timeout on default `ClientEnv`](https://github.com/MercuryTechnologies/openai/pull/55)+- [`/v1/chat/completions`: Add support for Search](https://github.com/MercuryTechnologies/openai/pull/57)+- [Fix CreateSpeech JSON instances, add new voices and optional instructions field](https://github.com/MercuryTechnologies/openai/pull/58)+- [Correct `ToJSON` of `FileSearchResources`](https://github.com/MercuryTechnologies/openai/pull/49)+- [New example app for tool-calling and chat-loop](https://github.com/MercuryTechnologies/openai/pull/60)+ 1.1.0:  - BREAKING CHANGE: Fix details representations for various types [[#44](https://github.com/MercuryTechnologies/openai/pull/44)] [[#45](https://github.com/MercuryTechnologies/openai/pull/45)] [[#50](https://github.com/MercuryTechnologies/openai/pull/50)] [[#51](https://github.com/MercuryTechnologies/openai/pull/51)]
README.md view
@@ -2,7 +2,7 @@  This provides a binding to OpenAI's API using `servant` -Example usage:+## Example usage  ```haskell {-# LANGUAGE DuplicateRecordFields #-}@@ -38,4 +38,87 @@     let display Choice{ message } = Text.IO.putStrLn (messageToContent message)      traverse_ display choices+```++## Setup++### Using Nix with Flakes (Recommended)++This project uses Nix with flakes for development environment setup.++1. Ensure you have Nix with flakes enabled+2. Copy the sample environment file and configure your OpenAI API key:++```bash+# Copy the sample environment file+cp .envrc.sample .envrc+```++3. Edit the `.envrc` file and replace the placeholder API key with your actual key++4. Use direnv to automatically load the development environment:++```bash+# Install direnv if you haven't already+# macOS: brew install direnv+# Linux: your-package-manager install direnv++# Enable direnv hook in your shell+eval "$(direnv hook bash)" # or zsh, fish, etc.++# Clone the repository and enter the directory+git clone https://github.com/MercuryTechnologies/openai.git+cd openai++# Allow direnv (this will automatically load the environment)+direnv allow+```++### Manual Setup++Without Nix:++```bash+# Clone the repository+git clone https://github.com/MercuryTechnologies/openai.git+cd openai++# Build with cabal+cabal build+```++## Environment Variables++Set your OpenAI API key as an environment variable:++```bash+# Option 1: Set directly in your shell+export OPENAI_KEY="your-openai-api-key"++# Option 2: Using .envrc with direnv (recommended)+(umask 077; cp .envrc.sample .envrc)+# Edit .envrc to add your API key+direnv allow+```++The API key is needed for running the test suite and example program.++## Testing++Run the test suite:++```bash+cabal test+```++The test suite is in the `tasty/` directory with test data located in `tasty/data/`.++## Running the Example++```bash+# Make sure your API key is set (either via .envrc or export)+# If using direnv with proper .envrc setup, this happens automatically++# Build and run the example+cabal run openai-example ```
+ examples/openai-example/Main.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE NamedFieldPuns        #-}+{-# LANGUAGE OverloadedStrings     #-}+{-# LANGUAGE OverloadedLists       #-}++module Main where++import Data.Foldable (traverse_)+import OpenAI.V1+import OpenAI.V1.Chat.Completions++import qualified Data.Text as Text+import qualified Data.Text.IO as Text.IO+import qualified System.Environment as Environment++main :: IO ()+main = do+    key <- Environment.getEnv "OPENAI_KEY"++    clientEnv <- getClientEnv "https://api.openai.com"++    let Methods{ createChatCompletion } = makeMethods clientEnv (Text.pack key)++    text <- Text.IO.getLine++    ChatCompletionObject{ choices } <- createChatCompletion _CreateChatCompletion+        { messages = [ User{ content = [ Text{ text } ], name = Nothing } ]+        , model = "gpt-4o-mini"+        }++    let display Choice{ message } = Text.IO.putStrLn (messageToContent message)++    traverse_ display choices
+ examples/weather-chatbot-example/Main.hs view
@@ -0,0 +1,226 @@+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE OverloadedLists #-}+{-# LANGUAGE OverloadedStrings #-}++module Main where++import Control.Monad (foldM, when)+import Data.Aeson (Value (..), (.=))+import qualified Data.Aeson as Aeson+import qualified Data.Aeson.KeyMap as KeyMap+import qualified Data.ByteString.Lazy as ByteString.Lazy+import Data.Text (Text)+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text.Encoding+import qualified Data.Text.IO as Text.IO+import Data.Vector (Vector)+import qualified Data.Vector as Vector+import OpenAI.V1+import OpenAI.V1.Chat.Completions+import OpenAI.V1.Tool+import OpenAI.V1.ToolCall+import qualified System.Environment as Environment++-- | Mock weather data for different cities+mockWeatherData :: Text -> Text+mockWeatherData city = case Text.toLower city of+  "london" -> "London: 18°C, partly cloudy, 60% humidity, light rain expected"+  "paris" -> "Paris: 22°C, sunny, 45% humidity, clear skies"+  "tokyo" -> "Tokyo: 28°C, humid, 80% humidity, thunderstorms possible"+  "new york" -> "New York: 25°C, partly sunny, 55% humidity, pleasant weather"+  "san francisco" -> "San Francisco: 16°C, foggy, 70% humidity, typical coastal weather"+  _ -> city <> ": Weather data not available for this location. Try London, Paris, Tokyo, New York, or San Francisco."++-- | Process a weather tool call and return the result+processWeatherToolCall :: ToolCall -> IO (Message (Vector Content))+processWeatherToolCall (ToolCall_Function toolCallId function) = do+  let functionName = OpenAI.V1.ToolCall.name function+      arguments = OpenAI.V1.ToolCall.arguments function++  putStrLn $ "🔧 Processing tool call: " <> Text.unpack functionName+  putStrLn $ "   Arguments: " <> Text.unpack arguments++  -- Parse arguments to extract city name+  let weatherResult = case Aeson.decode (ByteString.Lazy.fromStrict $ Text.Encoding.encodeUtf8 arguments) of+        Just (Object obj) -> case KeyMap.lookup "city" obj of+          Just (String cityName) -> mockWeatherData cityName+          _ -> "Error: Could not parse city name from arguments"+        _ -> "Error: Invalid arguments format"++  putStrLn $ "   Result: " <> Text.unpack weatherResult+  putStrLn ""++  -- Return a Tool message with the result+  return $+    Tool+      { content = [Text weatherResult],+        tool_call_id = toolCallId+      }++-- | Define the weather tool+weatherTool :: Tool+weatherTool =+  Tool_Function $+    OpenAI.V1.Tool.Function+      { description = Just "Get current weather information for a city",+        name = "get_weather",+        parameters =+          Just $+            Aeson.object+              [ "type" .= ("object" :: Text),+                "properties"+                  .= Aeson.object+                    [ "city"+                        .= Aeson.object+                          [ "type" .= ("string" :: Text),+                            "description" .= ("The city name to get weather for" :: Text)+                          ]+                    ],+                "required" .= (["city"] :: [Text]),+                "additionalProperties" .= False+              ],+        strict = Just True+      }++-- | Convert a Message Text to Message (Vector Content)+convertMessage :: Message Text -> Message (Vector Content)+convertMessage (System {content, name}) = System {content = [Text content], name = name}+convertMessage (User {content, name}) = User {content = [Text content], name = name}+convertMessage (Assistant {assistant_content, refusal, name, assistant_audio, tool_calls}) =+  Assistant+    { assistant_content = fmap (\c -> [Text c]) assistant_content,+      refusal = refusal,+      name = name,+      assistant_audio = assistant_audio,+      tool_calls = tool_calls+    }+convertMessage (Tool {content, tool_call_id}) = Tool {content = [Text content], tool_call_id = tool_call_id}++-- | Process all tool calls in a message and return tool response messages+processToolCalls :: Vector ToolCall -> IO (Vector (Message (Vector Content)))+processToolCalls toolCalls = do+  when (not $ Vector.null toolCalls) $ do+    putStrLn $ "🤖 Processing " <> show (Vector.length toolCalls) <> " tool call(s)..."+  Vector.mapM processWeatherToolCall toolCalls++-- | Main chat loop+chatLoop :: (CreateChatCompletion -> IO ChatCompletionObject) -> Vector (Message (Vector Content)) -> IO ()+chatLoop createChatCompletion messages = do+  Text.IO.putStr "You: "+  userInput <- Text.IO.getLine++  -- Exit condition+  when (Text.toLower userInput == "quit" || Text.toLower userInput == "exit") $ do+    putStrLn "Goodbye! 👋"+    return ()++  -- Add user message to conversation+  let userMessage =+        User+          { content = [Text userInput],+            name = Nothing+          }+      updatedMessages = messages <> [userMessage]++  -- Make API call with tool support+  response <-+    createChatCompletion+      _CreateChatCompletion+        { messages = updatedMessages,+          model = "gpt-4o-mini",+          tools = Just [weatherTool],+          tool_choice = Just ToolChoiceAuto+        }++  let ChatCompletionObject {choices} = response++  -- Process each choice (usually just one)+  newMessages <- foldM (processChoice createChatCompletion) updatedMessages choices++  -- Continue the conversation+  chatLoop createChatCompletion newMessages++-- | Process a single choice, handling potential tool calls+processChoice ::+  (CreateChatCompletion -> IO ChatCompletionObject) ->+  Vector (Message (Vector Content)) ->+  Choice ->+  IO (Vector (Message (Vector Content)))+processChoice createChatCompletion messages choice = do+  let Choice {message = assistantMessage} = choice++  case assistantMessage of+    Assistant {assistant_content, tool_calls = Just toolCalls} -> do+      -- Display assistant's message if any+      case assistant_content of+        Just content -> putStrLn $ "Assistant: " <> Text.unpack content+        Nothing -> return ()++      -- Add assistant message to history+      let messagesWithAssistant = messages <> [convertMessage assistantMessage]++      -- Process tool calls+      toolResults <- processToolCalls toolCalls+      let messagesWithTools = messagesWithAssistant <> toolResults++      -- Make another API call to get the final response after tool calls+      finalResponse <-+        createChatCompletion+          _CreateChatCompletion+            { messages = messagesWithTools,+              model = "gpt-4o-mini",+              tools = Just [weatherTool],+              tool_choice = Just ToolChoiceAuto+            }++      let ChatCompletionObject {choices = finalChoices} = finalResponse++      -- Process the final response (this should not have tool calls)+      foldM processFinalChoice messagesWithTools finalChoices+    Assistant {assistant_content = Just content} -> do+      -- No tool calls, just display the response+      putStrLn $ "Assistant: " <> Text.unpack content+      return $ messages <> [convertMessage assistantMessage]+    _ -> do+      putStrLn "Assistant: (No response content)"+      return messages++-- | Process final choice after tool calls (should just be text response)+processFinalChoice :: Vector (Message (Vector Content)) -> Choice -> IO (Vector (Message (Vector Content)))+processFinalChoice messages choice = do+  let Choice {message = finalMessage} = choice+  case finalMessage of+    Assistant {assistant_content = Just content} -> do+      putStrLn $ "Assistant: " <> Text.unpack content+      return $ messages <> [convertMessage finalMessage]+    _ -> do+      putStrLn "Assistant: (Unexpected response format)"+      return messages++main :: IO ()+main = do+  putStrLn "🌤️  Weather Chatbot with Tool Calling"+  putStrLn "======================================"+  putStrLn "Ask me about the weather in different cities!"+  putStrLn "Try: 'What's the weather like in London?'"+  putStrLn "Available cities: London, Paris, Tokyo, New York, San Francisco"+  putStrLn "Type 'quit' or 'exit' to end the conversation."+  putStrLn ""++  -- Get OpenAI API key+  key <- Environment.getEnv "OPENAI_KEY"++  -- Set up client+  clientEnv <- getClientEnv "https://api.openai.com"+  let Methods {createChatCompletion} = makeMethods clientEnv (Text.pack key)++  -- Initial system message+  let systemMessage =+        System+          { content = [Text "You are a helpful weather assistant. Use the get_weather tool to provide current weather information when users ask about weather in specific cities. Be conversational and helpful."],+            name = Nothing+          }++  -- Start the chat loop+  chatLoop createChatCompletion [systemMessage]
− openai-example/Main.hs
@@ -1,33 +0,0 @@-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE NamedFieldPuns        #-}-{-# LANGUAGE OverloadedStrings     #-}-{-# LANGUAGE OverloadedLists       #-}--module Main where--import Data.Foldable (traverse_)-import OpenAI.V1-import OpenAI.V1.Chat.Completions--import qualified Data.Text as Text-import qualified Data.Text.IO as Text.IO-import qualified System.Environment as Environment--main :: IO ()-main = do-    key <- Environment.getEnv "OPENAI_KEY"--    clientEnv <- getClientEnv "https://api.openai.com"--    let Methods{ createChatCompletion } = makeMethods clientEnv (Text.pack key)--    text <- Text.IO.getLine--    ChatCompletionObject{ choices } <- createChatCompletion _CreateChatCompletion-        { messages = [ User{ content = [ Text{ text } ], name = Nothing } ]-        , model = "gpt-4o-mini"-        }--    let display Choice{ message } = Text.IO.putStrLn (messageToContent message)--    traverse_ display choices
openai.cabal view
@@ -1,6 +1,6 @@ cabal-version:      2.4 name:               openai-version:            1.1.0+version:            1.1.1 synopsis:           Servant bindings to OpenAI description:        This package provides comprehensive and type-safe bindings                     to OpenAI, providing both a Servant interface and@@ -28,6 +28,7 @@                       , containers                       , filepath                       , http-api-data+                      , http-client                       , http-client-tls                       , servant                       , servant-multipart-api@@ -113,9 +114,21 @@  executable openai-example     default-language: Haskell2010-    hs-source-dirs:   openai-example+    hs-source-dirs:   examples/openai-example     main-is:          Main.hs     build-depends:    base                     , openai                     , text+    ghc-options:      -Wall++executable weather-chatbot-example+    default-language: Haskell2010+    hs-source-dirs:   examples/weather-chatbot-example+    main-is:          Main.hs+    build-depends:    base+                    , aeson+                    , bytestring+                    , openai+                    , text+                    , vector     ghc-options:      -Wall
src/OpenAI/V1.hs view
@@ -122,6 +122,7 @@  import qualified Control.Exception as Exception import qualified Data.Text as Text+import qualified Network.HTTP.Client as HTTP.Client import qualified Network.HTTP.Client.TLS as TLS import qualified OpenAI.V1.Assistants as Assistants import qualified OpenAI.V1.Audio as Audio@@ -151,7 +152,14 @@     -> IO ClientEnv getClientEnv baseUrlText = do     baseUrl <- Client.parseBaseUrl (Text.unpack baseUrlText)-    manager <- TLS.newTlsManager++    let managerSettings = TLS.tlsManagerSettings+            { HTTP.Client.managerResponseTimeout =+                HTTP.Client.responseTimeoutNone+            }++    manager <- TLS.newTlsManagerWith managerSettings+     pure (Client.mkClientEnv manager baseUrl)  -- | Get a record of API methods after providing an API token
src/OpenAI/V1/Audio/Speech.hs view
@@ -1,4 +1,4 @@--- | @\/v1\/audio\/speech@+-- | [@\/v1\/audio\/speech@](https://platform.openai.com/docs/api-reference/audio/createSpeech) module OpenAI.V1.Audio.Speech     ( -- * Main types       CreateSpeech(..)@@ -18,7 +18,7 @@ -- -- Previews of the voices are available in the -- [Text to speech guide](https://platform.openai.com/docs/guides/text-to-speech#voice-options).-data Voice = Alloy | Echo | Fable | Onyx | Nova | Shimmer+data Voice = Alloy | Ash | Ballad | Coral | Echo | Fable | Nova | Onyx |  Sage | Shimmer     deriving stock (Bounded, Enum, Generic, Show)  instance FromJSON Voice where@@ -27,7 +27,7 @@ instance ToJSON Voice where     toJSON = genericToJSON aesonOptions --- | The format to audio in+-- | The format to generate the audio in data Format = MP3 | Opus | AAC | FLAC | WAV | PCM     deriving stock (Bounded, Enum, Generic, Show) @@ -39,18 +39,27 @@  -- | Request body for @\/v1\/audio\/speech@ data CreateSpeech = CreateSpeech-    { model :: Model-    , input :: Text+    { model :: Model -- ^ Note that only [TTS models](https://platform.openai.com/docs/models#tts) support speech synthesis.+    , input :: Text -- ^ The text to generate audio for. The maximum length is 4096 characters.     , voice :: Voice-    , response_format :: Maybe Format-    , speed :: Maybe Double+    , instructions :: Maybe Text -- ^ Instructions for the model to follow when generating the audio.+                                 -- Does not work with @tts-1@ or @tts-1-hd@ models.+    , response_format :: Maybe Format -- ^ Defaults to 'MP3'.+    , speed :: Maybe Double -- ^ Defaults to 1.0 (normal speed). Should be between 0.25 and 4.0.+                            -- Does not work with @gpt-4o-mini-tts@ model.     } deriving stock (Generic, Show)-      deriving anyclass (FromJSON, ToJSON) +instance ToJSON CreateSpeech where+    toJSON = genericToJSON aesonOptions++instance FromJSON CreateSpeech where+    parseJSON = genericParseJSON aesonOptions+ -- | Default `CreateSpeech` _CreateSpeech :: CreateSpeech _CreateSpeech = CreateSpeech-    { response_format = Nothing+    { instructions = Nothing+    , response_format = Nothing     , speed = Nothing     } 
src/OpenAI/V1/Chat/Completions.hs view
@@ -22,6 +22,9 @@     , ResponseFormat(..)     , ServiceTier(..)     , ReasoningEffort(..)+    , SearchContextSize(..)+    , UserLocation(..)+    , WebSearchOptions(..)     , FinishReason(..)     , Token(..)     , LogProbs(..)@@ -216,15 +219,73 @@ instance ToJSON ServiceTier where     toJSON = genericToJSON serviceOptions -data ReasoningEffort = Low | Medium | High+-- | Constrains effort on reasoning for reasoning models+data ReasoningEffort+    = ReasoningEffort_Low+    | ReasoningEffort_Medium+    | ReasoningEffort_High     deriving stock (Generic, Show) +reasoningEffortOptions :: Options+reasoningEffortOptions =+    aesonOptions+        { constructorTagModifier = stripPrefix "ReasoningEffort_" }+ instance FromJSON ReasoningEffort where-    parseJSON = genericParseJSON aesonOptions+    parseJSON = genericParseJSON reasoningEffortOptions  instance ToJSON ReasoningEffort where-    toJSON = genericToJSON aesonOptions+    toJSON = genericToJSON reasoningEffortOptions +-- | High level guidance for the amount of context window space to use for the+-- search+data SearchContextSize+    = SearchContextSize_Low+    | SearchContextSize_Medium+    | SearchContextSize_High+    deriving stock (Generic, Show)++instance FromJSON SearchContextSize where+    parseJSON = genericParseJSON searchContextSizeOptions++instance ToJSON SearchContextSize where+    toJSON = genericToJSON searchContextSizeOptions++-- | Approximate location parameters for the search+data UserLocation = Approximate+    { city :: Maybe Text+    , country :: Maybe Text+    , region :: Maybe Text+    , timezone :: Maybe Text+    } deriving stock (Generic, Show)++instance FromJSON UserLocation where+    parseJSON = genericParseJSON userLocationOptions++instance ToJSON UserLocation where+    toJSON = genericToJSON userLocationOptions++userLocationOptions :: Options+userLocationOptions =+    aesonOptions+        { sumEncoding =+            TaggedObject{ tagFieldName = "type", contentsFieldName = "" }++        , tagSingleConstructors = True+        }++searchContextSizeOptions :: Options+searchContextSizeOptions =+    aesonOptions+        { constructorTagModifier = stripPrefix "SearchContextSize_" }++-- | Search the web for relevant results to use in a response+data WebSearchOptions = WebSearchOptions+    { search_context_size :: Maybe SearchContextSize+    , user_location :: Maybe UserLocation+    } deriving stock (Generic, Show)+      deriving anyclass (FromJSON, ToJSON)+ -- | Request body for @\/v1\/chat\/completions@ data CreateChatCompletion = CreateChatCompletion     { messages :: Vector (Message (Vector Content))@@ -252,6 +313,7 @@     , tool_choice :: Maybe ToolChoice     , parallel_tool_calls :: Maybe Bool     , user :: Maybe Text+    , web_search_options :: Maybe WebSearchOptions     } deriving stock (Generic, Show)  instance FromJSON CreateChatCompletion where@@ -286,6 +348,7 @@     , tool_choice = Nothing     , parallel_tool_calls = Nothing     , user = Nothing+    , web_search_options = Nothing     }  -- | The reason the model stopped generating tokens
src/OpenAI/V1/ToolResources.hs view
@@ -34,7 +34,10 @@     { vector_store_ids :: Maybe (Vector FileID)     , vector_stores :: Maybe (Vector VectorStore)     } deriving stock (Generic, Show)-      deriving anyclass (FromJSON, ToJSON)+      deriving anyclass (FromJSON)++instance ToJSON FileSearchResources where+    toJSON = genericToJSON aesonOptions  -- | A set of resources that are used by the assistant's tools data ToolResources = ToolResources
tasty/Main.hs view
@@ -1,691 +1,887 @@-{-# LANGUAGE BlockArguments        #-}-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE NamedFieldPuns        #-}-{-# LANGUAGE OverloadedLists       #-}-{-# LANGUAGE OverloadedStrings     #-}-{-# LANGUAGE RecordWildCards       #-}-{-# LANGUAGE TypeApplications      #-}--{-# OPTIONS_GHC -Wno-orphans #-}--module Main where--import OpenAI.V1 (Methods(..))-import OpenAI.V1.AutoOr (AutoOr(..))-import OpenAI.V1.Audio.Transcriptions (CreateTranscription(..))-import OpenAI.V1.Audio.Translations (CreateTranslation(..))-import OpenAI.V1.Batches (BatchObject(..), CreateBatch(..))-import OpenAI.V1.Embeddings (CreateEmbeddings(..), EncodingFormat(..))-import OpenAI.V1.Files (FileObject(..), Order(..), UploadFile(..))-import OpenAI.V1.Images.Edits (CreateImageEdit(..))-import OpenAI.V1.Images.Variations (CreateImageVariation(..))-import OpenAI.V1.Message (Message(..))-import OpenAI.V1.Moderations (CreateModeration(..))-import OpenAI.V1.Threads.Messages (MessageObject(..), ModifyMessage(..))-import OpenAI.V1.Tool (Tool(..), ToolChoice(..))-import OpenAI.V1.ToolCall (ToolCall(..))-import Prelude hiding (id)--import OpenAI.V1.Assistants-    (CreateAssistant(..), ModifyAssistant(..), AssistantObject(..))-import OpenAI.V1.Audio.Speech-    (_CreateSpeech, CreateSpeech(..), Voice(..))-import OpenAI.V1.Chat.Completions-    (CreateChatCompletion(..), Modality(..))-import OpenAI.V1.FineTuning.Jobs-    (CreateFineTuningJob(..), Hyperparameters(..), JobObject(..))-import OpenAI.V1.Images.Generations-    (CreateImage(..), Quality(..), Style(..))-import OpenAI.V1.Threads-    (ModifyThread(..), Thread(..), ThreadObject(..))-import OpenAI.V1.Threads.Runs-    (CreateRun(..), ModifyRun(..), RunObject(..))-import OpenAI.V1.Uploads-    ( AddUploadPart(..)-    , CompleteUpload(..)-    , CreateUpload(..)-    , PartObject(..)-    , UploadObject(..)-    )-import OpenAI.V1.VectorStores-    ( CreateVectorStore(..)-    , ModifyVectorStore(..)-    , VectorStoreObject(..)-    )-import OpenAI.V1.VectorStores.Files-    (CreateVectorStoreFile(..), VectorStoreFileObject(..))-import OpenAI.V1.VectorStores.FileBatches-    (CreateVectorStoreFileBatch(..), VectorStoreFilesBatchObject(..))--import qualified Data.Text as Text-import qualified Network.HTTP.Client as HTTP.Client-import qualified Network.HTTP.Client.TLS as TLS-import qualified OpenAI.V1 as V1-import qualified OpenAI.V1.Chat.Completions as Completions-import qualified OpenAI.V1.Files as Files-import qualified OpenAI.V1.FineTuning.Jobs as Jobs-import qualified OpenAI.V1.Images.ResponseFormat as ResponseFormat-import qualified OpenAI.V1.Tool as Tool-import qualified OpenAI.V1.ToolCall as ToolCall-import qualified Servant.Client as Client-import qualified System.Environment as Environment-import qualified Test.Tasty as Tasty-import qualified Test.Tasty.HUnit as HUnit--main :: IO ()-main = do-    let managerSettings = TLS.tlsManagerSettings-            { HTTP.Client.managerResponseTimeout =-                HTTP.Client.responseTimeoutNone-            }--    manager <- TLS.newTlsManagerWith managerSettings--    baseUrl <- Client.parseBaseUrl "https://api.openai.com"--    let clientEnv = Client.mkClientEnv manager baseUrl--    key <- Environment.getEnv "OPENAI_KEY"--    let user = "openai Haskell package"-    let chatModel = "gpt-4o-mini"-    let reasoningModel = "o3-mini"-    let Methods{..} = V1.makeMethods clientEnv (Text.pack key)--    -- Test each format to make sure we're handling each possible content type-    -- correctly-    let speechTest format =-            HUnit.testCase ("Create speech - " <> show format) do-                _ <- createSpeech _CreateSpeech-                    { model = "tts-1"-                    , input = "Hello, world!"-                    , voice = Nova-                    , response_format = Just format-                    , speed = Just 1.0-                    }--                return ()--    let speechTests = do-            format <- [ minBound .. maxBound ]-            return (speechTest format)--    let transcriptionTest =-            HUnit.testCase "Create transcription" do-                _ <- createTranscription CreateTranscription-                    { file = "tasty/data/v1/audio/preamble.wav"-                    , model = "whisper-1"-                    , language = Just "en"-                    , prompt = Nothing-                    , temperature = Just 0-                    }--                return ()--    let translationTest =-            HUnit.testCase "Create translation" do-                _ <- createTranslation CreateTranslation-                    { file = "tasty/data/v1/audio/preamble.wav"-                    , model = "whisper-1"-                    , prompt = Nothing-                    , temperature = Just 0-                    }--                return ()--    let completionsMinimalTest =-            HUnit.testCase "Create chat completion - minimal" do-                _ <- createChatCompletion CreateChatCompletion-                    { messages =-                        [ Completions.User-                            { content = [ "Hello, world!" ], name = Nothing }-                        ]-                    , model = chatModel-                    , store = Nothing-                    , metadata = Nothing-                    , frequency_penalty = Nothing-                    , logit_bias = Nothing-                    , logprobs = Nothing-                    , top_logprobs = Nothing-                    , max_completion_tokens = Nothing-                    , n = Nothing-                    , modalities = Nothing-                    , prediction = Nothing-                    , audio = Nothing-                    , presence_penalty = Nothing-                    , reasoning_effort = Nothing-                    , response_format = Nothing-                    , seed = Nothing-                    , service_tier = Nothing-                    , stop = Nothing-                    , temperature = Nothing-                    , top_p = Nothing-                    , tools = Nothing-                    , tool_choice = Nothing-                    , parallel_tool_calls = Nothing-                    , user = Nothing-                    }--                return ()--    let completionsMinimalReasoningTest =-            HUnit.testCase "Create chat completion reasoning model - minimal" do-                _ <- createChatCompletion CreateChatCompletion-                    { messages =-                        [ Completions.User-                            { content = [ "Hello, world!" ], name = Nothing }-                        ]-                    , model = reasoningModel-                    , store = Nothing-                    , metadata = Nothing-                    , frequency_penalty = Nothing-                    , logit_bias = Nothing-                    , logprobs = Nothing-                    , top_logprobs = Nothing-                    , max_completion_tokens = Nothing-                    , n = Nothing-                    , modalities = Nothing-                    , prediction = Nothing-                    , audio = Nothing-                    , presence_penalty = Nothing-                    , reasoning_effort = Just Completions.Low-                    , response_format = Nothing-                    , seed = Nothing-                    , service_tier = Nothing-                    , stop = Nothing-                    , temperature = Nothing-                    , top_p = Nothing-                    , tools = Nothing-                    , tool_choice = Nothing-                    , parallel_tool_calls = Nothing-                    , user = Nothing-                    }--                return ()--    let completionsMaximalTest =-            HUnit.testCase "Create chat completion - maximal" do-                _ <- createChatCompletion CreateChatCompletion-                    { messages =-                        [ Completions.User-                            { content = [ "Hello, world!" ]-                            , name = Just "gabby"-                            }-                        , Completions.Assistant-                            { assistant_content = Nothing-                            , refusal = Nothing-                            , name = Just "Ada"-                            , assistant_audio = Nothing-                            , tool_calls = Just-                                [ ToolCall_Function-                                    { id = "call_bzE95mjMMFqeanfY2sL6Sdir"-                                    , function = ToolCall.Function-                                      { name = "hello"-                                      , arguments = "{}"-                                      }-                                    }-                                ]-                            }-                        , Completions.Tool-                            { content = [ "Hello, world!" ]-                            , tool_call_id = "call_bzE95mjMMFqeanfY2sL6Sdir"-                            }-                        ]-                    , model = chatModel-                    , store = Just False-                    , metadata = Nothing-                    , frequency_penalty = Just 0-                    , logit_bias = Just mempty-                    , logprobs = Just True-                    , top_logprobs = Just 1-                    , max_completion_tokens = Just 1024-                    , n = Just 1-                    , modalities = Just [ Modality_Text ]-                    , prediction = Nothing-                    , audio = Nothing-                    , presence_penalty = Just 0-                    , reasoning_effort = Nothing-                    , response_format = Just Completions.ResponseFormat_Text-                    , seed = Just 0-                    , service_tier = Just Auto-                    , stop = Just [ ">>>" ]-                    , temperature = Just 1-                    , top_p = Just 1-                    , tools = Just-                        [ Tool_Function-                            { function = Tool.Function-                              { description =-                                  Just "Use the hello command line tool"-                              , name = "hello"-                              , parameters = Nothing-                              , strict = Just False-                              }-                            }-                        ]-                    , tool_choice = Just ToolChoiceAuto-                    , parallel_tool_calls = Just True-                    , user = Just user-                    }--                return ()--    let embeddingsTest = do-            HUnit.testCase "Create embedding" do-                _ <- createEmbeddings CreateEmbeddings-                    { input = "Hello, world!"-                    , model = "text-embedding-3-small"-                    , encoding_format = Just Float-                    , dimensions = Just 1024-                    , user = Just user-                    }--                return ()--    let fineTuningTest = do-            HUnit.testCase "Fine-tuning and File operations - maximal" do-                FileObject{ id = trainingId } <- uploadFile UploadFile-                    { file =-                        "tasty/data/v1/fine_tuning/jobs/training_data.jsonl"-                    , purpose = Files.Fine_Tune-                    }--                FileObject{ id = validationId } <- uploadFile UploadFile-                    { file =-                        "tasty/data/v1/fine_tuning/jobs/validation_data.jsonl"-                    , purpose = Files.Fine_Tune-                    }--                _ <- retrieveFile trainingId--                _ <- retrieveFileContent trainingId--                _ <- listFiles (Just Files.Fine_Tune) (Just 10000) (Just Asc) Nothing--                JobObject{ id } <- createFineTuningJob CreateFineTuningJob-                    { model = "gpt-4o-mini-2024-07-18"-                    , training_file = trainingId-                    , hyperparameters = Just-                          Hyperparameters-                              { batch_size = Just Jobs.Auto-                              , learning_rate_multiplier = Just Jobs.Auto-                              , n_epochs = Just Jobs.Auto-                              }-                    , suffix = Just "haskell-openai"-                    , validation_file = Just validationId-                    , integrations = Just []-                    , seed = Just 0-                    }--                _ <- retrieveFineTuningJob id--                _ <- listFineTuningJobs Nothing (Just 20)--                _ <- listFineTuningCheckpoints id Nothing (Just 10)--                _ <- cancelFineTuning id--                _ <- listFineTuningEvents id Nothing (Just 20)--                _ <- deleteFile trainingId-                _ <- deleteFile validationId--                return ()--    let batchesTest = do-            HUnit.testCase "Batch operations" do-                FileObject{ id = requestsId } <- uploadFile UploadFile-                    { file = "tasty/data/v1/batches/requests.jsonl"-                    , purpose = Files.Batch-                    }--                BatchObject{ id } <- createBatch CreateBatch-                    { input_file_id = requestsId-                    , endpoint = "/v1/chat/completions"-                    , completion_window = "24h"-                    , metadata = Nothing-                    }--                _ <- retrieveBatch id--                _ <- listBatch Nothing (Just 20)--                _ <- cancelBatch id--                return ()--    let uploadsTest = do-            HUnit.testCase "Upload operations" do-                UploadObject{ id = cancelledId } <- createUpload CreateUpload-                    { filename = "training_data.jsonl"-                    , purpose = Files.Fine_Tune-                    , bytes = 4077-                    , mime_type = "text/jsonl"-                    }--                _ <- cancelUpload cancelledId--                UploadObject{ id } <- createUpload CreateUpload-                    { filename = "training_data.jsonl"-                    , purpose = Files.Fine_Tune-                    , bytes = 4077-                    , mime_type = "text/jsonl"-                    }--                PartObject{ id = partId0 } <- addUploadPart id AddUploadPart-                    { data_ = "tasty/data/v1/uploads/training_data0.jsonl" }--                PartObject{ id = partId1 } <- addUploadPart id AddUploadPart-                    { data_ = "tasty/data/v1/uploads/training_data1.jsonl" }--                _ <- completeUpload id CompleteUpload-                    { part_ids = [ partId0, partId1 ]-                    , md5 = Nothing-                    }--                return ()--    let createImageMinimalTest = do-            HUnit.testCase "Create image - minimal" do-                _ <- createImage CreateImage-                    { prompt = "A baby panda"-                    , model = Nothing-                    , n = Nothing-                    , quality = Nothing-                    , response_format = Nothing-                    , size = Nothing-                    , style = Nothing-                    , user = Nothing-                    }--                return ()--    let createImageMaximalTest = do-            HUnit.testCase "Create image - maximal" do-                _ <- createImage CreateImage-                    { prompt = "A baby panda"-                    , model = Just "dall-e-2"-                    , n = Just 1-                    , quality = Just Standard-                    , response_format = Just ResponseFormat.URL-                    , size = Just "1024x1024"-                    , style = Just Vivid-                    , user = Just user-                    }--                return ()--    let createImageEditMinimalTest = do-            HUnit.testCase "Create image edit - minimal" do-                _ <- createImageEdit CreateImageEdit-                    { image = "tasty/data/v1/images/image.png"-                    , prompt = "The panda should be greener"-                    , mask = Nothing-                    , model = Nothing-                    , n = Nothing-                    , size = Nothing-                    , response_format = Nothing-                    , user = Nothing-                    }--                return ()--    let createImageEditMaximalTest = do-            HUnit.testCase "Create image edit - maximal" do-                _ <- createImageEdit CreateImageEdit-                    { image = "tasty/data/v1/images/image.png"-                    , prompt = "The panda should be greener"-                    , mask = Nothing-                    , model = Just "dall-e-2"-                    , n = Just 1-                    , size = Just "1024x1024"-                    , response_format = Just ResponseFormat.URL-                    , user = Just user-                    }--                return ()--    let createImageVariationMinimalTest = do-            HUnit.testCase "Create image variation - minimal" do-                _ <- createImageVariation CreateImageVariation-                    { image = "tasty/data/v1/images/image.png"-                    , model = Nothing-                    , n = Nothing-                    , response_format = Nothing-                    , size = Nothing-                    , user = Nothing-                    }--                return ()--    let createImageVariationMaximalTest = do-            HUnit.testCase "Create image variation - maximal" do-                _ <- createImageVariation CreateImageVariation-                    { image = "tasty/data/v1/images/image.png"-                    , model = Just "dall-e-2"-                    , n = Just 1-                    , response_format = Just ResponseFormat.URL-                    , size = Just "1024x1024"-                    , user = Just user-                    }--                return ()--    let createModerationTest = do-            HUnit.testCase "Create moderation" do-                _ <- createModeration CreateModeration-                    { input = "I am going to kill you"-                    , model = Nothing-                    }--                return ()--    let assistantsTest = do-            HUnit.testCase "Assistant operations" do-                AssistantObject{ id } <- createAssistant CreateAssistant-                    { model = chatModel-                    , name = Nothing-                    , description = Nothing-                    , instructions = Nothing-                    , tools = Nothing-                    , tool_resources = Nothing-                    , metadata = Nothing-                    , temperature = Nothing-                    , top_p = Nothing-                    , response_format = Nothing-                    }--                _ <- listAssistants Nothing Nothing Nothing Nothing--                _ <- retrieveAssistant id--                _ <- modifyAssistant id ModifyAssistant-                    { model = chatModel-                    , name = Nothing-                    , description = Nothing-                    , instructions = Nothing-                    , tools = Nothing-                    , tool_resources = Nothing-                    , metadata = Nothing-                    , temperature = Nothing-                    , top_p = Nothing-                    , response_format = Nothing-                    }--                _ <- deleteAssistant id--                return ()--    let messagesTest = do-            HUnit.testCase "Message operations" do-                ThreadObject{ id = threadId } <- createThread Thread-                    { messages = Just-                        [ User-                            { content = [ "Hi, how can I help you!" ]-                            , attachments = Nothing-                            , metadata = Nothing-                            }-                        ]-                    , tool_resources = Nothing-                    , metadata = Nothing-                    }--                MessageObject{ id = messageId } <- createMessage threadId User-                    { content = [ "What is the capital of France?" ]-                    , attachments = Nothing-                    , metadata = Nothing-                    }--                _ <- retrieveMessage threadId messageId--                _ <- modifyMessage threadId messageId ModifyMessage-                    { metadata = Nothing-                    }--                _ <- deleteMessage threadId messageId--                _ <- deleteThread threadId--                return ()--    let threadsRunsStepsTest = do-            HUnit.testCase "Thread/Run/Step operations" do-                ThreadObject{ id = threadId } <- createThread Thread-                    { messages = Just-                        [ User-                            { content = [ "Hello, world!" ]-                            , attachments = Nothing-                            , metadata = Nothing-                            }-                        ]-                    , tool_resources = Nothing-                    , metadata = Nothing-                    }--                _ <- retrieveThread threadId--                _ <- modifyThread threadId ModifyThread-                    { tool_resources = Nothing-                    , metadata = Nothing-                    }--                AssistantObject{ id = assistantId } <- createAssistant CreateAssistant-                    { model = chatModel-                    , name = Nothing-                    , description = Nothing-                    , instructions = Nothing-                    , tools = Nothing-                    , tool_resources = Nothing-                    , metadata = Nothing-                    , temperature = Nothing-                    , top_p = Nothing-                    , response_format = Nothing-                    }--                RunObject{ id = runId } <- createRun threadId Nothing CreateRun-                    { assistant_id = assistantId-                    , model = Nothing-                    , instructions = Nothing-                    , additional_instructions = Nothing-                    , additional_messages = Nothing-                    , tools = Nothing-                    , metadata = Nothing-                    , temperature = Nothing-                    , top_p = Nothing-                    , max_prompt_tokens = Nothing-                    , max_completion_tokens = Nothing-                    , truncation_strategy = Nothing-                    , tool_choice = Nothing-                    , parallel_tool_calls = Nothing-                    , response_format = Nothing-                    }--                _ <- listRuns threadId Nothing Nothing Nothing Nothing--                _ <- retrieveRun threadId runId--                _ <- modifyRun threadId runId ModifyRun-                    { metadata = Nothing-                    }--                _ <- deleteThread threadId--                return ()--    let vectorStoreFilesTest = do-            HUnit.testCase "Vector store file and batch operations" do-                FileObject{ id = fileId } <- uploadFile UploadFile-                    { file = "tasty/data/v1/vector_stores/index.html"-                    , purpose = Files.Assistants-                    }--                VectorStoreObject{ id = vectorStoreId } <- createVectorStore CreateVectorStore-                    { file_ids = []-                    , name = Nothing-                    , expires_after = Nothing-                    , chunking_strategy = Nothing-                    , metadata = Nothing-                    }--                VectorStoreFileObject{ id = vectorStoreFileId } <- createVectorStoreFile vectorStoreId CreateVectorStoreFile-                    { file_id = fileId-                    , chunking_strategy = Nothing-                    }--                VectorStoreFilesBatchObject{ id = batchId } <- createVectorStoreFileBatch vectorStoreId CreateVectorStoreFileBatch-                    { file_ids = [ fileId ]-                    , chunking_strategy = Nothing-                    }--                _ <- listVectorStores Nothing Nothing Nothing Nothing--                _ <- listVectorStoreFiles vectorStoreId Nothing Nothing Nothing Nothing Nothing--                _ <- listVectorStoreFilesInABatch vectorStoreId batchId Nothing Nothing Nothing Nothing Nothing--                _ <- retrieveVectorStore vectorStoreId--                _ <- retrieveVectorStoreFile vectorStoreId vectorStoreFileId--                _ <- retrieveVectorStoreFileBatch vectorStoreId batchId--                _ <- modifyVectorStore vectorStoreId ModifyVectorStore-                    { name = Nothing-                    , expires_after = Nothing-                    , metadata = Nothing-                    }--                _ <- cancelVectorStoreFileBatch vectorStoreId batchId--                _ <- deleteVectorStoreFile vectorStoreId vectorStoreFileId--                _ <- deleteVectorStore vectorStoreId--                _ <- deleteFile fileId--                return ()--    let tests =-                speechTests-            <>  [ transcriptionTest-                , translationTest-                , completionsMinimalTest-                , completionsMinimalReasoningTest-                , completionsMaximalTest-                , embeddingsTest-                , fineTuningTest-                , batchesTest-                , uploadsTest-                , createImageMinimalTest-                , createImageMaximalTest-                , createImageEditMinimalTest-                , createImageEditMaximalTest-                , createImageVariationMinimalTest-                , createImageVariationMaximalTest-                , createModerationTest-                , assistantsTest-                , messagesTest-                , threadsRunsStepsTest-                , vectorStoreFilesTest-                ]--    Tasty.defaultMain (Tasty.testGroup "Tests" tests)+{-# LANGUAGE BlockArguments #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE OverloadedLists #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module Main where++import qualified Control.Concurrent as Concurrent+import Control.Exception (SomeException, catch)+import qualified Data.Text as Text+import qualified Network.HTTP.Client as HTTP.Client+import qualified Network.HTTP.Client.TLS as TLS+import OpenAI.V1 (Methods (..))+import qualified OpenAI.V1 as V1+import OpenAI.V1.Assistants+  ( AssistantObject (..),+    CreateAssistant (..),+    ModifyAssistant (..),+  )+import OpenAI.V1.Audio.Speech+  ( CreateSpeech (..),+    Voice (..),+    _CreateSpeech,+  )+import OpenAI.V1.Audio.Transcriptions (CreateTranscription (..))+import OpenAI.V1.Audio.Translations (CreateTranslation (..))+import OpenAI.V1.AutoOr (AutoOr (..))+import OpenAI.V1.Batches (BatchObject (..), CreateBatch (..))+import OpenAI.V1.Chat.Completions+  ( CreateChatCompletion (..),+    Modality (..),+  )+import qualified OpenAI.V1.Chat.Completions as Completions+import OpenAI.V1.Embeddings (CreateEmbeddings (..), EncodingFormat (..))+import OpenAI.V1.Files (FileObject (..), Order (..), UploadFile (..))+import qualified OpenAI.V1.Files as Files+import OpenAI.V1.FineTuning.Jobs+  ( CreateFineTuningJob (..),+    Hyperparameters (..),+    JobObject (..),+  )+import qualified OpenAI.V1.FineTuning.Jobs as Jobs+import OpenAI.V1.Images.Edits (CreateImageEdit (..))+import OpenAI.V1.Images.Generations+  ( CreateImage (..),+    Quality (..),+    Style (..),+  )+import qualified OpenAI.V1.Images.ResponseFormat as ResponseFormat+import OpenAI.V1.Images.Variations (CreateImageVariation (..))+import OpenAI.V1.Message (Message (..))+import OpenAI.V1.Moderations (CreateModeration (..))+import OpenAI.V1.Threads+  ( ModifyThread (..),+    Thread (..),+    ThreadID (..),+    ThreadObject (..),+  )+import OpenAI.V1.Threads.Messages (MessageObject (..), ModifyMessage (..))+import OpenAI.V1.Threads.Runs+  ( CreateRun (..),+    ModifyRun (..),+    RunID (..),+    RunObject (..),+    Status (..),+  )+import OpenAI.V1.Tool (Tool (..), ToolChoice (..))+import qualified OpenAI.V1.Tool as Tool+import OpenAI.V1.ToolCall (ToolCall (..))+import qualified OpenAI.V1.ToolCall as ToolCall+import OpenAI.V1.Uploads+  ( AddUploadPart (..),+    CompleteUpload (..),+    CreateUpload (..),+    PartObject (..),+    UploadObject (..),+  )+import OpenAI.V1.VectorStores+  ( CreateVectorStore (..),+    ModifyVectorStore (..),+    VectorStoreObject (..),+  )+import OpenAI.V1.VectorStores.FileBatches+  ( CreateVectorStoreFileBatch (..),+    VectorStoreFilesBatchObject (..),+  )+import OpenAI.V1.VectorStores.Files+  ( CreateVectorStoreFile (..),+    VectorStoreFileObject (..),+  )+import qualified Servant.Client as Client+import qualified System.Environment as Environment+import qualified Test.Tasty as Tasty+import qualified Test.Tasty.HUnit as HUnit+import Prelude hiding (id)++main :: IO ()+main = do+  let managerSettings =+        TLS.tlsManagerSettings+          { HTTP.Client.managerResponseTimeout =+              HTTP.Client.responseTimeoutNone+          }++  manager <- TLS.newTlsManagerWith managerSettings++  baseUrl <- Client.parseBaseUrl "https://api.openai.com"++  let clientEnv = Client.mkClientEnv manager baseUrl++  key <- Environment.getEnv "OPENAI_KEY"++  let user = "openai Haskell package"+  let chatModel = "gpt-4o-mini"+  let reasoningModel = "o3-mini"+  let ttsModel = "tts-1"+  let Methods {..} = V1.makeMethods clientEnv (Text.pack key)++  -- Test each format to make sure we're handling each possible content type+  -- correctly+  let speechTest format =+        HUnit.testCase ("Create speech - " <> show format) do+          _ <-+            createSpeech+              _CreateSpeech+                { model = ttsModel,+                  input = "Hello, world!",+                  voice = Nova,+                  response_format = Just format,+                  speed = Just 1.0+                }++          return ()++  let speechTestDefaults =+        HUnit.testCase "Create speech - defaults" do+          _ <-+            createSpeech+              _CreateSpeech+                { model = ttsModel,+                  input = "Hello, world!",+                  voice = Alloy+                }++          return ()++  let speechTests =+        speechTestDefaults : do+          format <- [minBound .. maxBound]+          return (speechTest format)++  let transcriptionTest =+        HUnit.testCase "Create transcription" do+          _ <-+            createTranscription+              CreateTranscription+                { file = "tasty/data/v1/audio/preamble.wav",+                  model = "whisper-1",+                  language = Just "en",+                  prompt = Nothing,+                  temperature = Just 0+                }++          return ()++  let translationTest =+        HUnit.testCase "Create translation" do+          _ <-+            createTranslation+              CreateTranslation+                { file = "tasty/data/v1/audio/preamble.wav",+                  model = "whisper-1",+                  prompt = Nothing,+                  temperature = Just 0+                }++          return ()++  let completionsMinimalTest =+        HUnit.testCase "Create chat completion - minimal" do+          _ <-+            createChatCompletion+              CreateChatCompletion+                { messages =+                    [ Completions.User+                        { content = ["Hello, world!"],+                          name = Nothing+                        }+                    ],+                  model = chatModel,+                  store = Nothing,+                  metadata = Nothing,+                  frequency_penalty = Nothing,+                  logit_bias = Nothing,+                  logprobs = Nothing,+                  top_logprobs = Nothing,+                  max_completion_tokens = Nothing,+                  n = Nothing,+                  modalities = Nothing,+                  prediction = Nothing,+                  audio = Nothing,+                  presence_penalty = Nothing,+                  reasoning_effort = Nothing,+                  response_format = Nothing,+                  seed = Nothing,+                  service_tier = Nothing,+                  stop = Nothing,+                  temperature = Nothing,+                  top_p = Nothing,+                  tools = Nothing,+                  tool_choice = Nothing,+                  parallel_tool_calls = Nothing,+                  user = Nothing,+                  web_search_options = Nothing+                }++          return ()++  let completionsMinimalReasoningTest =+        HUnit.testCase "Create chat completion reasoning model - minimal" do+          _ <-+            createChatCompletion+              CreateChatCompletion+                { messages =+                    [ Completions.User+                        { content = ["Hello, world!"],+                          name = Nothing+                        }+                    ],+                  model = reasoningModel,+                  store = Nothing,+                  metadata = Nothing,+                  frequency_penalty = Nothing,+                  logit_bias = Nothing,+                  logprobs = Nothing,+                  top_logprobs = Nothing,+                  max_completion_tokens = Nothing,+                  n = Nothing,+                  modalities = Nothing,+                  prediction = Nothing,+                  audio = Nothing,+                  presence_penalty = Nothing,+                  reasoning_effort = Just Completions.ReasoningEffort_Low,+                  response_format = Nothing,+                  seed = Nothing,+                  service_tier = Nothing,+                  stop = Nothing,+                  temperature = Nothing,+                  top_p = Nothing,+                  tools = Nothing,+                  tool_choice = Nothing,+                  parallel_tool_calls = Nothing,+                  user = Nothing,+                  web_search_options = Nothing+                }++          return ()++  let completionsMaximalTest =+        HUnit.testCase "Create chat completion - maximal" do+          _ <-+            createChatCompletion+              CreateChatCompletion+                { messages =+                    [ Completions.User+                        { content = ["Hello, world!"],+                          name = Just "gabby"+                        },+                      Completions.Assistant+                        { assistant_content = Nothing,+                          refusal = Nothing,+                          name = Just "Ada",+                          assistant_audio = Nothing,+                          tool_calls =+                            Just+                              [ ToolCall_Function+                                  { id = "call_bzE95mjMMFqeanfY2sL6Sdir",+                                    function =+                                      ToolCall.Function+                                        { name = "hello",+                                          arguments = "{}"+                                        }+                                  }+                              ]+                        },+                      Completions.Tool+                        { content = ["Hello, world!"],+                          tool_call_id = "call_bzE95mjMMFqeanfY2sL6Sdir"+                        }+                    ],+                  model = chatModel,+                  store = Just False,+                  metadata = Nothing,+                  frequency_penalty = Just 0,+                  logit_bias = Just mempty,+                  logprobs = Just True,+                  top_logprobs = Just 1,+                  max_completion_tokens = Just 1024,+                  n = Just 1,+                  modalities = Just [Modality_Text],+                  prediction = Nothing,+                  audio = Nothing,+                  presence_penalty = Just 0,+                  reasoning_effort = Nothing,+                  response_format = Just Completions.ResponseFormat_Text,+                  seed = Just 0,+                  service_tier = Just Auto,+                  stop = Just [">>>"],+                  temperature = Just 1,+                  top_p = Just 1,+                  tools =+                    Just+                      [ Tool_Function+                          { function =+                              Tool.Function+                                { description =+                                    Just "Use the hello command line tool",+                                  name = "hello",+                                  parameters = Nothing,+                                  strict = Just False+                                }+                          }+                      ],+                  tool_choice = Just ToolChoiceAuto,+                  parallel_tool_calls = Just True,+                  user = Just user,+                  web_search_options = Nothing+                }++          return ()++  let embeddingsTest = do+        HUnit.testCase "Create embedding" do+          _ <-+            createEmbeddings+              CreateEmbeddings+                { input = "Hello, world!",+                  model = "text-embedding-3-small",+                  encoding_format = Just Float,+                  dimensions = Just 1024,+                  user = Just user+                }++          return ()++  let fineTuningTest = do+        HUnit.testCase "Fine-tuning and File operations - maximal" do+          FileObject {id = trainingId} <-+            uploadFile+              UploadFile+                { file =+                    "tasty/data/v1/fine_tuning/jobs/training_data.jsonl",+                  purpose = Files.Fine_Tune+                }++          FileObject {id = validationId} <-+            uploadFile+              UploadFile+                { file =+                    "tasty/data/v1/fine_tuning/jobs/validation_data.jsonl",+                  purpose = Files.Fine_Tune+                }++          _ <- retrieveFile trainingId++          _ <- retrieveFileContent trainingId++          _ <- listFiles (Just Files.Fine_Tune) (Just 10000) (Just Asc) Nothing++          JobObject {id} <-+            createFineTuningJob+              CreateFineTuningJob+                { model = "gpt-4o-mini-2024-07-18",+                  training_file = trainingId,+                  hyperparameters =+                    Just+                      Hyperparameters+                        { batch_size = Just Jobs.Auto,+                          learning_rate_multiplier = Just Jobs.Auto,+                          n_epochs = Just Jobs.Auto+                        },+                  suffix = Just "haskell-openai",+                  validation_file = Just validationId,+                  integrations = Just [],+                  seed = Just 0+                }++          _ <- retrieveFineTuningJob id++          _ <- listFineTuningJobs Nothing (Just 20)++          _ <- listFineTuningCheckpoints id Nothing (Just 10)++          _ <- cancelFineTuning id++          _ <- listFineTuningEvents id Nothing (Just 20)++          _ <- deleteFile trainingId+          _ <- deleteFile validationId++          return ()++  let batchesTest = do+        HUnit.testCase "Batch operations" do+          FileObject {id = requestsId} <-+            uploadFile+              UploadFile+                { file = "tasty/data/v1/batches/requests.jsonl",+                  purpose = Files.Batch+                }++          BatchObject {id} <-+            createBatch+              CreateBatch+                { input_file_id = requestsId,+                  endpoint = "/v1/chat/completions",+                  completion_window = "24h",+                  metadata = Nothing+                }++          _ <- retrieveBatch id++          _ <- listBatch Nothing (Just 20)++          _ <- cancelBatch id++          return ()++  let uploadsTest = do+        HUnit.testCase "Upload operations" do+          UploadObject {id = cancelledId} <-+            createUpload+              CreateUpload+                { filename = "training_data.jsonl",+                  purpose = Files.Fine_Tune,+                  bytes = 4077,+                  mime_type = "text/jsonl"+                }++          _ <- cancelUpload cancelledId++          UploadObject {id} <-+            createUpload+              CreateUpload+                { filename = "training_data.jsonl",+                  purpose = Files.Fine_Tune,+                  bytes = 4077,+                  mime_type = "text/jsonl"+                }++          PartObject {id = partId0} <-+            addUploadPart+              id+              AddUploadPart+                { data_ = "tasty/data/v1/uploads/training_data0.jsonl"+                }++          PartObject {id = partId1} <-+            addUploadPart+              id+              AddUploadPart+                { data_ = "tasty/data/v1/uploads/training_data1.jsonl"+                }++          _ <-+            completeUpload+              id+              CompleteUpload+                { part_ids = [partId0, partId1],+                  md5 = Nothing+                }++          return ()++  let createImageMinimalTest = do+        HUnit.testCase "Create image - minimal" do+          _ <-+            createImage+              CreateImage+                { prompt = "A baby panda",+                  model = Nothing,+                  n = Nothing,+                  quality = Nothing,+                  response_format = Nothing,+                  size = Nothing,+                  style = Nothing,+                  user = Nothing+                }++          return ()++  let createImageMaximalTest = do+        HUnit.testCase "Create image - maximal" do+          _ <-+            createImage+              CreateImage+                { prompt = "A baby panda",+                  model = Just "dall-e-3",+                  n = Just 1,+                  quality = Just Standard,+                  response_format = Just ResponseFormat.URL,+                  size = Just "1024x1024",+                  style = Just Vivid,+                  user = Just user+                }++          return ()++  let createImageEditMinimalTest = do+        HUnit.testCase "Create image edit - minimal" do+          _ <-+            createImageEdit+              CreateImageEdit+                { image = "tasty/data/v1/images/image.png",+                  prompt = "The panda should be greener",+                  mask = Nothing,+                  model = Nothing,+                  n = Nothing,+                  size = Nothing,+                  response_format = Nothing,+                  user = Nothing+                }++          return ()++  let createImageEditMaximalTest = do+        HUnit.testCase "Create image edit - maximal" do+          _ <-+            createImageEdit+              CreateImageEdit+                { image = "tasty/data/v1/images/image.png",+                  prompt = "The panda should be greener",+                  mask = Nothing,+                  model = Just "dall-e-2",+                  n = Just 1,+                  size = Just "1024x1024",+                  response_format = Just ResponseFormat.URL,+                  user = Just user+                }++          return ()++  let createImageVariationMinimalTest = do+        HUnit.testCase "Create image variation - minimal" do+          _ <-+            createImageVariation+              CreateImageVariation+                { image = "tasty/data/v1/images/image.png",+                  model = Nothing,+                  n = Nothing,+                  response_format = Nothing,+                  size = Nothing,+                  user = Nothing+                }++          return ()++  let createImageVariationMaximalTest = do+        HUnit.testCase "Create image variation - maximal" do+          _ <-+            createImageVariation+              CreateImageVariation+                { image = "tasty/data/v1/images/image.png",+                  model = Just "dall-e-2",+                  n = Just 1,+                  response_format = Just ResponseFormat.URL,+                  size = Just "1024x1024",+                  user = Just user+                }++          return ()++  let createModerationTest = do+        HUnit.testCase "Create moderation" do+          _ <-+            createModeration+              CreateModeration+                { input = "I am going to kill you",+                  model = Nothing+                }++          return ()++  let assistantsTest = do+        HUnit.testCase "Assistant operations" do+          AssistantObject {id} <-+            createAssistant+              CreateAssistant+                { model = chatModel,+                  name = Nothing,+                  description = Nothing,+                  instructions = Nothing,+                  tools = Nothing,+                  tool_resources = Nothing,+                  metadata = Nothing,+                  temperature = Nothing,+                  top_p = Nothing,+                  response_format = Nothing+                }++          _ <- listAssistants Nothing Nothing Nothing Nothing++          _ <- retrieveAssistant id++          _ <-+            modifyAssistant+              id+              ModifyAssistant+                { model = chatModel,+                  name = Nothing,+                  description = Nothing,+                  instructions = Nothing,+                  tools = Nothing,+                  tool_resources = Nothing,+                  metadata = Nothing,+                  temperature = Nothing,+                  top_p = Nothing,+                  response_format = Nothing+                }++          _ <- deleteAssistant id++          return ()++  let messagesTest = do+        HUnit.testCase "Message operations" do+          ThreadObject {id = threadId} <-+            createThread+              Thread+                { messages =+                    Just+                      [ User+                          { content = ["Hi, how can I help you!"],+                            attachments = Nothing,+                            metadata = Nothing+                          }+                      ],+                  tool_resources = Nothing,+                  metadata = Nothing+                }++          MessageObject {id = messageId} <-+            createMessage+              threadId+              User+                { content = ["What is the capital of France?"],+                  attachments = Nothing,+                  metadata = Nothing+                }++          _ <- retrieveMessage threadId messageId++          _ <-+            modifyMessage+              threadId+              messageId+              ModifyMessage+                { metadata = Nothing+                }++          _ <- deleteMessage threadId messageId++          _ <- deleteThread threadId++          return ()++  let waitForRunCompletion :: ThreadID -> RunID -> IO ()+      waitForRunCompletion threadId runId = do+        RunObject {status} <- retrieveRun threadId runId+        case status of+          In_Progress -> do+            Concurrent.threadDelay 1000000 -- Wait 1 second+            waitForRunCompletion threadId runId+          Queued -> do+            Concurrent.threadDelay 1000000 -- Wait 1 second+            waitForRunCompletion threadId runId+          _ -> return () -- Run is completed, failed, cancelled, etc.+  let threadsRunsStepsTest = do+        HUnit.testCase "Thread/Run/Step operations" do+          ThreadObject {id = threadId} <-+            createThread+              Thread+                { messages =+                    Just+                      [ User+                          { content = ["Hello, world!"],+                            attachments = Nothing,+                            metadata = Nothing+                          }+                      ],+                  tool_resources = Nothing,+                  metadata = Nothing+                }++          _ <- retrieveThread threadId++          _ <-+            modifyThread+              threadId+              ModifyThread+                { tool_resources = Nothing,+                  metadata = Nothing+                }++          AssistantObject {id = assistantId} <-+            createAssistant+              CreateAssistant+                { model = chatModel,+                  name = Nothing,+                  description = Nothing,+                  instructions = Nothing,+                  tools = Nothing,+                  tool_resources = Nothing,+                  metadata = Nothing,+                  temperature = Nothing,+                  top_p = Nothing,+                  response_format = Nothing+                }++          RunObject {id = runId} <-+            createRun+              threadId+              Nothing+              CreateRun+                { assistant_id = assistantId,+                  model = Nothing,+                  instructions = Nothing,+                  additional_instructions = Nothing,+                  additional_messages = Nothing,+                  tools = Nothing,+                  metadata = Nothing,+                  temperature = Nothing,+                  top_p = Nothing,+                  max_prompt_tokens = Nothing,+                  max_completion_tokens = Nothing,+                  truncation_strategy = Nothing,+                  tool_choice = Nothing,+                  parallel_tool_calls = Nothing,+                  response_format = Nothing+                }++          _ <- listRuns threadId Nothing Nothing Nothing Nothing++          _ <- retrieveRun threadId runId++          -- Wait for the run to complete before trying to modify it+          waitForRunCompletion threadId runId++          _ <-+            modifyRun+              threadId+              runId+              ModifyRun+                { metadata = Nothing+                }++          _ <- deleteThread threadId++          return ()++  let vectorStoreFilesTest = do+        HUnit.testCase "Vector store file and batch operations" do+          FileObject {id = fileId} <-+            uploadFile+              UploadFile+                { file = "tasty/data/v1/vector_stores/index.html",+                  purpose = Files.Assistants+                }++          VectorStoreObject {id = vectorStoreId} <-+            createVectorStore+              CreateVectorStore+                { file_ids = [],+                  name = Nothing,+                  expires_after = Nothing,+                  chunking_strategy = Nothing,+                  metadata = Nothing+                }++          VectorStoreFileObject {id = vectorStoreFileId} <-+            createVectorStoreFile+              vectorStoreId+              CreateVectorStoreFile+                { file_id = fileId,+                  chunking_strategy = Nothing+                }++          -- Try to create vector store file batch, but handle size limit error gracefully+          batchResult <-+            ( Right+                <$> createVectorStoreFileBatch+                  vectorStoreId+                  CreateVectorStoreFileBatch+                    { file_ids = [fileId],+                      chunking_strategy = Nothing+                    }+              )+              `catch` \(e :: SomeException) -> return (Left e)++          case batchResult of+            Right (VectorStoreFilesBatchObject {id = batchId}) -> do+              _ <- listVectorStores Nothing Nothing Nothing Nothing++              _ <- listVectorStoreFiles vectorStoreId Nothing Nothing Nothing Nothing Nothing++              _ <- listVectorStoreFilesInABatch vectorStoreId batchId Nothing Nothing Nothing Nothing Nothing++              _ <- retrieveVectorStore vectorStoreId++              _ <- retrieveVectorStoreFile vectorStoreId vectorStoreFileId++              _ <- retrieveVectorStoreFileBatch vectorStoreId batchId++              _ <-+                modifyVectorStore+                  vectorStoreId+                  ModifyVectorStore+                    { name = Nothing,+                      expires_after = Nothing,+                      metadata = Nothing+                    }++              _ <- cancelVectorStoreFileBatch vectorStoreId batchId++              _ <- deleteVectorStoreFile vectorStoreId vectorStoreFileId++              _ <- deleteVectorStore vectorStoreId++              _ <- deleteFile fileId++              return ()+            Left _ -> do+              -- If batch creation fails (likely due to size limit), still test other operations+              _ <- listVectorStores Nothing Nothing Nothing Nothing++              _ <- listVectorStoreFiles vectorStoreId Nothing Nothing Nothing Nothing Nothing++              _ <- retrieveVectorStore vectorStoreId++              _ <- retrieveVectorStoreFile vectorStoreId vectorStoreFileId++              _ <-+                modifyVectorStore+                  vectorStoreId+                  ModifyVectorStore+                    { name = Nothing,+                      expires_after = Nothing,+                      metadata = Nothing+                    }++              _ <- deleteVectorStoreFile vectorStoreId vectorStoreFileId++              _ <- deleteVectorStore vectorStoreId++              _ <- deleteFile fileId++              return ()++  let tests =+        speechTests+          <> [ transcriptionTest,+               translationTest,+               completionsMinimalTest,+               completionsMinimalReasoningTest,+               completionsMaximalTest,+               embeddingsTest,+               fineTuningTest,+               batchesTest,+               uploadsTest,+               createImageMinimalTest,+               createImageMaximalTest,+               createImageEditMinimalTest,+               createImageEditMaximalTest,+               createImageVariationMinimalTest,+               createImageVariationMaximalTest,+               createModerationTest,+               assistantsTest,+               messagesTest,+               threadsRunsStepsTest,+               vectorStoreFilesTest+             ]++  Tasty.defaultMain (Tasty.testGroup "Tests" tests)