113 lines
3.2 KiB
Go
113 lines
3.2 KiB
Go
// Package openai ist der OpenAI-kompatible Provider-Adapter. Provider-SDK-Typen
|
|
// und das Wire-Format bleiben strikt in diesem Paket (E-02).
|
|
package openai
|
|
|
|
import "encoding/json"
|
|
|
|
type wireRequest struct {
|
|
Model string `json:"model"`
|
|
Messages []wireMessage `json:"messages"`
|
|
Tools []wireToolDef `json:"tools,omitempty"`
|
|
MaxTokens int `json:"max_tokens,omitempty"`
|
|
// MaxCompletionTokens ersetzt MaxTokens für Reasoning-Modelle (o1 & Co.):
|
|
// die OpenAI-API lehnt "max_tokens" dort ab und verlangt dieses Feld.
|
|
MaxCompletionTokens int `json:"max_completion_tokens,omitempty"`
|
|
Temperature *float64 `json:"temperature,omitempty"`
|
|
Stream bool `json:"stream"`
|
|
StreamOptions *streamOptions `json:"stream_options,omitempty"`
|
|
}
|
|
|
|
type streamOptions struct {
|
|
IncludeUsage bool `json:"include_usage"`
|
|
}
|
|
|
|
type wireMessage struct {
|
|
Role string `json:"role"`
|
|
Content json.RawMessage `json:"content,omitempty"`
|
|
ToolCalls []wireToolCall `json:"tool_calls,omitempty"`
|
|
ToolCallID string `json:"tool_call_id,omitempty"`
|
|
}
|
|
|
|
type wireToolCall struct {
|
|
ID string `json:"id"`
|
|
Type string `json:"type"`
|
|
Function wireToolCallFunc `json:"function"`
|
|
}
|
|
|
|
type wireToolCallFunc struct {
|
|
Name string `json:"name"`
|
|
Arguments string `json:"arguments"`
|
|
}
|
|
|
|
type wireToolDef struct {
|
|
Type string `json:"type"`
|
|
Function wireFunctionDef `json:"function"`
|
|
}
|
|
|
|
type wireFunctionDef struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description,omitempty"`
|
|
Parameters json.RawMessage `json:"parameters,omitempty"`
|
|
}
|
|
|
|
type wireContentPart struct {
|
|
Type string `json:"type"`
|
|
Text string `json:"text,omitempty"`
|
|
ImageURL *wireImageURL `json:"image_url,omitempty"`
|
|
}
|
|
|
|
type wireImageURL struct {
|
|
URL string `json:"url"`
|
|
}
|
|
|
|
// --- Stream chunk ---
|
|
|
|
type wireChunk struct {
|
|
Choices []wireChoice `json:"choices"`
|
|
Usage *wireUsage `json:"usage"`
|
|
}
|
|
|
|
type wireChoice struct {
|
|
Delta wireDelta `json:"delta"`
|
|
FinishReason *string `json:"finish_reason"`
|
|
}
|
|
|
|
type wireDelta struct {
|
|
Content *string `json:"content"`
|
|
ReasoningContent *string `json:"reasoning_content"`
|
|
ToolCalls []wireToolCallDelta `json:"tool_calls"`
|
|
}
|
|
|
|
type wireToolCallDelta struct {
|
|
Index int `json:"index"`
|
|
ID *string `json:"id"`
|
|
Type *string `json:"type"`
|
|
Function *wireToolCallFuncDelta `json:"function"`
|
|
}
|
|
|
|
type wireToolCallFuncDelta struct {
|
|
Name *string `json:"name"`
|
|
Arguments *string `json:"arguments"`
|
|
}
|
|
|
|
type wireUsage struct {
|
|
PromptTokens int `json:"prompt_tokens"`
|
|
CompletionTokens int `json:"completion_tokens"`
|
|
PromptTokensDetails *wireTokensDetails `json:"prompt_tokens_details"`
|
|
}
|
|
|
|
type wireTokensDetails struct {
|
|
CachedTokens int `json:"cached_tokens"`
|
|
}
|
|
|
|
// wireStreamError deckt Endpoints ab, die Fehler als SSE-Event statt als
|
|
// HTTP-Fehler senden (5.1 Punkt 7).
|
|
type wireStreamError struct {
|
|
Error *wireErrorBody `json:"error"`
|
|
}
|
|
|
|
type wireErrorBody struct {
|
|
Message string `json:"message"`
|
|
Type string `json:"type"`
|
|
Code string `json:"code"`
|
|
}
|