|
|
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.""" |
|
|
|
|
|
|
|
|
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", |
|
|
"summary": "auto", |
|
|
} |
|
|
return ChatOpenAI( |
|
|
model=model_name, |
|
|
temperature=0, |
|
|
timeout=None, |
|
|
max_retries=1, |
|
|
streaming=True, |
|
|
reasoning=reasoning, |
|
|
api_key=api_keys['OPENAI_API_KEY'] |
|
|
) |
|
|
|
|
|
|
|
|
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'] |
|
|
) |
|
|
|
|
|
|
|
|
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}") |
|
|
|