From 1fbd29c1b06c447a04992c5e95e4f0f635b172fc Mon Sep 17 00:00:00 2001 From: vahidrezvani Date: Wed, 25 Feb 2026 11:28:14 +0330 Subject: [PATCH] add kia ai chat tools --- .api.env | 1 + src/config.py | 1 + src/services/chatbot.py | 4 ++ src/services/kiaai/__init__.py | 3 ++ src/services/kiaai/chat.py | 74 ++++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 src/services/kiaai/__init__.py create mode 100644 src/services/kiaai/chat.py diff --git a/.api.env b/.api.env index 66425ee..5f00152 100644 --- a/.api.env +++ b/.api.env @@ -27,3 +27,4 @@ PIXVERSE_API_KEY=sk-2c785f1f77ace5b4f39cb3d4dc5ef554 INTERNAL_TELEGRAM_SECRET=do8asyd0h21uodh2od2hkdmbzxc2349ASAX80scasokcu23ked2zxc LIARA_API_URL =https://ai.liara.ir/api/68eb653bb55873971e0d46d6/v1 LIARA_API_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiI2OThhZGIxMWQzODZhNWVmODNlMTg2YzAiLCJ0eXBlIjoiYWlfa2V5IiwiaWF0IjoxNzcwNzA3NzMwfQ.ckoR00Uxt8W4DmLCGW24P46Zq-et0Yhtu2xej5P0ClQ +KIA_API_KEY =7ed05fadbea55c56b43c69c2061472ac \ No newline at end of file diff --git a/src/config.py b/src/config.py index 197cc70..1cb31a2 100644 --- a/src/config.py +++ b/src/config.py @@ -33,6 +33,7 @@ class Settings(BaseSettings): internal_telegram_secret: str = getenv("INTERNAL_TELEGRAM_SECRET", "") liara_api_url: str = getenv("LIARA_API_URL", "") liara_api_key: str = getenv("LIARA_API_KEY", "") + kia_api_key: str = getenv("KIA_API_KEY", "") settings = Settings() diff --git a/src/services/chatbot.py b/src/services/chatbot.py index 1c7b133..7b5d038 100644 --- a/src/services/chatbot.py +++ b/src/services/chatbot.py @@ -30,6 +30,7 @@ from langchain_core.messages import ( ) from .database.service import DatabaseService +from .kiaai import get_kia_model from ..config import settings from ..models import Chatbot, Message, BotStatus, BotType from ..messages import MESSAGES @@ -53,6 +54,9 @@ async def web_search_tool(query: str) -> str: def get_model(model: str): + if model.startswith("kia/"): + return get_kia_model(model) + if "claude" in model: # return ChatAnthropic(model=model, api_key=settings.anthropic_api_key) return ChatOpenAI( diff --git a/src/services/kiaai/__init__.py b/src/services/kiaai/__init__.py new file mode 100644 index 0000000..5f3b141 --- /dev/null +++ b/src/services/kiaai/__init__.py @@ -0,0 +1,3 @@ +from .chat import KiaAIService, get_kia_model + +__all__ = ["KiaAIService", "get_kia_model"] diff --git a/src/services/kiaai/chat.py b/src/services/kiaai/chat.py new file mode 100644 index 0000000..3c2e64b --- /dev/null +++ b/src/services/kiaai/chat.py @@ -0,0 +1,74 @@ +from langchain_openai import ChatOpenAI + +from ...config import settings + +KIA_BASE_URL = "https://api.kie.ai" + +# Models that support reasoning_effort parameter +REASONING_MODELS = {"gpt-5-2", "claude-sonnet-4-5", "claude-opus-4-5", "gemini-3-pro", "gemini-2.5-flash","gemini-2.5-pro"} + + +class KiaAIService: + """ + Service for interacting with KIA AI models via OpenAI-compatible API. + + KIA AI endpoint pattern: + https://api.kie.ai/{modelName}/v1/chat/completions + + Usage: + service = KiaAIService() + model = service.get_model("kia/gpt-4o") + model = service.get_model("kia/o3", reasoning_effort="high") + """ + + def get_model( + self, + model: str, + reasoning_effort: str | None = None, + ) -> ChatOpenAI: + """ + Returns a LangChain-compatible ChatOpenAI model configured for KIA AI API. + + Args: + model: Model identifier with optional 'kia/' prefix + (e.g. 'kia/gpt-4o', 'kia/claude-3-5-sonnet', 'kia/o3') + reasoning_effort: Reasoning effort level for supported models. + One of: 'low', 'medium', 'high' + + Returns: + ChatOpenAI instance pointing to https://api.kie.ai/{modelName}/v1 + """ + model_name = model.removeprefix("kia/") + base_url = f"{KIA_BASE_URL}/{model_name}/v1" + + model_kwargs: dict = {} + + # Add reasoning_effort for models that support it + if reasoning_effort and model_name in REASONING_MODELS: + model_kwargs["reasoning_effort"] = reasoning_effort + + return ChatOpenAI( + model=model_name, + api_key=settings.kia_api_key, + base_url=base_url, + model_kwargs=model_kwargs, + ) + + +def get_kia_model( + model: str, + reasoning_effort: str | None = None, +) -> ChatOpenAI: + """ + Convenience function to get a KIA AI LangChain model instance. + + Args: + model: Model identifier with optional 'kia/' prefix + (e.g. 'kia/gpt-4o', 'kia/o3') + reasoning_effort: Optional reasoning effort ('low', 'medium', 'high') + + Returns: + ChatOpenAI configured for KIA AI API + """ + service = KiaAIService() + return service.get_model(model=model, reasoning_effort=reasoning_effort)