179 lines
5.6 KiB
Go
179 lines
5.6 KiB
Go
package openai
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
// https://learn.microsoft.com/en-us/azure/ai-services/openai/api-version-deprecation#latest-preview-api-releases
|
|
AzureApiVersion = "2024-10-21"
|
|
BaseHost = "api.openai.com"
|
|
OpenAI_Endpoint = "https://api.openai.com/v1/chat/completions"
|
|
Github_Marketplace = "https://models.inference.ai.azure.com/chat/completions"
|
|
)
|
|
|
|
var (
|
|
Custom_Endpoint string
|
|
AIGateWay_Endpoint string // "https://gateway.ai.cloudflare.com/v1/431ba10f11200d544922fbca177aaa7f/openai/openai/chat/completions"
|
|
)
|
|
|
|
func init() {
|
|
if os.Getenv("OpenAI_Endpoint") != "" {
|
|
Custom_Endpoint = os.Getenv("OpenAI_Endpoint")
|
|
}
|
|
if os.Getenv("AIGateWay_Endpoint") != "" {
|
|
AIGateWay_Endpoint = os.Getenv("AIGateWay_Endpoint")
|
|
}
|
|
}
|
|
|
|
// Vision Content
|
|
type VisionContent struct {
|
|
Type string `json:"type,omitempty"`
|
|
Text string `json:"text,omitempty"`
|
|
ImageURL *VisionImageURL `json:"image_url,omitempty"`
|
|
}
|
|
type VisionImageURL struct {
|
|
URL string `json:"url,omitempty"`
|
|
Detail string `json:"detail,omitempty"`
|
|
}
|
|
|
|
type ChatCompletionMessage struct {
|
|
Role string `json:"role"`
|
|
Content any `json:"content"`
|
|
Name string `json:"name,omitempty"`
|
|
// MultiContent []VisionContent
|
|
}
|
|
|
|
type FunctionDefinition struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description,omitempty"`
|
|
Parameters any `json:"parameters"`
|
|
}
|
|
|
|
type Tool struct {
|
|
Type string `json:"type"`
|
|
Function *FunctionDefinition `json:"function,omitempty"`
|
|
}
|
|
|
|
type StreamOption struct {
|
|
IncludeUsage bool `json:"include_usage,omitempty"`
|
|
}
|
|
|
|
type ChatCompletionRequest struct {
|
|
Model string `json:"model"`
|
|
Messages []ChatCompletionMessage `json:"messages"`
|
|
MaxTokens int `json:"max_tokens,omitempty"`
|
|
Temperature float64 `json:"temperature,omitempty"`
|
|
TopP float64 `json:"top_p,omitempty"`
|
|
N int `json:"n,omitempty"`
|
|
Stream bool `json:"stream"`
|
|
Stop []string `json:"stop,omitempty"`
|
|
PresencePenalty float64 `json:"presence_penalty,omitempty"`
|
|
FrequencyPenalty float64 `json:"frequency_penalty,omitempty"`
|
|
LogitBias map[string]int `json:"logit_bias,omitempty"`
|
|
User string `json:"user,omitempty"`
|
|
// Functions []FunctionDefinition `json:"functions,omitempty"`
|
|
// FunctionCall any `json:"function_call,omitempty"`
|
|
Tools []Tool `json:"tools,omitempty"`
|
|
ParallelToolCalls bool `json:"parallel_tool_calls,omitempty"`
|
|
// ToolChoice any `json:"tool_choice,omitempty"`
|
|
StreamOptions *StreamOption `json:"stream_options,omitempty"`
|
|
}
|
|
|
|
func (c ChatCompletionRequest) ToByteJson() []byte {
|
|
bytejson, _ := json.Marshal(c)
|
|
return bytejson
|
|
}
|
|
|
|
type ToolCall struct {
|
|
ID string `json:"id"`
|
|
Type string `json:"type"`
|
|
Function struct {
|
|
Name string `json:"name"`
|
|
Arguments string `json:"arguments"`
|
|
} `json:"function"`
|
|
}
|
|
|
|
type ChatCompletionResponse struct {
|
|
ID string `json:"id,omitempty"`
|
|
Object string `json:"object,omitempty"`
|
|
Created int `json:"created,omitempty"`
|
|
Model string `json:"model,omitempty"`
|
|
Choices []struct {
|
|
Index int `json:"index,omitempty"`
|
|
Message struct {
|
|
Role string `json:"role,omitempty"`
|
|
Content string `json:"content,omitempty"`
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
|
|
} `json:"message,omitempty"`
|
|
Logprobs string `json:"logprobs,omitempty"`
|
|
FinishReason string `json:"finish_reason,omitempty"`
|
|
} `json:"choices,omitempty"`
|
|
Usage struct {
|
|
PromptTokens int `json:"prompt_tokens,omitempty"`
|
|
CompletionTokens int `json:"completion_tokens,omitempty"`
|
|
TotalTokens int `json:"total_tokens,omitempty"`
|
|
PromptTokensDetails struct {
|
|
CachedTokens int `json:"cached_tokens,omitempty"`
|
|
AudioTokens int `json:"audio_tokens,omitempty"`
|
|
} `json:"prompt_tokens_details,omitempty"`
|
|
CompletionTokensDetails struct {
|
|
ReasoningTokens int `json:"reasoning_tokens,omitempty"`
|
|
AudioTokens int `json:"audio_tokens,omitempty"`
|
|
AcceptedPredictionTokens int `json:"accepted_prediction_tokens,omitempty"`
|
|
RejectedPredictionTokens int `json:"rejected_prediction_tokens,omitempty"`
|
|
} `json:"completion_tokens_details,omitempty"`
|
|
} `json:"usage,omitempty"`
|
|
SystemFingerprint string `json:"system_fingerprint,omitempty"`
|
|
}
|
|
|
|
type Choice struct {
|
|
Index int `json:"index"`
|
|
Delta struct {
|
|
Role string `json:"role"`
|
|
Content string `json:"content"`
|
|
ToolCalls []ToolCall `json:"tool_calls"`
|
|
} `json:"delta"`
|
|
FinishReason string `json:"finish_reason"`
|
|
Usage struct {
|
|
PromptTokens int `json:"prompt_tokens"`
|
|
CompletionTokens int `json:"completion_tokens"`
|
|
TotalTokens int `json:"total_tokens"`
|
|
} `json:"usage"`
|
|
}
|
|
|
|
type ChatCompletionStreamResponse struct {
|
|
ID string `json:"id"`
|
|
Object string `json:"object"`
|
|
Created int `json:"created"`
|
|
Model string `json:"model"`
|
|
Choices []Choice `json:"choices"`
|
|
}
|
|
|
|
func (c *ChatCompletionStreamResponse) ByteJson() []byte {
|
|
bytejson, _ := json.Marshal(c)
|
|
return bytejson
|
|
}
|
|
|
|
func modelmap(in string) string {
|
|
// gpt-3.5-turbo -> gpt-35-turbo
|
|
if strings.Contains(in, ".") {
|
|
return strings.ReplaceAll(in, ".", "")
|
|
}
|
|
return in
|
|
}
|
|
|
|
type ErrResponse struct {
|
|
Error struct {
|
|
Message string `json:"message"`
|
|
Code string `json:"code"`
|
|
} `json:"error"`
|
|
}
|
|
|
|
func (e *ErrResponse) ByteJson() []byte {
|
|
bytejson, _ := json.Marshal(e)
|
|
return bytejson
|
|
}
|