Ctrl K
ComunidadGuías…

internal/llm/chat_completion_resolver.go

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

Archivo original ↗Preguntar a KiBot
package llm

import "context"

func (fallbackLanguageModelProvider FallbackLanguageModelProvider) TextChatCompleter() (ChatCompleter, bool) {
	_, hasPrimary := ResolveTextChatCompleter(fallbackLanguageModelProvider.PrimaryProvider)
	_, hasFallback := ResolveTextChatCompleter(fallbackLanguageModelProvider.FallbackProvider)
	if !hasPrimary && !hasFallback {
		return nil, false
	}
	return fallbackLanguageModelProvider, true
}

func (fallbackLanguageModelProvider FallbackLanguageModelProvider) RecoveryChatCompleter() (RecoveryChatCompleter, bool) {
	primaryProvider, hasPrimary := adaptRecoveryChatProvider(fallbackLanguageModelProvider.PrimaryProvider)
	fallbackProvider, hasFallback := adaptRecoveryChatProvider(fallbackLanguageModelProvider.FallbackProvider)
	if !hasPrimary && !hasFallback {
		return nil, false
	}
	fallbackLanguageModelProvider.PrimaryProvider = primaryProvider
	fallbackLanguageModelProvider.FallbackProvider = fallbackProvider
	return fallbackLanguageModelProvider, true
}

func (fallbackLanguageModelProvider FallbackLanguageModelProvider) LocalRecoveryChatCompleter() (LocalRecoveryChatCompleter, bool) {
	primaryProvider, hasPrimary := adaptLocalRecoveryChatProvider(fallbackLanguageModelProvider.PrimaryProvider)
	fallbackProvider, hasFallback := adaptLocalRecoveryChatProvider(fallbackLanguageModelProvider.FallbackProvider)
	if !hasPrimary && !hasFallback {
		return nil, false
	}
	fallbackLanguageModelProvider.PrimaryProvider = primaryProvider
	fallbackLanguageModelProvider.FallbackProvider = fallbackProvider
	return fallbackLanguageModelProvider, true
}

func (provider VisionFallbackProvider) TextChatCompleter() (ChatCompleter, bool) {
	textOnlyCompleter, hasTextOnlyCompleter := ResolveTextChatCompleter(provider.TextOnlyModel)
	visionCompleter, hasVisionCompleter := ResolveTextChatCompleter(provider.VisionModel)
	if !hasTextOnlyCompleter {
		return visionCompleter, hasVisionCompleter
	}
	if !hasVisionCompleter {
		return textOnlyCompleter, true
	}
	return visionChatCompleter{textOnlyCompleter: textOnlyCompleter, visionCompleter: visionCompleter}, true
}

func (provider VisionFallbackProvider) RecoveryChatCompleter() (RecoveryChatCompleter, bool) {
	if completer, isAvailable := ResolveRecoveryChatCompleter(provider.TextOnlyModel); isAvailable {
		return completer, true
	}
	return ResolveRecoveryChatCompleter(provider.VisionModel)
}

func (provider VisionFallbackProvider) LocalRecoveryChatCompleter() (LocalRecoveryChatCompleter, bool) {
	if completer, isAvailable := ResolveLocalRecoveryChatCompleter(provider.TextOnlyModel); isAvailable {
		return completer, true
	}
	return ResolveLocalRecoveryChatCompleter(provider.VisionModel)
}

type visionChatCompleter struct {
	textOnlyCompleter ChatCompleter
	visionCompleter   ChatCompleter
}

func (completer visionChatCompleter) GenerateChatCompletion(responseContext context.Context, request ChatCompletionRequest) (ChatCompletionResponse, error) {
	if chatRequestContainsImage(request) {
		return completer.visionCompleter.GenerateChatCompletion(responseContext, request)
	}
	return completer.textOnlyCompleter.GenerateChatCompletion(responseContext, request)
}

type recoveryChatProviderAdapter struct {
	provider LanguageModelProvider
	delegate RecoveryChatCompleter
}

func (adapter recoveryChatProviderAdapter) GenerateResponse(ctx context.Context, prompt string) (string, error) {
	return adapter.provider.GenerateResponse(ctx, prompt)
}

func (adapter recoveryChatProviderAdapter) GenerateStructuredResponse(ctx context.Context, request StructuredResponseRequest) (StructuredResponse, error) {
	return adapter.provider.GenerateStructuredResponse(ctx, request)
}

func (adapter recoveryChatProviderAdapter) GenerateRecoveryChatCompletion(ctx context.Context, request ChatCompletionRequest) (ChatCompletionResponse, error) {
	return adapter.delegate.GenerateRecoveryChatCompletion(ctx, request)
}

type localRecoveryChatProviderAdapter struct {
	provider LanguageModelProvider
	delegate LocalRecoveryChatCompleter
}

func (adapter localRecoveryChatProviderAdapter) GenerateResponse(ctx context.Context, prompt string) (string, error) {
	return adapter.provider.GenerateResponse(ctx, prompt)
}

func (adapter localRecoveryChatProviderAdapter) GenerateStructuredResponse(ctx context.Context, request StructuredResponseRequest) (StructuredResponse, error) {
	return adapter.provider.GenerateStructuredResponse(ctx, request)
}

func (adapter localRecoveryChatProviderAdapter) GenerateLocalRecoveryChatCompletion(ctx context.Context, request ChatCompletionRequest) (ChatCompletionResponse, error) {
	return adapter.delegate.GenerateLocalRecoveryChatCompletion(ctx, request)
}

func adaptRecoveryChatProvider(provider LanguageModelProvider) (LanguageModelProvider, bool) {
	if provider == nil {
		return nil, false
	}
	completer, isAvailable := ResolveRecoveryChatCompleter(provider)
	if !isAvailable {
		return provider, false
	}
	return recoveryChatProviderAdapter{provider: provider, delegate: completer}, true
}

func adaptLocalRecoveryChatProvider(provider LanguageModelProvider) (LanguageModelProvider, bool) {
	if provider == nil {
		return nil, false
	}
	completer, isAvailable := ResolveLocalRecoveryChatCompleter(provider)
	if !isAvailable {
		return provider, false
	}
	return localRecoveryChatProviderAdapter{provider: provider, delegate: completer}, true
}