Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion scrapegraphai/graphs/abstract_graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from pydantic import BaseModel

from ..helpers import models_tokens
from ..models import XAI, CLoD, DeepSeek, MiniMax, Nvidia, OneApi
from ..models import XAI, CLoD, DeepSeek, MiniMax, Nvidia, OneApi, OpenRouter
from ..utils.logging import get_logger, set_verbosity_info, set_verbosity_warning

logger = get_logger(__name__)
Expand Down Expand Up @@ -172,6 +172,7 @@ def _create_llm(self, llm_config: dict) -> object:
"togetherai",
"xai",
"minimax",
"openrouter",
}

if "/" in llm_params["model"]:
Expand Down Expand Up @@ -254,6 +255,9 @@ def _create_llm(self, llm_config: dict) -> object:
if model_provider == "minimax":
return MiniMax(**llm_params)

if model_provider == "openrouter":
return OpenRouter(**llm_params)

if model_provider == "ernie":
from langchain_community.chat_models import ErnieBotChat

Expand Down
11 changes: 11 additions & 0 deletions scrapegraphai/helpers/models_tokens.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,4 +412,15 @@
"MiniMax-M2.7": 204000,
"MiniMax-M2.7-highspeed": 204000,
},
"openrouter": {
"openai/gpt-4o": 128000,
"openai/gpt-4o-mini": 128000,
"anthropic/claude-3.5-sonnet": 200000,
"anthropic/claude-3.5-haiku": 200000,
"google/gemini-2.0-flash-001": 1000000,
"meta-llama/llama-3.3-70b-instruct": 131072,
"deepseek/deepseek-chat": 128000,
"mistralai/mixtral-8x7b-instruct": 32768,
"qwen/qwen2.5-72b-instruct": 32768,
},
}
3 changes: 2 additions & 1 deletion scrapegraphai/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from .oneapi import OneApi
from .openai_itt import OpenAIImageToText
from .openai_tts import OpenAITextToSpeech
from .openrouter import OpenRouter
from .xai import XAI

__all__ = ["DeepSeek", "MiniMax", "OneApi", "OpenAIImageToText", "OpenAITextToSpeech", "CLoD", "XAI", "Nvidia"]
__all__ = ["DeepSeek", "MiniMax", "OneApi", "OpenAIImageToText", "OpenAITextToSpeech", "CLoD", "XAI", "Nvidia", "OpenRouter"]
21 changes: 21 additions & 0 deletions scrapegraphai/models/openrouter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""OpenRouter Module"""
from langchain_openai import ChatOpenAI


class OpenRouter(ChatOpenAI):
"""A wrapper for ChatOpenAI configured for OpenRouter's OpenAI-compatible API.

OpenRouter exposes hundreds of models (OpenAI, Anthropic, Google, Meta,
DeepSeek, Mistral, Qwen, ...) behind a single OpenAI-compatible endpoint.
Use it by prefixing the model with ``openrouter/`` in the graph
configuration, e.g. ``"openrouter/anthropic/claude-3.5-sonnet"``.

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://openrouter.ai/api/v1"
super().__init__(**llm_config)
27 changes: 27 additions & 0 deletions tests/test_openrouter_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""Tests for the OpenRouter model configuration."""
import importlib.util
import os


def test_openrouter_model_sets_openai_compatible_base_url():
"""OpenRouter should map api_key and set the OpenRouter base URL."""
spec = importlib.util.spec_from_file_location(
"openrouter",
os.path.join(
os.path.dirname(__file__),
"..",
"scrapegraphai",
"models",
"openrouter.py",
),
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)

model = module.OpenRouter(
api_key="test-key",
model="openrouter/anthropic/claude-3.5-sonnet",
)

assert str(model.openai_api_base).rstrip("/") == "https://openrouter.ai/api/v1"
assert model.openai_api_key == "test-key"