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 +8/−0
- README.md +84/−1
- examples/openai-example/Main.hs +33/−0
- examples/weather-chatbot-example/Main.hs +226/−0
- openai-example/Main.hs +0/−33
- openai.cabal +15/−2
- src/OpenAI/V1.hs +9/−1
- src/OpenAI/V1/Audio/Speech.hs +18/−9
- src/OpenAI/V1/Chat/Completions.hs +66/−3
- src/OpenAI/V1/ToolResources.hs +4/−1
- tasty/Main.hs +887/−691
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)