Files
ss-tools/backend/src/api/routes/assistant/_tool_llm.py
busya b5e741077d feat: attention-optimized semantic protocol v2.7
Core changes:
- Add @defgroup/@ingroup to 1791 C2+ contracts (555 files) for HCA 128× pre-training DSA grouping
- Add §0.1 Pre-Training Frequency matrix to semantics-core
- Add §VIII Attention Architecture rules (ATTN_1-4) with MLA/CSA/HCA/DSA mechanics
- Add @defgroup/@ingroup to canonical syntax (§II) and all contract examples

Agent prompts (5 files):
- Add ZERO-STATE RATIONALE with MLA/CSA/HCA/DSA compression mechanics
- Add pre-training note: @RATIONALE/@REJECTED are in-context learned tags
- svelte-coder: add missing #region contract, fix Svelte rule violations
- python-coder/fullstack-coder: honor function contracts from speckit plan
- qa-tester: add attention compliance audit (P3 ATTN_1-4 checks)

Skills (6 files):
- Translate all axiom_config descriptions to English
- Fix doc_dirs to index .opencode/ and .specify/
- Deduplicate 5× complexity_rules → single global_tags catalog
- Reduce semantics-svelte 591→485 lines (remove duplicate code blocks)
- Fix semantics-testing: 'Short IDs' → 'Short hierarchical IDs'
- Fix all examples: flat IDs → hierarchical Domain.Name format
- Fix Svelte examples: replace raw Tailwind + <button> with semantic tokens + /ui

Speckit workflow (commands + templates):
- speckit.plan: add Function-Level Contracts for C3+ with @PRE/@POST/@TEST_EDGE
- speckit.plan: add Attention Compliance Gate (ATTN_1-4 before contract generation)
- speckit.tasks: add function contract inlining format (constraints in task description)
- speckit.specify: load semantics-core for spec density rules
- spec-template: add #region contract, @SEMANTICS grouping, hierarchical IDs
- ux-reference-template: add #region wrapper
- plan-template: add attention gate, @defgroup/@ingroup guidance
- tasks-template: add attention audit + rebuild + orphan check tasks
- constitution.md: translate to English, add Principle VIII (attention-optimized contracts)

Reference modules rewritten (hierarchical IDs + full contracts):
- Auth.Jwt: 6 child contracts with @RATIONALE/@REJECTED/@TEST_EDGE
- Api.Auth: 5 endpoints with @TEST_EDGE + molecular CoT markers
- Migration.Model: @defgroup Migration with 18 @ACTION + 6 @INVARIANT

Scripts:
- add_defgroup_ingroup.py: zero-risk additive @ingroup migration (1791 insertions)
- migrate_hierarchical.py: flat→hierarchical ID dry-run analysis (792 contracts)
- merge_prompts.py: merge all prompts/skills/commands into one review file

Config:
- axiom_config.yaml: 749→395 lines (-47%), English, doc_dirs include prompts
- Fix test_datasets.py import collision (rename → test_datasets_routes.py)
- Fix test_preview.py: SupersetClient→get_superset_client, AsyncMock, logger f-string
2026-06-08 16:30:59 +03:00

131 lines
4.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# #region AssistantToolLlm [C:2] [TYPE Module] [SEMANTICS assistant, tool, llm, providers, status]
# @defgroup AssistantApi Module group.
# @BRIEF Handlers for LLM operations — list providers and check LLM status.
# @LAYER API
# @RELATION DEPENDS_ON -> [AssistantToolRegistry]
# @RELATION DEPENDS_ON -> [LLMProviderService]
from __future__ import annotations
from typing import Any
from sqlalchemy.orm import Session
from src.core.config_manager import ConfigManager
from src.core.logger import belief_scope, logger
from src.core.task_manager import TaskManager
from src.schemas.auth import User
from src.services.llm_provider import LLMProviderService
from ._schemas import AssistantAction
from ._tool_registry import assistant_tool
# #region handle_list_llm_providers [C:2] [TYPE Function]
# @ingroup AssistantApi
@assistant_tool(
operation="list_llm_providers",
domain="llm",
description="List configured LLM providers with their type, model, and active status",
risk_level="safe",
requires_confirmation=False,
)
@belief_scope("list_llm_providers")
async def handle_list_llm_providers(
intent: dict[str, Any],
current_user: User,
task_manager: TaskManager,
config_manager: ConfigManager,
db: Session,
) -> tuple[str, str | None, list[AssistantAction]]:
"""List configured LLM providers."""
service = LLMProviderService(db)
providers = service.get_all_providers()
if not providers:
return ("LLM провайдеры не настроены.", None, [])
lines = ["**🤖 LLM провайдеры:**"]
for p in providers:
icon = "🟢" if p.is_active else "⚪"
model = p.default_model or "модель не указана"
lines.append(
f"{icon} **{p.name}** — {p.provider_type}"
f"\n └ Модель: {model}"
)
return (
"\n".join(lines),
None,
[
AssistantAction(
type="open_route",
label="Настройки LLM",
target="/settings/llm",
)
],
)
# #endregion handle_list_llm_providers
# #region handle_get_llm_status [C:2] [TYPE Function]
# @ingroup AssistantApi
@assistant_tool(
operation="get_llm_status",
domain="llm",
description="Check if LLM is configured and ready for dashboard validation and documentation",
risk_level="safe",
requires_confirmation=False,
)
@belief_scope("get_llm_status")
async def handle_get_llm_status(
intent: dict[str, Any],
current_user: User,
task_manager: TaskManager,
config_manager: ConfigManager,
db: Session,
) -> tuple[str, str | None, list[AssistantAction]]:
"""Check LLM configuration and readiness status."""
service = LLMProviderService(db)
providers = service.get_all_providers()
active_provider = next((p for p in providers if p.is_active), None)
lines = ["**🤖 LLM Статус:**"]
if not providers:
lines.append("❌ Провайдеры не настроены.")
return ("\n".join(lines), None, [])
lines.append(f"📊 Всего провайдеров: {len(providers)}")
lines.append(f"🟢 Активных: {len([p for p in providers if p.is_active])}")
lines.append(f"⚪ Неактивных: {len([p for p in providers if not p.is_active])}")
if active_provider:
api_key = service.get_decrypted_api_key(active_provider.id)
from src.api.routes.llm import _is_valid_runtime_api_key
key_valid = _is_valid_runtime_api_key(api_key)
lines.append(f"\n**Активный провайдер:** {active_provider.name}")
lines.append(f" └ Тип: {active_provider.provider_type}")
lines.append(f" └ Модель: {active_provider.default_model or 'не указана'}")
lines.append(f" └ API ключ: {'✅ валидный' if key_valid else '❌ невалидный/отсутствует'}")
lines.append(f" └ Статус: {'✅ готов' if key_valid else '❌ настроен не полностью'}")
return (
"\n".join(lines),
None,
[
AssistantAction(
type="open_route",
label="Настройки LLM",
target="/settings/llm",
)
],
)
# #endregion handle_get_llm_status
# #endregion AssistantToolLlm