from esperanto import LanguageModel from langchain_core.language_models.chat_models import BaseChatModel from loguru import logger from open_notebook.ai.models import model_manager from open_notebook.utils import token_count async def provision_langchain_model( content, model_id, default_type, **kwargs ) -> BaseChatModel: """ Returns the best model to use based on the context size and on whether there is a specific model being requested in Config. If context > 105_000, returns the large_context_model If model_id is specified in Config, returns that model Otherwise, returns the default model for the given type """ tokens = token_count(content) model = None selection_reason = "" if tokens > 105_000: selection_reason = f"large_context (content has {tokens} tokens)" logger.debug( f"Using large context model because the content has {tokens} tokens" ) model = await model_manager.get_default_model("large_context", **kwargs) elif model_id: selection_reason = f"explicit model_id={model_id}" model = await model_manager.get_model(model_id, **kwargs) else: selection_reason = f"default for type={default_type}" model = await model_manager.get_default_model(default_type, **kwargs) logger.debug(f"Using model: {model}") if model is None: logger.error( f"Model provisioning failed: No model found. " f"Selection reason: {selection_reason}. " f"model_id={model_id}, default_type={default_type}. " f"Please check Settings → Models and ensure a default model is configured for '{default_type}'." ) raise ValueError( f"No model configured for {selection_reason}. " f"Please go to Settings → Models and configure a default model for '{default_type}'." ) if not isinstance(model, LanguageModel): logger.error( f"Model type mismatch: Expected LanguageModel but got {type(model).__name__}. " f"Selection reason: {selection_reason}. " f"model_id={model_id}, default_type={default_type}." ) raise ValueError( f"Model is not a LanguageModel: {model}. " f"Please check that the model configured for '{default_type}' is a language model, not an embedding or speech model." ) return model.to_langchain()