diff --git a/app/llm_client.py b/app/llm_client.py index d08b3f4..e74548f 100644 --- a/app/llm_client.py +++ b/app/llm_client.py @@ -18,24 +18,6 @@ DEFAULT_TEMPERATURE = 1.0 # Конфигурация внешних моделей MODELS: Dict[str, Dict[str, Any]] = { - "gemini-2.0-flash": { - "name": "gemini-2.0-flash", - "provider": "openai", # Изменено на "openai" - "model_name": "gemini-2.0-flash", # Добавлено имя модели для LangChain - "apiBase": "https://generativelanguage.googleapis.com/v1beta", - "apiKey": "AIzaSyDpueKFWVqknVKlQn6TdasLmJ2lvAUiBik", - "stream": True, - "capabilities": ["vision"], - }, - "gemini-2.5-flash": { - "name": "gemini-2.5-flash", - "provider": "openai", # Изменено на "openai" - "model_name": "gemini-2.5-flash", # Добавлено имя модели для LangChain - "apiBase": "https://generativelanguage.googleapis.com/v1beta", - "apiKey": "AIzaSyDpueKFWVqknVKlQn6TdasLmJ2lvAUiBik", - "stream": True, - "capabilities": ["vision"], - }, "gemini-2.0-flash-r": { "name": "gemini-2.0-flash-r", "provider": "openai", # Изменено на "openai" @@ -46,10 +28,10 @@ MODELS: Dict[str, Dict[str, Any]] = { "stream": True, "capabilities": ["vision"], }, - "gemini-2.0-flash-lite": { - "name": "google/gemini-2.0-flash-lite-001", + "gemini-2.5-flash-lite-openrouter": { + "name": "google/gemini-2.5-flash-lite", "provider": "openai", - "model_name": "google/gemini-2.0-flash-lite-001", + "model_name": "google/gemini-2.5-flash-lite", "apiBase": "https://openrouter.ai/api/v1", # Добавлено /api/v1 "apiKey": "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", @@ -82,27 +64,6 @@ MODELS: Dict[str, Dict[str, Any]] = { "include_reasoning": True } }, - "gemini-2.5-flash-bh": { - "name": "gemini-2.5-flash", - "provider": "openai", # Изменено на "openai" - "model_name": "gemini-2.5-flash", # Добавлено имя модели для LangChain - "apiBase": "https://bothub.chat/api/v2/openai/v1", - "apiKey": - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImQ3MTMwYTk0LTJiNmMtNDgzZi04Y2NiLWM5MjgwNzlmNDFlZSIsImlzRGV2ZWxvcGVyIjp0cnVlLCJpYXQiOjE3NTQ0NzYwMDcsImV4cCI6MjA3MDA1MjAwN30._64_DXNZatdd4-4VbXp8dOXdDhIlNWMQt9A_Nn6mu3g", - "stream": True, - "capabilities": ["vision"], - }, - "gemini-3-flash-preview-bh": { - "name": "gemini-3-flash-preview", - "provider": "openai", # Изменено на "openai" - "model_name": - "gemini-3-flash-preview", # Добавлено имя модели для LangChain - "apiBase": "https://bothub.chat/api/v2/openai/v1", - "apiKey": - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImQ3MTMwYTk0LTJiNmMtNDgzZi04Y2NiLWM5MjgwNzlmNDFlZSIsImlzRGV2ZWxvcGVyIjp0cnVlLCJpYXQiOjE3NTQ0NzYwMDcsImV4cCI6MjA3MDA1MjAwN30._64_DXNZatdd4-4VbXp8dOXdDhIlNWMQt9A_Nn6mu3g", - "stream": True, - "capabilities": ["vision"], - }, "gemini-3.0-flash-openrouter": { "name": "google/gemini-3-flash-preview", "provider": "openai", @@ -129,17 +90,6 @@ MODELS: Dict[str, Dict[str, Any]] = { "include_reasoning": True } }, - "gemini-3.1-pro-bh": { - "name": "gemini-3.1-pro-preview", - "provider": "openai", # Изменено на "openai" - "model_name": - "gemini-3.1-pro-preview", # Добавлено имя модели для LangChain - "apiBase": "https://bothub.chat/api/v2/openai/v1", - "apiKey": - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImQ3MTMwYTk0LTJiNmMtNDgzZi04Y2NiLWM5MjgwNzlmNDFlZSIsImlzRGV2ZWxvcGVyIjp0cnVlLCJpYXQiOjE3NTQ0NzYwMDcsImV4cCI6MjA3MDA1MjAwN30._64_DXNZatdd4-4VbXp8dOXdDhIlNWMQt9A_Nn6mu3g", - "stream": True, - "capabilities": ["vision"], - }, "claude-4.5-sonnet-bh": { "name": "claude-4.5-sonnet-bh", "provider": "openai", # Изменено на "openai" @@ -194,6 +144,19 @@ MODELS: Dict[str, Dict[str, Any]] = { "include_reasoning": True } }, + "deepseek-v4-flash-openrouter": { + "name": "deepseek/deepseek-v4-flash", + "provider": "openai", + "model_name": "deepseek/deepseek-v4-flash", + "apiBase": "https://openrouter.ai/api/v1", # Добавлено /api/v1 + "apiKey": + "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", + "stream": True, + "capabilities": ["vision", "reasoning"], + "model_kwargs": { + "include_reasoning": True + } + } } diff --git a/app/react_agent.py b/app/react_agent.py index e48f97e..eec1257 100644 --- a/app/react_agent.py +++ b/app/react_agent.py @@ -37,6 +37,8 @@ def build_react_agent(model_name: str, temperature: float, max_tokens: int, agen class PurePromptSchema(BaseModel): context: str = Field(description="Контекст, данные или текст, к которому нужно применить эту инструкцию/промпт.") +class SystemHelpSchema(BaseModel): + dummy: str = Field(default="", description="Необязательный параметр, оставь пустым.") def create_subprocess_tool(script_path: str, method_name: str, hidden_prompt: str): @@ -228,6 +230,18 @@ def get_dynamic_tools(obsidian_settings: dict): except Exception as e: print(f"❌ Ошибка генерации инструмента-скрипта '{name}': {e}") + def run_system_help(dummy: str = "") -> str: + return _generate_commands_list(custom_tools) + + help_tool = StructuredTool.from_function( + func=run_system_help, + name="show_available_commands", + description="""Используй этот инструмент, если пользователь спрашивает "Что ты умеешь?", + "Покажи help", "Какие есть команды" или просит список возможностей.""", + args_schema=SystemHelpSchema + ) + tools.append(help_tool) + return tools def _build_pydantic_schema_from_func(func) -> type[BaseModel]: @@ -275,3 +289,21 @@ def _build_pydantic_schema_from_func(func) -> type[BaseModel]: **fields ) return model + +def _generate_commands_list(custom_tools: list[dict[str, Any]]) -> str: + """ + Генерирует форматированный список доступных команд и их описаний + для использования в инструменте help. + """ + if not custom_tools: + return "В данный момент нет доступных дополнительных команд. Ты работаешь как обычный собеседник." + + lines = ["Я могу использовать следующие инструменты/команды:\n"] + for ct in custom_tools: + name = ct.get("name") + desc = ct.get("description", "Описание отсутствует") + if name: + lines.append(f"- **{name}**: {desc}") + + lines.append("\nПерескажи этот список пользователю в удобном формате.") + return "\n".join(lines) \ No newline at end of file diff --git a/app/title_generator.py b/app/title_generator.py index 1ae9f28..8967d8c 100644 --- a/app/title_generator.py +++ b/app/title_generator.py @@ -11,8 +11,8 @@ from llm_client import DEFAULT_TEMPERATURE, get_llm from langchain_core.messages import SystemMessage, HumanMessage import uuid -DEFAULT_SUMMARIZATION_LLM_NAME = "gemini-2.0-flash-lite" # "mistral-small-latest" # "mistral-small-latest" #"gemini-2.0-flash-r" -DEFAULT_VOICE_LLM_NAME = "gemini-2.0-flash-lite" # "gemini-3.0-flash-openrouter" +DEFAULT_SUMMARIZATION_LLM_NAME = "gemini-2.5-flash-lite-openrouter" # "mistral-small-latest" # "mistral-small-latest" #"gemini-2.0-flash-r" +DEFAULT_VOICE_LLM_NAME = "deepseek-v4-flash-openrouter" # "gemini-3.0-flash-openrouter" MAX_TITLE_GENERATION_CONTENT_LENGTH = 5000 # Максимальное количество символов для генерации заголовков QUEUE_POLLING_INTERVAL = 4