Help us shape the future of Go! Take the 2026 Go Developer Survey

relayconvert

package
v0.3.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 13, 2026 License: AGPL-3.0 Imports: 20 Imported by: 2

Documentation

Index

Constants

View Source
const (
	ConverterNone                            = "none"
	ConverterClaudeMessagesToOpenAIChat      = "anthropic_messages_to_openai_chat_completions"
	ConverterOpenAIChatToClaudeMessages      = "openai_chat_completions_to_anthropic_messages"
	ConverterOpenAIChatToOpenAIResponses     = "openai_chat_completions_to_openai_responses"
	ConverterOpenAIResponsesToOpenAIChat     = "openai_responses_to_openai_chat_completions"
	ConverterOpenAIResponsesToClaudeMessages = "openai_responses_to_claude_messages"
	ConverterOpenAIResponsesToGemini         = "openai_responses_to_gemini_generate_content"
	ConverterGeminiContentToOpenAIChat       = "gemini_generate_content_to_openai_chat_completions"
	ConverterOpenAIChatToGeminiContent       = "openai_chat_completions_to_gemini_generate_content"
	ConverterClaudeMessagesToOpenAIResponses = "claude_messages_to_openai_responses"
	ConverterGeminiContentToOpenAIResponses  = "gemini_generate_content_to_openai_responses"
)
View Source
const (
	ResponseConverterOAIChatToOAIResponses   = "oai_chat_to_oai_responses_resp"
	ResponseConverterOAIResponsesToOAIChat   = "oai_responses_to_oai_chat_resp"
	ResponseConverterOAIChatToClaudeMessages = "oai_chat_to_claude_messages_resp"
	ResponseConverterOAIChatToGeminiChat     = "oai_chat_to_gemini_chat_resp"
	ResponseConverterClaudeMessagesToOAIChat = "claude_messages_to_oai_chat_resp"
	ResponseConverterGeminiChatToOAIChat     = "gemini_chat_to_oai_chat_resp"
)

Variables

This section is empty.

Functions

func ApplyClaudeThinkingModel added in v0.2.0

func ApplyClaudeThinkingModel(claudeRequest *dto.ClaudeRequest, info convmeta.Meta) error

func ApplyGeminiThinkingConfigChecked added in v0.2.0

func ApplyGeminiThinkingConfigChecked(geminiRequest *dto.GeminiChatRequest, info convmeta.Meta, oaiRequest ...dto.GeneralOpenAIRequest) error

func BuildMessageDeltaPatchUsage

func BuildMessageDeltaPatchUsage(claudeResponse *dto.ClaudeResponse, claudeInfo *ClaudeResponseInfo) *dto.ClaudeUsage

func ChatCompletionsRequestToResponsesRequest

func ChatCompletionsRequestToResponsesRequest(req *dto.GeneralOpenAIRequest) (*dto.OpenAIResponsesRequest, error)

func ChatCompletionsResponseToResponsesResponse

func ChatCompletionsResponseToResponsesResponse(resp *dto.OpenAITextResponse, id string) (*dto.OpenAIResponsesResponse, *dto.Usage, error)

func ClaudeMessagesRequestToOpenAIChat

func ClaudeMessagesRequestToOpenAIChat(claudeRequest dto.ClaudeRequest, info convmeta.Meta) (*dto.GeneralOpenAIRequest, error)

func ExtractOutputTextFromResponses

func ExtractOutputTextFromResponses(resp *dto.OpenAIResponsesResponse) string

func ExtractReasoningTextFromResponses

func ExtractReasoningTextFromResponses(resp *dto.OpenAIResponsesResponse) string

func FinalizeClaudeStreamBillingUsage added in v0.2.0

func FinalizeClaudeStreamBillingUsage(claudeInfo *ClaudeResponseInfo)

func FormatClaudeResponseInfo

func FormatClaudeResponseInfo(claudeResponse *dto.ClaudeResponse, oaiResponse *dto.ChatCompletionsStreamResponse, claudeInfo *ClaudeResponseInfo) bool

func GeminiGenerateContentRequestToOpenAIChat

func GeminiGenerateContentRequestToOpenAIChat(geminiRequest *dto.GeminiChatRequest, info convmeta.Meta) (*dto.GeneralOpenAIRequest, error)

func NormalizeCacheCreationSplit

func NormalizeCacheCreationSplit(totalTokens int, tokens5m int, tokens1h int) (int, int)

func NormalizeResponsesUsage added in v0.2.0

func NormalizeResponsesUsage(src *dto.Usage) *dto.Usage

func OpenAIChatRequestToClaudeMessages

func OpenAIChatRequestToClaudeMessages(c context.Context, info convmeta.Meta, textRequest dto.GeneralOpenAIRequest) (*dto.ClaudeRequest, error)

func OpenAIChatRequestToGeminiGenerateContent

func OpenAIChatRequestToGeminiGenerateContent(c context.Context, textRequest dto.GeneralOpenAIRequest, info convmeta.Meta) (*dto.GeminiChatRequest, error)

func OpenAIResponsesRequestToClaudeMessages

func OpenAIResponsesRequestToClaudeMessages(c context.Context, info convmeta.Meta, req *dto.OpenAIResponsesRequest) (*dto.ClaudeRequest, error)

func OpenAIResponsesRequestToGeminiChat

func OpenAIResponsesRequestToGeminiChat(c context.Context, req *dto.OpenAIResponsesRequest, info convmeta.Meta) (*dto.GeminiChatRequest, error)

func PatchClaudeMessageDeltaUsageData

func PatchClaudeMessageDeltaUsageData(data string, usage *dto.ClaudeUsage) string

func ResponseClaude2OpenAI

func ResponseClaude2OpenAI(claudeResponse *dto.ClaudeResponse) *dto.OpenAITextResponse

func ResponseGeminiChat2OpenAI

func ResponseGeminiChat2OpenAI(id string, created int64, response *dto.GeminiChatResponse) *dto.OpenAITextResponse

func ResponseOpenAI2Claude

func ResponseOpenAI2Claude(openAIResponse *dto.OpenAITextResponse, info convmeta.Meta) *dto.ClaudeResponse

func ResponseOpenAI2Gemini

func ResponseOpenAI2Gemini(openAIResponse *dto.OpenAITextResponse, info convmeta.Meta) *dto.GeminiChatResponse

func ResponsesFinishReasonFromStatus

func ResponsesFinishReasonFromStatus(resp *dto.OpenAIResponsesResponse) (string, bool)

func ResponsesRequestToChatCompletionsRequest

func ResponsesRequestToChatCompletionsRequest(req *dto.OpenAIResponsesRequest) (*dto.GeneralOpenAIRequest, error)

func ResponsesResponseToChatCompletionsResponse

func ResponsesResponseToChatCompletionsResponse(resp *dto.OpenAIResponsesResponse, id string) (*dto.OpenAITextResponse, *dto.Usage, error)

func ResponsesStatusFromChatFinishReason

func ResponsesStatusFromChatFinishReason(finishReason string) (string, *dto.IncompleteDetails)

func SetMediaResolver

func SetMediaResolver(resolver MediaResolver)

func StopReasonClaudeToOpenAI

func StopReasonClaudeToOpenAI(reason string) string

func StreamResponseClaude2OpenAI

func StreamResponseClaude2OpenAI(claudeResponse *dto.ClaudeResponse) *dto.ChatCompletionsStreamResponse

func StreamResponseGeminiChat2OpenAI

func StreamResponseGeminiChat2OpenAI(geminiResponse *dto.GeminiChatResponse) (*dto.ChatCompletionsStreamResponse, bool)

func StreamResponseOpenAI2Claude

func StreamResponseOpenAI2Claude(openAIResponse *dto.ChatCompletionsStreamResponse, info convmeta.Meta) []*dto.ClaudeResponse

func StreamResponseOpenAI2Gemini

func StreamResponseOpenAI2Gemini(openAIResponse *dto.ChatCompletionsStreamResponse, info convmeta.Meta) *dto.GeminiChatResponse

func UsageFromChatUsage

func UsageFromChatUsage(src *dto.Usage) *dto.Usage

func UsageFromClaudeAPIUsage

func UsageFromClaudeAPIUsage(usage *dto.ClaudeUsage) *dto.Usage

func UsageFromClaudeUsage

func UsageFromClaudeUsage(usage *dto.Usage) *dto.Usage

func UsageFromGeminiMetadata

func UsageFromGeminiMetadata(metadata *dto.GeminiUsageMetadata, fallbackPromptTokens int) *dto.Usage

func UsageFromResponsesUsage

func UsageFromResponsesUsage(src *dto.Usage) *dto.Usage

Types

type ChatToResponsesStreamState

type ChatToResponsesStreamState = oaichat.ChatToResponsesStreamState

func NewChatToResponsesStreamState

func NewChatToResponsesStreamState(id string, model string) *ChatToResponsesStreamState

type ClaudeHostedStreamBridge added in v0.2.0

type ClaudeHostedStreamBridge struct {
	// contains filtered or unexported fields
}

ClaudeHostedStreamBridge owns Anthropic server-tool input deltas while a Claude stream is being converted to the Responses protocol.

func NewClaudeHostedStreamBridge added in v0.2.0

func NewClaudeHostedStreamBridge() *ClaudeHostedStreamBridge

func (*ClaudeHostedStreamBridge) Convert added in v0.2.0

type ClaudeResponseInfo

type ClaudeResponseInfo = claudemessages.ClaudeResponseInfo

type ClaudeToChatStreamState added in v0.2.0

type ClaudeToChatStreamState = claudemessages.ClaudeToChatStreamState

func NewClaudeToChatStreamState added in v0.2.0

func NewClaudeToChatStreamState() *ClaudeToChatStreamState

type GeminiHostedStreamBridge added in v0.2.0

type GeminiHostedStreamBridge struct {
	// contains filtered or unexported fields
}

GeminiHostedStreamBridge accumulates Gemini grounding queries until the upstream stream ends, then emits one canonical Responses web-search call.

func NewGeminiHostedStreamBridge added in v0.2.0

func NewGeminiHostedStreamBridge() *GeminiHostedStreamBridge

func (*GeminiHostedStreamBridge) Finalize added in v0.2.0

func (*GeminiHostedStreamBridge) Observe added in v0.2.0

func (b *GeminiHostedStreamBridge) Observe(response *dto.GeminiChatResponse)

type MediaResolver

type MediaResolver = relaymedia.MediaResolver

type RequestConverterFunc

type RequestConverterFunc func(c context.Context, info convmeta.Meta, request any) (any, error)

type RequestConverterQuality

type RequestConverterQuality string
const (
	RequestConverterQualityGood        RequestConverterQuality = "good"
	RequestConverterQualityFair        RequestConverterQuality = "fair"
	RequestConverterQualityDiscouraged RequestConverterQuality = "discouraged"
)

type RequestConverterSpec

type RequestConverterSpec struct {
	ID             string
	From           types.RelayFormat
	To             types.RelayFormat
	Quality        RequestConverterQuality
	Convert        RequestConverterFunc
	StepConverters []string
}

func LookupRequestConverter

func LookupRequestConverter(converter string) (RequestConverterSpec, bool)

type RequestResult

type RequestResult struct {
	Value       any
	From        types.RelayFormat
	To          types.RelayFormat
	Converter   string
	Quality     RequestConverterQuality
	Steps       []RequestStep
	Diagnostics []types.ConversionDiagnostic
}

func ConvertRequest

func ConvertRequest(c context.Context, info convmeta.Meta, target types.RelayFormat, request any) (*RequestResult, error)

func ConvertRequestByID

func ConvertRequestByID(c context.Context, info convmeta.Meta, converter string, request any) (*RequestResult, error)

func ConvertRequestVia

func ConvertRequestVia(c context.Context, info convmeta.Meta, request any, path ...types.RelayFormat) (*RequestResult, error)

type RequestStep

type RequestStep struct {
	Converter string
	From      types.RelayFormat
	To        types.RelayFormat
}

type ResponseConverterFunc

type ResponseConverterFunc func(c context.Context, info convmeta.Meta, response any) (any, *dto.Usage, error)

type ResponseConverterQuality

type ResponseConverterQuality string
const (
	ResponseConverterQualityGood        ResponseConverterQuality = "good"
	ResponseConverterQualityFair        ResponseConverterQuality = "fair"
	ResponseConverterQualityDiscouraged ResponseConverterQuality = "discouraged"
)

type ResponseConverterSpec

type ResponseConverterSpec struct {
	ID                 string
	From               types.RelayFormat
	To                 types.RelayFormat
	Quality            ResponseConverterQuality
	Convert            ResponseConverterFunc
	ConvertStream      ResponseStreamConverterFunc
	NewStreamState     ResponseStreamStateFactory
	ConvertStreamChunk ResponseStreamChunkConverterFunc
	FinalizeStream     ResponseStreamFinalizerFunc
	StepConverters     []string
}

func LookupResponseConverter

func LookupResponseConverter(converter string) (ResponseConverterSpec, bool)

type ResponseResult

type ResponseResult struct {
	Value       any
	Usage       *dto.Usage
	From        types.RelayFormat
	To          types.RelayFormat
	Converter   string
	Quality     ResponseConverterQuality
	Steps       []ResponseStep
	Stream      bool
	Diagnostics []types.ConversionDiagnostic
}

func ConvertResponse

func ConvertResponse(c context.Context, info convmeta.Meta, target types.RelayFormat, response any) (*ResponseResult, error)

func ConvertResponseByID

func ConvertResponseByID(c context.Context, info convmeta.Meta, converter string, response any) (*ResponseResult, error)

func ConvertStreamResponse

func ConvertStreamResponse(c context.Context, info convmeta.Meta, target types.RelayFormat, response any) (*ResponseResult, error)

func ConvertStreamResponseChunk

func ConvertStreamResponseChunk(c context.Context, info convmeta.Meta, state *ResponseStreamState, response any) ([]ResponseResult, error)

func FinalizeStreamResponse

func FinalizeStreamResponse(c context.Context, info convmeta.Meta, state *ResponseStreamState) ([]ResponseResult, error)

type ResponseStep

type ResponseStep struct {
	Converter string
	From      types.RelayFormat
	To        types.RelayFormat
}

type ResponseStreamChunkConverterFunc

type ResponseStreamChunkConverterFunc func(c context.Context, info convmeta.Meta, response any, state any) ([]any, *dto.Usage, error)

type ResponseStreamConverterFunc

type ResponseStreamConverterFunc func(c context.Context, info convmeta.Meta, response any) (any, *dto.Usage, error)

type ResponseStreamFinalizerFunc

type ResponseStreamFinalizerFunc func(c context.Context, info convmeta.Meta, state any) ([]any, *dto.Usage, error)

type ResponseStreamOptions

type ResponseStreamOptions struct {
	ID           string
	Model        string
	Created      int64
	IncludeUsage bool
	// EmitSequenceNumber opts into the current Responses SSE wire contract.
	// It is explicit so relaykit callers that depend on the historical zero-value
	// output are not changed merely by upgrading the module.
	EmitSequenceNumber bool
}

type ResponseStreamState

type ResponseStreamState struct {
	From      types.RelayFormat
	To        types.RelayFormat
	Converter string
	Quality   ResponseConverterQuality
	Steps     []ResponseStep
	// contains filtered or unexported fields
}

func NewResponseStreamState

func NewResponseStreamState(from types.RelayFormat, target types.RelayFormat, options ResponseStreamOptions) (*ResponseStreamState, error)

func NewResponseStreamStateByID

func NewResponseStreamStateByID(converter string, options ResponseStreamOptions) (*ResponseStreamState, error)

func (*ResponseStreamState) Diagnostics added in v0.2.0

func (s *ResponseStreamState) Diagnostics() []types.ConversionDiagnostic

Diagnostics returns every conversion-loss diagnostic observed so far. This remains available even when a source event produces no target stream chunk.

func (*ResponseStreamState) FailResponsesStream added in v0.2.0

func (s *ResponseStreamState) FailResponsesStream(code string, message string, param string) ([]ResponseResult, bool)

FailResponsesStream emits protocol-native terminal error events when the target is OpenAI Responses. It returns handled=false for other targets.

func (*ResponseStreamState) SetUsage

func (s *ResponseStreamState) SetUsage(usage *dto.Usage)

func (*ResponseStreamState) Usage

func (s *ResponseStreamState) Usage() *dto.Usage

func (*ResponseStreamState) UsageText

func (s *ResponseStreamState) UsageText() string

type ResponseStreamStateFactory

type ResponseStreamStateFactory func(options ResponseStreamOptions) any

type ResponsesBufferedAccumulator

type ResponsesBufferedAccumulator = oairesponses.ResponsesBufferedAccumulator

func NewResponsesBufferedAccumulator

func NewResponsesBufferedAccumulator() *ResponsesBufferedAccumulator

type ResponsesToChatStreamState

type ResponsesToChatStreamState = oairesponses.ResponsesToChatStreamState

func NewResponsesToChatStreamState

func NewResponsesToChatStreamState(model string, includeUsage bool) *ResponsesToChatStreamState

type TextConverterQuality

type TextConverterQuality string
const (
	TextConverterQualityGood        TextConverterQuality = "good"
	TextConverterQualityFair        TextConverterQuality = "fair"
	TextConverterQualityDiscouraged TextConverterQuality = "discouraged"
)

type TextConverterSpec

type TextConverterSpec struct {
	ID      string
	From    types.RelayFormat
	To      types.RelayFormat
	Quality TextConverterQuality
	Req     TextRequestSide
	Resp    TextResponseSide
}

func LookupTextConverter

func LookupTextConverter(converter string) (TextConverterSpec, bool)

type TextRequestSide

type TextRequestSide struct {
	Convert        RequestConverterFunc
	StepConverters []string
}

type TextResponseSide

type TextResponseSide struct {
	Convert            ResponseConverterFunc
	ConvertStream      ResponseStreamConverterFunc
	NewStreamState     ResponseStreamStateFactory
	ConvertStreamChunk ResponseStreamChunkConverterFunc
	FinalizeStream     ResponseStreamFinalizerFunc
	StepConverters     []string
	Aliases            []string
}

Directories

Path Synopsis
Package convmeta defines the conversion-context contract between format converters (future relaykit) and the hosting application.
Package convmeta defines the conversion-context contract between format converters (future relaykit) and the hosting application.
internal
Package kitutil holds the dependency-free helpers shared by the conversion kit packages (dto, types, relayconvert).
Package kitutil holds the dependency-free helpers shared by the conversion kit packages (dto, types, relayconvert).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL