diff --git a/scrapegraphai/helpers/models_tokens.py b/scrapegraphai/helpers/models_tokens.py index e64b1225b..5a81ecaa7 100644 --- a/scrapegraphai/helpers/models_tokens.py +++ b/scrapegraphai/helpers/models_tokens.py @@ -348,6 +348,10 @@ "deepseek-ai/deepseek-v4-pro": 1048576, "qwen/qwen3.5-flash": 1000000, }, + "cheaperinference": { + "gpt-5.4-mini": 400000, + "gpt-5.4": 1000000, + }, "deepseek": { "deepseek-chat": 128000, "deepseek-coder": 128000, diff --git a/scrapegraphai/models/__init__.py b/scrapegraphai/models/__init__.py index 1cbf0e06d..db01cd2e4 100644 --- a/scrapegraphai/models/__init__.py +++ b/scrapegraphai/models/__init__.py @@ -3,6 +3,7 @@ """ from .atlascloud import AtlasCloud +from .cheaperinference import CheaperInference from .clod import CLoD from .deepseek import DeepSeek from .minimax import MiniMax @@ -12,4 +13,4 @@ from .openai_tts import OpenAITextToSpeech from .xai import XAI -__all__ = ["AtlasCloud", "DeepSeek", "MiniMax", "OneApi", "OpenAIImageToText", "OpenAITextToSpeech", "CLoD", "XAI", "Nvidia"] +__all__ = ["AtlasCloud", "CheaperInference", "DeepSeek", "MiniMax", "OneApi", "OpenAIImageToText", "OpenAITextToSpeech", "CLoD", "XAI", "Nvidia"] diff --git a/scrapegraphai/models/cheaperinference.py b/scrapegraphai/models/cheaperinference.py new file mode 100644 index 000000000..423d2cfec --- /dev/null +++ b/scrapegraphai/models/cheaperinference.py @@ -0,0 +1,22 @@ +""" +Cheaper Inference Module +""" + +from langchain_openai import ChatOpenAI + + +class CheaperInference(ChatOpenAI): + """ + A wrapper for ChatOpenAI configured for Cheaper Inference's OpenAI-compatible + LLM API. Each model costs 15–60% less than the list price of its lab. + + Args: + llm_config (dict): Configuration parameters for the language model. + """ + + def __init__(self, **llm_config): + if "api_key" in llm_config: + llm_config["openai_api_key"] = llm_config.pop("api_key") + llm_config["openai_api_base"] = "https://api.cheaperinference.com/v1" + + super().__init__(**llm_config) diff --git a/tests/test_cheaperinference_model.py b/tests/test_cheaperinference_model.py new file mode 100644 index 000000000..ba9413ec8 --- /dev/null +++ b/tests/test_cheaperinference_model.py @@ -0,0 +1,50 @@ +"""Tests for Cheaper Inference model configuration.""" + +import importlib.util +import os + + +def test_cheaperinference_model_sets_openai_compatible_base_url(): + """CheaperInference should map api_key and set its base URL.""" + spec = importlib.util.spec_from_file_location( + "cheaperinference", + os.path.join( + os.path.dirname(__file__), + "..", + "scrapegraphai", + "models", + "cheaperinference.py", + ), + ) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + model = module.CheaperInference( + api_key="test-key", + model="gpt-5.4-mini", + ) + + assert ( + str(model.openai_api_base).rstrip("/") == "https://api.cheaperinference.com/v1" + ) + assert model.openai_api_key.get_secret_value() == "test-key" + + +def test_cheaperinference_models_in_token_list(): + """Cheaper Inference defaults should be listed with current context lengths.""" + spec = importlib.util.spec_from_file_location( + "models_tokens", + os.path.join( + os.path.dirname(__file__), + "..", + "scrapegraphai", + "helpers", + "models_tokens.py", + ), + ) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + cheaperinference_models = module.models_tokens["cheaperinference"] + assert cheaperinference_models["gpt-5.4-mini"] == 400000 + assert cheaperinference_models["gpt-5.4"] == 1000000