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
124 lines
4.7 KiB
Python
124 lines
4.7 KiB
Python
# #region AssistantToolLlmValidation [C:3] [TYPE Module] [SEMANTICS assistant, tool, llm, validation, task]
|
|
# @defgroup AssistantApi Module group.
|
|
# @BRIEF Handler for the "run_llm_validation" tool — create a validation task (policy) and trigger a run.
|
|
# @LAYER API
|
|
# @RELATION DEPENDS_ON -> [AssistantToolRegistry]
|
|
# @RELATION DEPENDS_ON -> [ValidationTaskService]
|
|
# @RELATION DEPENDS_ON -> [LLMProviderService]
|
|
# @RELATION DEPENDS_ON -> [TaskManager]
|
|
# @RATIONALE v2 replaces ad-hoc task dispatch with persistent validation tasks (policies) managed via
|
|
# ValidationTaskService. This makes validations repeatable, schedulable, and auditable.
|
|
# @REJECTED Ad-hoc task dispatch rejected — single-use tasks cannot be re-triggered, scheduled, or
|
|
# tracked across runs. Policy+Run model provides run history and aggregate status.
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from fastapi import HTTPException
|
|
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.schemas.validation import ValidationTaskCreate
|
|
from src.services.llm_provider import LLMProviderService
|
|
from src.services.validation_service import ValidationTaskService
|
|
|
|
from ._resolvers import (
|
|
_resolve_dashboard_id_entity,
|
|
_resolve_env_id,
|
|
_resolve_provider_id,
|
|
)
|
|
from ._schemas import AssistantAction
|
|
from ._tool_registry import _check_any_permission, assistant_tool
|
|
|
|
|
|
# #region handle_run_llm_validation [C:4] [TYPE Function]
|
|
# @ingroup AssistantApi
|
|
@assistant_tool(
|
|
operation="run_llm_validation",
|
|
domain="llm",
|
|
description="Create and run an LLM dashboard validation task — creates a validation policy and triggers an immediate run",
|
|
optional_entities=["dashboard_ref", "environment", "provider"],
|
|
risk_level="guarded",
|
|
requires_confirmation=False,
|
|
permission_checks=[("plugin:llm_dashboard_validation", "EXECUTE")],
|
|
)
|
|
@belief_scope("run_llm_validation")
|
|
async def handle_run_llm_validation(
|
|
intent: dict[str, Any],
|
|
current_user: User,
|
|
task_manager: TaskManager,
|
|
config_manager: ConfigManager,
|
|
db: Session,
|
|
) -> tuple[str, str | None, list[AssistantAction]]:
|
|
"""Create a validation task (policy) and trigger an immediate run."""
|
|
_check_any_permission(current_user, [("plugin:llm_dashboard_validation", "EXECUTE")])
|
|
entities = intent.get("entities", {})
|
|
env_token = entities.get("environment")
|
|
env_id = _resolve_env_id(env_token, config_manager) or _resolve_env_id(
|
|
None, config_manager
|
|
)
|
|
dashboard_id = await _resolve_dashboard_id_entity(
|
|
entities, config_manager, env_hint=env_token
|
|
)
|
|
provider_id = _resolve_provider_id(
|
|
entities.get("provider"),
|
|
db,
|
|
config_manager=config_manager,
|
|
task_key="dashboard_validation",
|
|
)
|
|
if not dashboard_id or not env_id or (not provider_id):
|
|
raise HTTPException(
|
|
status_code=422,
|
|
detail="Missing dashboard_id/environment/provider. Укажите ID/slug дашборда или окружение.",
|
|
)
|
|
|
|
# Create a validation task (policy) via ValidationTaskService
|
|
validation_svc = ValidationTaskService(
|
|
db=db, config_manager=config_manager, username=current_user.username
|
|
)
|
|
task_payload = ValidationTaskCreate(
|
|
name=f"LLM Validation - Dashboard {dashboard_id}",
|
|
environment_id=env_id,
|
|
dashboard_ids=[str(dashboard_id)],
|
|
provider_id=provider_id,
|
|
screenshot_enabled=True,
|
|
)
|
|
try:
|
|
task = validation_svc.create_task(task_payload)
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=422, detail=str(e))
|
|
logger.info(
|
|
"[AssistantToolLlmValidation] Created validation task '%s' (id=%s)",
|
|
task.name, task.id,
|
|
)
|
|
|
|
# Trigger an immediate run
|
|
try:
|
|
result = await validation_svc.trigger_run(task.id, task_manager)
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=422, detail=str(e))
|
|
spawned_task_id = result["task_id"]
|
|
logger.info(
|
|
"[AssistantToolLlmValidation] Triggered run for task '%s' spawned=%s run=%s",
|
|
task.name, spawned_task_id, result.get("run_id"),
|
|
)
|
|
|
|
return (
|
|
f"LLM-валидация запущена. task_id={spawned_task_id}",
|
|
spawned_task_id,
|
|
[
|
|
AssistantAction(type="open_task", label="Open Task", target=spawned_task_id),
|
|
AssistantAction(
|
|
type="open_reports", label="Open Reports", target="/reports"
|
|
),
|
|
],
|
|
)
|
|
|
|
|
|
# #endregion handle_run_llm_validation
|
|
# #endregion AssistantToolLlmValidation
|