File size: 3,303 Bytes
aa2d45f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70fba39
 
 
 
 
 
 
 
08959c5
70fba39
 
 
 
 
 
 
 
 
 
aa2d45f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7a75ca8
 
aa2d45f
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import support.settings as settings

from langchain_anthropic import ChatAnthropic
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_huggingface import ChatHuggingFace, HuggingFaceEndpoint
from langchain_openai import ChatOpenAI


def create_model(model_name: str, api_keys: dict):
    """Factory function to create model instances based on model name."""

    # OpenAI models
    if model_name.startswith("gpt-"):
        if model_name == "gpt-4.1-nano":
            return ChatOpenAI(
                model=model_name,
                temperature=0,
                timeout=None,
                max_retries=1,
                streaming=True,
                api_key=api_keys['OPENAI_API_KEY']
            )
        else:
            reasoning = {
                "effort": "low",  # 'low', 'medium', or 'high'
                "summary": "auto",  # 'detailed', 'auto', or None
            }
            return ChatOpenAI(
                model=model_name,
                temperature=0,
                timeout=None,
                max_retries=1,
                streaming=True,
                reasoning=reasoning,
                api_key=api_keys['OPENAI_API_KEY']
            )

    # Google models
    elif model_name.startswith("gemini-"):
        return ChatGoogleGenerativeAI(
            model=model_name,
            temperature=0,
            timeout=None,
            max_retries=1,
            streaming=True,
            include_thoughts=True,
            api_key=api_keys['GOOGLE_API_KEY']
        )

    # Anthropic models
    elif model_name.startswith("claude-"):
        if model_name in ["claude-sonnet-4-5-20250929", "claude-3-7-sonnet-20250219"]:
            return ChatAnthropic(
                model=model_name,
                temperature=1,
                timeout=None,
                max_retries=1,
                streaming=True,
                api_key=api_keys['ANTHROPIC_API_KEY'],
                thinking={"type": "enabled", "budget_tokens": 1024},
            )
        else:
            return ChatAnthropic(
                model=model_name,
                temperature=0,
                timeout=None,
                max_retries=1,
                streaming=True,
                api_key=api_keys['ANTHROPIC_API_KEY']
            )

    elif model_name in ["openai/gpt-oss-120b", "deepseek-ai/DeepSeek-V3.1", "Qwen/Qwen3-235B-A22B-Instruct-2507", "openai/gpt-oss-20b", "moonshotai/Kimi-K2-Thinking", "deepseek-ai/DeepSeek-R1"]:
        provider_dict = {
            "openai/gpt-oss-120b": "novita",
            "deepseek-ai/DeepSeek-V3.1": "novita",
            "Qwen/Qwen3-235B-A22B-Instruct-2507": "novita",
            "openai/gpt-oss-20b": "together",
            "moonshotai/Kimi-K2-Thinking": "together",
            "deepseek-ai/DeepSeek-R1": "novita"
        }

        llm = HuggingFaceEndpoint(
            repo_id=model_name,
            task="text-generation",
            provider=provider_dict[model_name],
            streaming=True,
            temperature=0,
            top_p=0,
            huggingfacehub_api_token=api_keys['HUGGINGFACEHUB_API_TOKEN'],
            max_new_tokens=1600
        )

        return ChatHuggingFace(llm=llm, verbose=True)

    else:
        raise ValueError(f"Unknown model: {model_name}")