Ctrl K
ComunidadGuías…

internal/llm/tier_language_model_provider.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package llm

import "context"

type tierLanguageModelProvider struct {
	provider  LanguageModelProvider
	modelTier string
}

func WithModelTier(provider LanguageModelProvider, modelTier string) LanguageModelProvider {
	if provider == nil || modelTier == "" {
		return provider
	}
	base := tierLanguageModelProvider{provider: provider, modelTier: modelTier}
	_, hasRecovery := provider.(RecoveryResponder)
	_, hasLocalRecovery := provider.(LocalRecoveryResponder)
	if hasRecovery && hasLocalRecovery {
		return tierRecoveryCapabilities{base, tierRecoveryResponder{base}, tierLocalRecoveryResponder{base}}
	}
	if hasRecovery {
		return struct {
			tierLanguageModelProvider
			tierRecoveryResponder
		}{base, tierRecoveryResponder{base}}
	}
	if hasLocalRecovery {
		return struct {
			tierLanguageModelProvider
			tierLocalRecoveryResponder
		}{base, tierLocalRecoveryResponder{base}}
	}
	return base
}

func (provider tierLanguageModelProvider) GenerateResponse(responseContext context.Context, prompt string) (string, error) {
	return provider.provider.GenerateResponse(responseContext, prompt)
}

func (provider tierLanguageModelProvider) UnderlyingProvider() LanguageModelProvider {
	return provider.provider
}

func (provider tierLanguageModelProvider) GenerateStructuredResponse(responseContext context.Context, request StructuredResponseRequest) (StructuredResponse, error) {
	response, errorValue := provider.provider.GenerateStructuredResponse(responseContext, request)
	if response.ModelTier == "" {
		response.ModelTier = provider.modelTier
	}
	return response, errorValue
}

func (provider tierLanguageModelProvider) TextChatCompleter() (ChatCompleter, bool) {
	completer, isAvailable := ResolveTextChatCompleter(provider.provider)
	if !isAvailable {
		return nil, false
	}
	return tierChatCompleter{provider: provider, delegate: completer}, true
}

func (provider tierLanguageModelProvider) RecoveryChatCompleter() (RecoveryChatCompleter, bool) {
	completer, isAvailable := ResolveRecoveryChatCompleter(provider.provider)
	if !isAvailable {
		return nil, false
	}
	return tierRecoveryChatCompleter{provider: provider, delegate: completer}, true
}

func (provider tierLanguageModelProvider) LocalRecoveryChatCompleter() (LocalRecoveryChatCompleter, bool) {
	completer, isAvailable := ResolveLocalRecoveryChatCompleter(provider.provider)
	if !isAvailable {
		return nil, false
	}
	return tierLocalRecoveryChatCompleter{provider: provider, delegate: completer}, true
}

type tierRecoveryResponder struct {
	provider tierLanguageModelProvider
}

func (responder tierRecoveryResponder) GenerateRecoveryResponse(responseContext context.Context, prompt string) (string, error) {
	return responder.provider.provider.(RecoveryResponder).GenerateRecoveryResponse(responseContext, prompt)
}

type tierLocalRecoveryResponder struct {
	provider tierLanguageModelProvider
}

func (responder tierLocalRecoveryResponder) GenerateLocalRecoveryResponse(responseContext context.Context, prompt string) (string, error) {
	return responder.provider.provider.(LocalRecoveryResponder).GenerateLocalRecoveryResponse(responseContext, prompt)
}

type tierRecoveryCapabilities struct {
	tierLanguageModelProvider
	tierRecoveryResponder
	tierLocalRecoveryResponder
}

type tierChatCompleter struct {
	provider tierLanguageModelProvider
	delegate ChatCompleter
}

func (completer tierChatCompleter) GenerateChatCompletion(responseContext context.Context, request ChatCompletionRequest) (ChatCompletionResponse, error) {
	response, errorValue := completer.delegate.GenerateChatCompletion(responseContext, request)
	if response.ModelTier == "" {
		response.ModelTier = completer.provider.modelTier
	}
	return response, errorValue
}

type tierRecoveryChatCompleter struct {
	provider tierLanguageModelProvider
	delegate RecoveryChatCompleter
}

func (completer tierRecoveryChatCompleter) GenerateRecoveryChatCompletion(responseContext context.Context, request ChatCompletionRequest) (ChatCompletionResponse, error) {
	response, errorValue := completer.delegate.GenerateRecoveryChatCompletion(responseContext, request)
	if response.ModelTier == "" {
		response.ModelTier = completer.provider.modelTier
	}
	return response, errorValue
}

type tierLocalRecoveryChatCompleter struct {
	provider tierLanguageModelProvider
	delegate LocalRecoveryChatCompleter
}

func (completer tierLocalRecoveryChatCompleter) GenerateLocalRecoveryChatCompletion(responseContext context.Context, request ChatCompletionRequest) (ChatCompletionResponse, error) {
	response, errorValue := completer.delegate.GenerateLocalRecoveryChatCompletion(responseContext, request)
	if response.ModelTier == "" {
		response.ModelTier = completer.provider.modelTier
	}
	return response, errorValue
}