Add help command

This commit is contained in:
dimitrievgs 2026-06-03 22:45:36 +03:00
parent f637c6e3c4
commit d3449bb50d
3 changed files with 50 additions and 55 deletions

View File

@ -18,24 +18,6 @@ DEFAULT_TEMPERATURE = 1.0
# Конфигурация внешних моделей # Конфигурация внешних моделей
MODELS: Dict[str, Dict[str, Any]] = { 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": { "gemini-2.0-flash-r": {
"name": "gemini-2.0-flash-r", "name": "gemini-2.0-flash-r",
"provider": "openai", # Изменено на "openai" "provider": "openai", # Изменено на "openai"
@ -46,10 +28,10 @@ MODELS: Dict[str, Dict[str, Any]] = {
"stream": True, "stream": True,
"capabilities": ["vision"], "capabilities": ["vision"],
}, },
"gemini-2.0-flash-lite": { "gemini-2.5-flash-lite-openrouter": {
"name": "google/gemini-2.0-flash-lite-001", "name": "google/gemini-2.5-flash-lite",
"provider": "openai", "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 "apiBase": "https://openrouter.ai/api/v1", # Добавлено /api/v1
"apiKey": "apiKey":
"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", "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",
@ -82,27 +64,6 @@ MODELS: Dict[str, Dict[str, Any]] = {
"include_reasoning": True "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": { "gemini-3.0-flash-openrouter": {
"name": "google/gemini-3-flash-preview", "name": "google/gemini-3-flash-preview",
"provider": "openai", "provider": "openai",
@ -129,17 +90,6 @@ MODELS: Dict[str, Dict[str, Any]] = {
"include_reasoning": True "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": { "claude-4.5-sonnet-bh": {
"name": "claude-4.5-sonnet-bh", "name": "claude-4.5-sonnet-bh",
"provider": "openai", # Изменено на "openai" "provider": "openai", # Изменено на "openai"
@ -194,6 +144,19 @@ MODELS: Dict[str, Dict[str, Any]] = {
"include_reasoning": True "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
}
}
} }

View File

@ -37,6 +37,8 @@ def build_react_agent(model_name: str, temperature: float, max_tokens: int, agen
class PurePromptSchema(BaseModel): class PurePromptSchema(BaseModel):
context: str = Field(description="Контекст, данные или текст, к которому нужно применить эту инструкцию/промпт.") context: str = Field(description="Контекст, данные или текст, к которому нужно применить эту инструкцию/промпт.")
class SystemHelpSchema(BaseModel):
dummy: str = Field(default="", description="Необязательный параметр, оставь пустым.")
def create_subprocess_tool(script_path: str, method_name: str, def create_subprocess_tool(script_path: str, method_name: str,
hidden_prompt: str): hidden_prompt: str):
@ -228,6 +230,18 @@ def get_dynamic_tools(obsidian_settings: dict):
except Exception as e: except Exception as e:
print(f"❌ Ошибка генерации инструмента-скрипта '{name}': {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 return tools
def _build_pydantic_schema_from_func(func) -> type[BaseModel]: def _build_pydantic_schema_from_func(func) -> type[BaseModel]:
@ -275,3 +289,21 @@ def _build_pydantic_schema_from_func(func) -> type[BaseModel]:
**fields **fields
) )
return model 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)

View File

@ -11,8 +11,8 @@ from llm_client import DEFAULT_TEMPERATURE, get_llm
from langchain_core.messages import SystemMessage, HumanMessage from langchain_core.messages import SystemMessage, HumanMessage
import uuid import uuid
DEFAULT_SUMMARIZATION_LLM_NAME = "gemini-2.0-flash-lite" # "mistral-small-latest" # "mistral-small-latest" #"gemini-2.0-flash-r" 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 = "gemini-2.0-flash-lite" # "gemini-3.0-flash-openrouter" DEFAULT_VOICE_LLM_NAME = "deepseek-v4-flash-openrouter" # "gemini-3.0-flash-openrouter"
MAX_TITLE_GENERATION_CONTENT_LENGTH = 5000 # Максимальное количество символов для генерации заголовков MAX_TITLE_GENERATION_CONTENT_LENGTH = 5000 # Максимальное количество символов для генерации заголовков
QUEUE_POLLING_INTERVAL = 4 QUEUE_POLLING_INTERVAL = 4