Фиксируем состояние
This commit is contained in:
@@ -4,6 +4,7 @@ from dataclasses import dataclass
|
||||
|
||||
from app.modules.rag.code_qa_pipeline.evidence_gate import EvidenceGateDecision
|
||||
from app.modules.rag.intent_router_v2.models import IntentRouterResult
|
||||
from app.modules.agent.code_qa_runtime.short_answer_formatter import CodeQaShortAnswerFormatter
|
||||
|
||||
|
||||
@dataclass(slots=True, frozen=True)
|
||||
@@ -16,6 +17,9 @@ class CodeQaPolicyDecision:
|
||||
|
||||
|
||||
class CodeQaAnswerPolicy:
|
||||
def __init__(self, formatter: CodeQaShortAnswerFormatter | None = None) -> None:
|
||||
self._formatter = formatter or CodeQaShortAnswerFormatter()
|
||||
|
||||
def decide(
|
||||
self,
|
||||
*,
|
||||
@@ -29,34 +33,39 @@ class CodeQaAnswerPolicy:
|
||||
target = path_scope[0] if path_scope else "запрошенный файл"
|
||||
return CodeQaPolicyDecision(
|
||||
answer_mode="not_found",
|
||||
answer=f"Файл {target} не найден.",
|
||||
answer=self._formatter.open_file_not_found(target),
|
||||
should_call_llm=False,
|
||||
branch="open_file_not_found",
|
||||
reason="path_scope_empty",
|
||||
)
|
||||
if sub_intent == "EXPLAIN" and symbol_resolution.status in {"not_found", "ambiguous"}:
|
||||
if sub_intent == "EXPLAIN" and symbol_resolution.status == "not_found":
|
||||
return CodeQaPolicyDecision(
|
||||
answer_mode="degraded",
|
||||
answer=self._symbol_message(symbol_resolution.status, symbol_resolution.alternatives),
|
||||
answer_mode="not_found",
|
||||
answer=self._formatter.entity_not_found(self._target_label(router_result), symbol_resolution.alternatives),
|
||||
should_call_llm=False,
|
||||
branch="explain_unresolved_symbol",
|
||||
reason=f"symbol_resolution_{symbol_resolution.status}",
|
||||
branch="explain_not_found",
|
||||
reason="symbol_resolution_not_found",
|
||||
)
|
||||
if sub_intent == "EXPLAIN" and symbol_resolution.status == "ambiguous":
|
||||
return CodeQaPolicyDecision(
|
||||
answer_mode="ambiguous",
|
||||
answer=self._formatter.entity_ambiguous(self._target_label(router_result), symbol_resolution.alternatives),
|
||||
should_call_llm=False,
|
||||
branch="explain_ambiguous_symbol",
|
||||
reason="symbol_resolution_ambiguous",
|
||||
)
|
||||
if not gate_decision.passed:
|
||||
answer_mode = "insufficient" if "insufficient_evidence" in gate_decision.failure_reasons else "degraded"
|
||||
reason = gate_decision.failure_reasons[0] if gate_decision.failure_reasons else "evidence_gate_failed"
|
||||
return CodeQaPolicyDecision(
|
||||
answer_mode=answer_mode,
|
||||
answer=gate_decision.degraded_message,
|
||||
answer=self._formatter.insufficient(gate_decision.degraded_message),
|
||||
should_call_llm=False,
|
||||
branch="evidence_gate_short_circuit",
|
||||
reason=reason,
|
||||
)
|
||||
return CodeQaPolicyDecision(answer_mode="normal", branch="normal_answer", reason="evidence_sufficient")
|
||||
|
||||
def _symbol_message(self, status: str, alternatives: list[str]) -> str:
|
||||
if status == "ambiguous" and alternatives:
|
||||
return f"Сущность не удалось однозначно разрешить. Близкие варианты: {', '.join(alternatives[:3])}."
|
||||
if alternatives:
|
||||
return f"Сущность не найдена в доступном коде. Ближайшие варианты: {', '.join(alternatives[:3])}."
|
||||
return "Сущность не найдена в доступном коде."
|
||||
def _target_label(self, router_result: IntentRouterResult) -> str:
|
||||
candidates = [item.strip() for item in list(router_result.query_plan.symbol_candidates or []) if item and item.strip()]
|
||||
return candidates[0] if candidates else "запрошенная сущность"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from difflib import SequenceMatcher
|
||||
from time import perf_counter
|
||||
|
||||
from app.modules.agent.code_qa_runtime.answer_policy import CodeQaAnswerPolicy
|
||||
@@ -50,6 +51,9 @@ class CodeQaRuntimeExecutor:
|
||||
def execute(self, *, user_query: str, rag_session_id: str, files_map: dict[str, dict] | None = None) -> CodeQaFinalResult:
|
||||
timings_ms: dict[str, int] = {}
|
||||
runtime_trace: list[dict] = []
|
||||
answer_policy_branch = ""
|
||||
decision_reason = ""
|
||||
post_gate_snapshot: dict = {}
|
||||
state = CodeQaExecutionState(
|
||||
user_query=user_query,
|
||||
rag_session_id=rag_session_id,
|
||||
@@ -76,9 +80,10 @@ class CodeQaRuntimeExecutor:
|
||||
started = perf_counter()
|
||||
raw_rows = self._retrieve(state)
|
||||
timings_ms["retrieval"] = self._elapsed_ms(started)
|
||||
retrieval_report = self._retrieval.consume_retrieval_report() or {}
|
||||
raw_rows, retrieval_report = self._hydrate_entrypoint_sources(state, raw_rows, retrieval_report)
|
||||
symbol_resolution = self._resolve_symbol(state.router_result.symbol_resolution.model_dump(), raw_rows)
|
||||
state.router_result = state.router_result.model_copy(update={"symbol_resolution": SymbolResolution(**symbol_resolution)})
|
||||
retrieval_report = self._retrieval.consume_retrieval_report()
|
||||
state.retrieval_result = build_retrieval_result(raw_rows, retrieval_report, symbol_resolution)
|
||||
if state.retrieval_request.sub_intent.upper() == "EXPLAIN" and symbol_resolution.get("status") in {"not_found", "ambiguous"}:
|
||||
state.retrieval_result = build_retrieval_result([], retrieval_report, symbol_resolution)
|
||||
@@ -101,8 +106,10 @@ class CodeQaRuntimeExecutor:
|
||||
if state.retrieval_request.sub_intent.upper() == "EXPLAIN" and symbol_resolution.get("status") in {"not_found", "ambiguous"}:
|
||||
state.evidence_pack.sufficient = False
|
||||
state.evidence_pack.failure_reasons = ["target_not_resolved"]
|
||||
pre_gate_input = self._build_pre_gate_input(state)
|
||||
started = perf_counter()
|
||||
gate_decision = evaluate_evidence(state.evidence_pack)
|
||||
timings_ms["pre_evidence_gate"] = 0
|
||||
timings_ms["pre_evidence_gate"] = self._elapsed_ms(started)
|
||||
state.answer_mode = "normal" if gate_decision.passed else "degraded"
|
||||
state.degraded_message = gate_decision.degraded_message
|
||||
runtime_trace.append(
|
||||
@@ -110,31 +117,51 @@ class CodeQaRuntimeExecutor:
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed" if gate_decision.passed else "blocked",
|
||||
"timings_ms": {"pre_evidence_gate": timings_ms["pre_evidence_gate"]},
|
||||
"input": pre_gate_input,
|
||||
"output": {
|
||||
"passed": gate_decision.passed,
|
||||
"failure_reasons": list(gate_decision.failure_reasons),
|
||||
"degraded_message": gate_decision.degraded_message,
|
||||
"evidence_count": state.evidence_pack.evidence_count,
|
||||
},
|
||||
}
|
||||
)
|
||||
decision = self._answer_policy.decide(router_result=state.router_result, gate_decision=gate_decision)
|
||||
answer_policy_branch = decision.branch
|
||||
decision_reason = decision.reason
|
||||
if not decision.should_call_llm:
|
||||
state.answer_mode = decision.answer_mode
|
||||
started = perf_counter()
|
||||
runtime_trace.append(
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "skipped",
|
||||
"timings_ms": {"llm": self._elapsed_ms(started)},
|
||||
"output": {
|
||||
"reason": "policy_short_circuit",
|
||||
"answer_mode": decision.answer_mode,
|
||||
"decision_reason": decision.reason,
|
||||
"answer_policy_branch": decision.branch,
|
||||
},
|
||||
}
|
||||
)
|
||||
started = perf_counter()
|
||||
timings_ms["post_evidence_gate"] = self._elapsed_ms(started)
|
||||
post_gate_snapshot = {
|
||||
"input": {
|
||||
"answer_mode": decision.answer_mode,
|
||||
"draft_present": False,
|
||||
"resolved_target": self._resolved_target(state),
|
||||
},
|
||||
"output": {"reason": "no_draft_answer"},
|
||||
}
|
||||
runtime_trace.append(
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "skipped",
|
||||
"output": {"reason": "no_draft_answer"},
|
||||
"timings_ms": {"post_evidence_gate": timings_ms["post_evidence_gate"]},
|
||||
"input": post_gate_snapshot["input"],
|
||||
"output": post_gate_snapshot["output"],
|
||||
}
|
||||
)
|
||||
return self._finalize(
|
||||
@@ -145,13 +172,41 @@ class CodeQaRuntimeExecutor:
|
||||
llm_used=False,
|
||||
timings_ms=timings_ms,
|
||||
runtime_trace=runtime_trace,
|
||||
answer_policy_branch=answer_policy_branch,
|
||||
decision_reason=decision_reason,
|
||||
pre_gate_input=pre_gate_input,
|
||||
gate_decision=gate_decision,
|
||||
post_gate_snapshot=post_gate_snapshot,
|
||||
)
|
||||
if self._llm is None:
|
||||
answer_policy_branch = "llm_unavailable"
|
||||
decision_reason = "llm_service_missing"
|
||||
started = perf_counter()
|
||||
runtime_trace.append(
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "skipped",
|
||||
"output": {"reason": "llm_unavailable"},
|
||||
"timings_ms": {"llm": self._elapsed_ms(started)},
|
||||
"output": {"reason": "llm_unavailable", "answer_policy_branch": answer_policy_branch, "decision_reason": decision_reason},
|
||||
}
|
||||
)
|
||||
started = perf_counter()
|
||||
timings_ms["post_evidence_gate"] = self._elapsed_ms(started)
|
||||
post_gate_snapshot = {
|
||||
"input": {
|
||||
"answer_mode": state.answer_mode,
|
||||
"draft_present": False,
|
||||
"resolved_target": self._resolved_target(state),
|
||||
},
|
||||
"output": {"reason": "no_draft_answer"},
|
||||
}
|
||||
runtime_trace.append(
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "skipped",
|
||||
"timings_ms": {"post_evidence_gate": timings_ms["post_evidence_gate"]},
|
||||
"input": post_gate_snapshot["input"],
|
||||
"output": post_gate_snapshot["output"],
|
||||
}
|
||||
)
|
||||
return self._finalize(
|
||||
@@ -162,6 +217,11 @@ class CodeQaRuntimeExecutor:
|
||||
llm_used=False,
|
||||
timings_ms=timings_ms,
|
||||
runtime_trace=runtime_trace,
|
||||
answer_policy_branch=answer_policy_branch,
|
||||
decision_reason=decision_reason,
|
||||
pre_gate_input=pre_gate_input,
|
||||
gate_decision=gate_decision,
|
||||
post_gate_snapshot=post_gate_snapshot,
|
||||
)
|
||||
state.synthesis_input = build_answer_synthesis_input(user_query, state.evidence_pack)
|
||||
prompt_name = self._prompt_selector.select(sub_intent=state.retrieval_request.sub_intent, answer_mode=state.answer_mode)
|
||||
@@ -186,10 +246,29 @@ class CodeQaRuntimeExecutor:
|
||||
"output": {
|
||||
"prompt_name": prompt_name,
|
||||
"answer_preview": draft.answer[:300],
|
||||
"resolved_target": self._resolved_target(state),
|
||||
"answer_policy_branch": answer_policy_branch,
|
||||
"decision_reason": decision_reason,
|
||||
},
|
||||
}
|
||||
)
|
||||
validation = self._post_gate.validate(answer=draft.answer, answer_mode=state.answer_mode, degraded_message=state.degraded_message)
|
||||
post_gate_input = {
|
||||
"answer_mode": state.answer_mode,
|
||||
"degraded_message": state.degraded_message,
|
||||
"resolved_target": self._resolved_target(state),
|
||||
"draft_answer_preview": draft.answer[:300],
|
||||
"repair_candidate": bool(self._repair is not None),
|
||||
}
|
||||
started = perf_counter()
|
||||
validation = self._post_gate.validate(
|
||||
answer=draft.answer,
|
||||
answer_mode=state.answer_mode,
|
||||
degraded_message=state.degraded_message,
|
||||
sub_intent=state.retrieval_request.sub_intent,
|
||||
user_query=user_query,
|
||||
evidence_pack=state.evidence_pack,
|
||||
)
|
||||
timings_ms["post_evidence_gate"] = self._elapsed_ms(started)
|
||||
final_answer = draft.answer
|
||||
repair_used = False
|
||||
if not validation.passed and self._repair is not None:
|
||||
@@ -197,22 +276,40 @@ class CodeQaRuntimeExecutor:
|
||||
final_answer = self._repair.repair(draft_answer=draft.answer, validation=validation, prompt_payload=prompt_payload)
|
||||
repair_used = True
|
||||
timings_ms["repair"] = self._elapsed_ms(started)
|
||||
validation = self._post_gate.validate(answer=final_answer, answer_mode=state.answer_mode, degraded_message=state.degraded_message)
|
||||
if not validation.passed and state.degraded_message:
|
||||
final_answer = state.degraded_message
|
||||
started = perf_counter()
|
||||
validation = self._post_gate.validate(
|
||||
answer=final_answer,
|
||||
answer_mode=state.answer_mode,
|
||||
degraded_message=state.degraded_message,
|
||||
sub_intent=state.retrieval_request.sub_intent,
|
||||
user_query=user_query,
|
||||
evidence_pack=state.evidence_pack,
|
||||
)
|
||||
timings_ms["post_evidence_gate_recheck"] = self._elapsed_ms(started)
|
||||
if not validation.passed:
|
||||
final_answer = self._fallback_answer(state)
|
||||
state.answer_mode = self._fallback_mode(state)
|
||||
post_gate_snapshot = {
|
||||
"input": post_gate_input,
|
||||
"output": {
|
||||
"passed": validation.passed,
|
||||
"action": validation.action,
|
||||
"reasons": list(validation.reasons),
|
||||
"repair_used": repair_used,
|
||||
"final_answer_preview": final_answer[:300],
|
||||
},
|
||||
}
|
||||
runtime_trace.append(
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed" if validation.passed else "failed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 0,
|
||||
"post_evidence_gate": timings_ms["post_evidence_gate"],
|
||||
"post_evidence_gate_recheck": timings_ms.get("post_evidence_gate_recheck", 0),
|
||||
"repair": timings_ms.get("repair", 0),
|
||||
},
|
||||
"output": {
|
||||
"passed": validation.passed,
|
||||
"reasons": list(validation.reasons),
|
||||
"repair_used": repair_used,
|
||||
},
|
||||
"input": post_gate_snapshot["input"],
|
||||
"output": post_gate_snapshot["output"],
|
||||
}
|
||||
)
|
||||
return self._finalize(
|
||||
@@ -224,6 +321,11 @@ class CodeQaRuntimeExecutor:
|
||||
validation=validation,
|
||||
timings_ms=timings_ms,
|
||||
runtime_trace=runtime_trace,
|
||||
answer_policy_branch=answer_policy_branch,
|
||||
decision_reason=decision_reason,
|
||||
pre_gate_input=pre_gate_input,
|
||||
gate_decision=gate_decision,
|
||||
post_gate_snapshot=post_gate_snapshot,
|
||||
)
|
||||
|
||||
def _retrieve(self, state: CodeQaExecutionState) -> list[dict]:
|
||||
@@ -257,9 +359,10 @@ class CodeQaRuntimeExecutor:
|
||||
exact = next((item for item in found if item in candidates), None)
|
||||
if exact:
|
||||
return {"status": "resolved", "resolved_symbol": exact, "alternatives": found[:5], "confidence": 0.99}
|
||||
if found:
|
||||
return {"status": "ambiguous", "resolved_symbol": None, "alternatives": found[:5], "confidence": 0.55}
|
||||
return {"status": "not_found", "resolved_symbol": None, "alternatives": [], "confidence": 0.0}
|
||||
close = self._close_matches(candidates, found)
|
||||
if close:
|
||||
return {"status": "ambiguous", "resolved_symbol": None, "alternatives": close[:5], "confidence": 0.55}
|
||||
return {"status": "not_found", "resolved_symbol": None, "alternatives": close[:5], "confidence": 0.0}
|
||||
|
||||
def _finalize(
|
||||
self,
|
||||
@@ -272,6 +375,11 @@ class CodeQaRuntimeExecutor:
|
||||
validation=None,
|
||||
timings_ms: dict[str, int] | None = None,
|
||||
runtime_trace: list[dict] | None = None,
|
||||
answer_policy_branch: str = "",
|
||||
decision_reason: str = "",
|
||||
pre_gate_input: dict | None = None,
|
||||
gate_decision=None,
|
||||
post_gate_snapshot: dict | None = None,
|
||||
) -> CodeQaFinalResult:
|
||||
diagnostics = build_diagnostics_report(
|
||||
router_result=state.router_result,
|
||||
@@ -280,6 +388,11 @@ class CodeQaRuntimeExecutor:
|
||||
evidence_bundle=state.evidence_pack,
|
||||
answer_mode=state.answer_mode,
|
||||
timings_ms=timings_ms or {},
|
||||
resolved_target=self._resolved_target(state),
|
||||
answer_policy_branch=answer_policy_branch,
|
||||
decision_reason=decision_reason,
|
||||
evidence_gate_input=pre_gate_input or {},
|
||||
post_evidence_gate=post_gate_snapshot or {},
|
||||
)
|
||||
result = CodeQaFinalResult(
|
||||
final_answer=final_answer.strip(),
|
||||
@@ -287,7 +400,15 @@ class CodeQaRuntimeExecutor:
|
||||
repair_used=repair_used,
|
||||
llm_used=llm_used,
|
||||
draft_answer=draft,
|
||||
validation=validation or self._post_gate.validate(answer=final_answer, answer_mode=state.answer_mode, degraded_message=state.degraded_message),
|
||||
validation=validation
|
||||
or self._post_gate.validate(
|
||||
answer=final_answer,
|
||||
answer_mode=state.answer_mode,
|
||||
degraded_message=state.degraded_message,
|
||||
sub_intent=state.retrieval_request.sub_intent if state.retrieval_request else "",
|
||||
user_query=state.user_query,
|
||||
evidence_pack=state.evidence_pack,
|
||||
),
|
||||
router_result=state.router_result,
|
||||
retrieval_request=state.retrieval_request,
|
||||
retrieval_result=state.retrieval_result,
|
||||
@@ -306,4 +427,119 @@ class CodeQaRuntimeExecutor:
|
||||
return result
|
||||
|
||||
def _elapsed_ms(self, started: float) -> int:
|
||||
return int((perf_counter() - started) * 1000)
|
||||
return max(1, round((perf_counter() - started) * 1000))
|
||||
|
||||
def _build_pre_gate_input(self, state: CodeQaExecutionState) -> dict:
|
||||
evidence = state.evidence_pack
|
||||
retrieval = state.retrieval_result
|
||||
return {
|
||||
"resolved_target": self._resolved_target(state),
|
||||
"sub_intent": state.retrieval_request.sub_intent if state.retrieval_request else None,
|
||||
"target_type": evidence.target_type if evidence else None,
|
||||
"evidence_count": evidence.evidence_count if evidence else 0,
|
||||
"code_chunk_count": len(evidence.code_chunks) if evidence else 0,
|
||||
"entrypoint_count": len(evidence.entrypoints) if evidence else 0,
|
||||
"relation_count": len(evidence.relations) if evidence else 0,
|
||||
"test_evidence_count": len(evidence.test_evidence) if evidence else 0,
|
||||
"symbol_resolution_status": retrieval.symbol_resolution_status if retrieval else None,
|
||||
"path_scope": list(state.retrieval_request.path_scope) if state.retrieval_request else [],
|
||||
}
|
||||
|
||||
def _resolved_target(self, state: CodeQaExecutionState) -> str | None:
|
||||
if state.evidence_pack and state.evidence_pack.resolved_target:
|
||||
return state.evidence_pack.resolved_target
|
||||
if state.retrieval_result and state.retrieval_result.resolved_symbol:
|
||||
return state.retrieval_result.resolved_symbol
|
||||
if state.retrieval_request and state.retrieval_request.path_scope:
|
||||
return state.retrieval_request.path_scope[0]
|
||||
return None
|
||||
|
||||
def _close_matches(self, candidates: list[str], found: list[str]) -> list[str]:
|
||||
ranked: list[tuple[float, str]] = []
|
||||
for candidate in candidates:
|
||||
for item in found:
|
||||
score = SequenceMatcher(None, candidate.lower(), item.lower()).ratio()
|
||||
if score >= 0.52:
|
||||
ranked.append((score, item))
|
||||
ranked.sort(key=lambda pair: (-pair[0], pair[1]))
|
||||
result: list[str] = []
|
||||
for _, item in ranked:
|
||||
if item not in result:
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
def _hydrate_entrypoint_sources(
|
||||
self,
|
||||
state: CodeQaExecutionState,
|
||||
raw_rows: list[dict],
|
||||
retrieval_report: dict,
|
||||
) -> tuple[list[dict], dict]:
|
||||
if not state.retrieval_request or state.retrieval_request.sub_intent.upper() != "FIND_ENTRYPOINTS":
|
||||
return raw_rows, retrieval_report
|
||||
entrypoint_paths = []
|
||||
for row in raw_rows:
|
||||
if str(row.get("layer") or "") != "C3_ENTRYPOINTS":
|
||||
continue
|
||||
path = str(row.get("path") or "").strip()
|
||||
if path and path not in entrypoint_paths:
|
||||
entrypoint_paths.append(path)
|
||||
if not entrypoint_paths:
|
||||
return raw_rows, retrieval_report
|
||||
extra_rows = self._retrieval.retrieve_exact_files(
|
||||
state.rag_session_id,
|
||||
paths=entrypoint_paths[:3],
|
||||
layers=["C0_SOURCE_CHUNKS"],
|
||||
limit=24,
|
||||
query=state.user_query,
|
||||
ranking_profile="entrypoint_source_hydration",
|
||||
)
|
||||
extra_report = self._retrieval.consume_retrieval_report() or {}
|
||||
return self._merge_rows(raw_rows, extra_rows), self._merge_reports(retrieval_report, extra_report)
|
||||
|
||||
def _merge_rows(self, base_rows: list[dict], extra_rows: list[dict]) -> list[dict]:
|
||||
merged: list[dict] = []
|
||||
seen: set[tuple[str, str, str, int | None, int | None]] = set()
|
||||
for row in [*base_rows, *extra_rows]:
|
||||
key = (
|
||||
str(row.get("layer") or ""),
|
||||
str(row.get("path") or ""),
|
||||
str(row.get("title") or ""),
|
||||
row.get("span_start"),
|
||||
row.get("span_end"),
|
||||
)
|
||||
if key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
merged.append(row)
|
||||
return merged
|
||||
|
||||
def _merge_reports(self, base: dict, extra: dict) -> dict:
|
||||
merged = dict(base or {})
|
||||
merged["executed_layers"] = list(dict.fromkeys([*(base.get("executed_layers") or []), *(extra.get("executed_layers") or [])]))
|
||||
merged["retrieval_mode_by_layer"] = {**dict(base.get("retrieval_mode_by_layer") or {}), **dict(extra.get("retrieval_mode_by_layer") or {})}
|
||||
merged["top_k_by_layer"] = {**dict(base.get("top_k_by_layer") or {}), **dict(extra.get("top_k_by_layer") or {})}
|
||||
merged["filters_by_layer"] = {**dict(base.get("filters_by_layer") or {}), **dict(extra.get("filters_by_layer") or {})}
|
||||
merged["retrieval_by_layer_ms"] = {**dict(base.get("retrieval_by_layer_ms") or {}), **dict(extra.get("retrieval_by_layer_ms") or {})}
|
||||
merged["fallback"] = dict(extra.get("fallback") or base.get("fallback") or {"used": False, "reason": None})
|
||||
merged["supplemental_requests"] = [*(base.get("supplemental_requests") or []), *(extra.get("requests") or [])]
|
||||
return merged
|
||||
|
||||
def _fallback_mode(self, state: CodeQaExecutionState) -> str:
|
||||
status = str(state.router_result.symbol_resolution.status if state.router_result and state.router_result.symbol_resolution else "")
|
||||
if status == "ambiguous":
|
||||
return "ambiguous"
|
||||
if status == "not_found":
|
||||
return "not_found"
|
||||
return "degraded"
|
||||
|
||||
def _fallback_answer(self, state: CodeQaExecutionState) -> str:
|
||||
symbol_resolution = state.router_result.symbol_resolution if state.router_result else None
|
||||
query_plan = state.router_result.query_plan if state.router_result else None
|
||||
target = next((item for item in list(query_plan.symbol_candidates or []) if item), "запрошенная сущность") if query_plan else "запрошенная сущность"
|
||||
if symbol_resolution and symbol_resolution.status == "ambiguous":
|
||||
return self._answer_policy.decide(router_result=state.router_result, gate_decision=evaluate_evidence(state.evidence_pack)).answer
|
||||
if symbol_resolution and symbol_resolution.status == "not_found":
|
||||
return self._answer_policy.decide(router_result=state.router_result, gate_decision=evaluate_evidence(state.evidence_pack)).answer
|
||||
if state.degraded_message:
|
||||
return state.degraded_message
|
||||
return f"Недостаточно подтверждённых данных для уверенного ответа по {target}."
|
||||
|
||||
@@ -1,6 +1,25 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
|
||||
from app.modules.agent.code_qa_runtime.models import CodeQaValidationResult
|
||||
from app.modules.rag.code_qa_pipeline.answer_fact_curator import build_curated_answer_facts
|
||||
from app.modules.rag.code_qa_pipeline.contracts import EvidenceBundle
|
||||
|
||||
_TOKEN_RE = re.compile(r"[a-zA-Zа-яА-Я0-9_/]+")
|
||||
_VAGUE_PHRASES = (
|
||||
"ряд аргументов",
|
||||
"имеет responsibilities",
|
||||
"имеет responsibility",
|
||||
"ключевой компонент",
|
||||
"центральный компонент",
|
||||
"играет роль",
|
||||
"управляет системой",
|
||||
"этап пайплайна",
|
||||
"инициализация сервисов",
|
||||
"регистрация основных служб",
|
||||
)
|
||||
_OPTIMISTIC_TRACE_CLAIMS = ("полностью восстанавливается", "полный поток выполнения", "полностью прослеживается")
|
||||
|
||||
|
||||
class CodeQaPostEvidenceGate:
|
||||
@@ -10,6 +29,9 @@ class CodeQaPostEvidenceGate:
|
||||
answer: str,
|
||||
answer_mode: str,
|
||||
degraded_message: str,
|
||||
sub_intent: str,
|
||||
user_query: str,
|
||||
evidence_pack: EvidenceBundle | None,
|
||||
) -> CodeQaValidationResult:
|
||||
normalized = (answer or "").strip()
|
||||
if not normalized:
|
||||
@@ -18,6 +40,189 @@ class CodeQaPostEvidenceGate:
|
||||
return CodeQaValidationResult(passed=False, action="repair", reasons=["degraded_answer_missing_guardrail"])
|
||||
if answer_mode == "not_found" and "не найден" not in normalized.lower():
|
||||
return CodeQaValidationResult(passed=False, action="repair", reasons=["not_found_answer_missing_phrase"])
|
||||
if answer_mode == "ambiguous" and "не удалось однозначно разрешить" not in normalized.lower():
|
||||
return CodeQaValidationResult(passed=False, action="repair", reasons=["ambiguous_answer_missing_phrase"])
|
||||
if degraded_message and answer_mode != "normal" and len(normalized) < 24:
|
||||
return CodeQaValidationResult(passed=False, action="repair", reasons=["answer_too_short"])
|
||||
if answer_mode != "normal" or evidence_pack is None:
|
||||
return CodeQaValidationResult(passed=True, action="return")
|
||||
|
||||
reasons = self._normal_answer_reasons(normalized.lower(), sub_intent.upper(), user_query, evidence_pack)
|
||||
if reasons:
|
||||
return CodeQaValidationResult(passed=False, action="repair", reasons=_dedupe(reasons))
|
||||
return CodeQaValidationResult(passed=True, action="return")
|
||||
|
||||
def _normal_answer_reasons(self, answer: str, sub_intent: str, user_query: str, evidence_pack: EvidenceBundle) -> list[str]:
|
||||
reasons: list[str] = []
|
||||
if sub_intent == "FIND_ENTRYPOINTS":
|
||||
reasons.extend(self._validate_entrypoints(answer, user_query, evidence_pack))
|
||||
elif sub_intent == "EXPLAIN":
|
||||
reasons.extend(self._validate_explain(answer, evidence_pack))
|
||||
elif sub_intent == "ARCHITECTURE":
|
||||
reasons.extend(self._validate_architecture(answer, evidence_pack))
|
||||
elif sub_intent == "TRACE_FLOW":
|
||||
reasons.extend(self._validate_trace_flow(answer, evidence_pack))
|
||||
return reasons
|
||||
|
||||
def _validate_entrypoints(self, answer: str, user_query: str, evidence_pack: EvidenceBundle) -> list[str]:
|
||||
confirmed = [item for item in list(evidence_pack.entrypoints or []) if item.get("http_method") and item.get("route_path")]
|
||||
if not confirmed:
|
||||
return []
|
||||
query_tokens = self._tokens(user_query)
|
||||
matched = [item for item in confirmed if self._tokens(str(item.get("route_path") or "")) & query_tokens]
|
||||
required = matched or confirmed[:1]
|
||||
reasons = []
|
||||
if any(f"{item['http_method']} {item['route_path']}".lower() not in answer for item in required):
|
||||
reasons.append("missing_confirmed_route")
|
||||
if matched and any(token in query_tokens for token in {"health", "/health"}) and "не обнаруж" in answer:
|
||||
reasons.append("contradicts_confirmed_route")
|
||||
return reasons
|
||||
|
||||
def _validate_explain(self, answer: str, evidence_pack: EvidenceBundle) -> list[str]:
|
||||
facts = build_curated_answer_facts(evidence_pack)
|
||||
explain = dict(facts.get("explain") or {})
|
||||
reasons = self._validate_target_focus(answer, evidence_pack)
|
||||
reasons.extend(self._vagueness_reasons(answer, "explain"))
|
||||
|
||||
matches = 0
|
||||
methods = list(explain.get("required_methods") or [])
|
||||
calls = list(explain.get("required_calls") or [])
|
||||
dependencies = list(explain.get("required_dependencies") or [])
|
||||
fields = list(explain.get("required_fields") or [])
|
||||
if methods and not self._mentions_fact_group(answer, methods):
|
||||
reasons.append("missing_concrete_methods")
|
||||
elif methods:
|
||||
matches += 1
|
||||
if calls and not self._mentions_fact_group(answer, calls):
|
||||
reasons.append("missing_concrete_calls")
|
||||
elif calls:
|
||||
matches += 1
|
||||
if dependencies and not self._mentions_fact_group(answer, dependencies):
|
||||
reasons.append("missing_concrete_dependencies")
|
||||
elif dependencies:
|
||||
matches += 1
|
||||
if fields and self._mentions_fact_group(answer, fields):
|
||||
matches += 1
|
||||
if (methods or calls or dependencies or fields) and matches == 0:
|
||||
reasons.append("too_vague_for_explain")
|
||||
if self._semantic_leakage(answer, facts, has_concrete_support=matches > 0):
|
||||
reasons.append("semantic_labels_without_code_edges")
|
||||
return reasons
|
||||
|
||||
def _validate_architecture(self, answer: str, evidence_pack: EvidenceBundle) -> list[str]:
|
||||
facts = build_curated_answer_facts(evidence_pack)
|
||||
architecture = dict(facts.get("architecture") or {})
|
||||
reasons = self._validate_target_focus(answer, evidence_pack)
|
||||
reasons.extend(self._vagueness_reasons(answer, "architecture"))
|
||||
|
||||
components = list(architecture.get("required_components") or [])
|
||||
relations = list(architecture.get("required_relations") or [])
|
||||
verbs = list(architecture.get("required_relation_verbs") or [])
|
||||
if components and not self._mentions_fact_group(answer, components):
|
||||
reasons.append("missing_concrete_components")
|
||||
if relations and not self._mentions_relations(answer, relations):
|
||||
reasons.append("missing_concrete_relations")
|
||||
if verbs and not self._mentions_fact_group(answer, verbs):
|
||||
reasons.append("missing_relation_verbs")
|
||||
if any(label in answer for label in architecture.get("forbidden_labels") or []):
|
||||
reasons.append("contains_retrieval_artifacts")
|
||||
if self._methods_dominate_components(answer, components):
|
||||
reasons.append("methods_as_primary_components")
|
||||
if relations and (not self._mentions_relations(answer, relations) or not self._mentions_fact_group(answer, verbs)):
|
||||
reasons.append("too_vague_for_architecture")
|
||||
if self._semantic_leakage(answer, facts, has_concrete_support=self._mentions_relations(answer, relations)):
|
||||
reasons.append("semantic_labels_without_code_edges")
|
||||
return reasons
|
||||
|
||||
def _validate_trace_flow(self, answer: str, evidence_pack: EvidenceBundle) -> list[str]:
|
||||
facts = build_curated_answer_facts(evidence_pack)
|
||||
trace = dict(facts.get("trace_flow") or {})
|
||||
reasons = self._validate_target_focus(answer, evidence_pack)
|
||||
reasons.extend(self._vagueness_reasons(answer, "trace_flow"))
|
||||
|
||||
steps = list(trace.get("required_flow_steps") or [])
|
||||
calls = list(trace.get("required_calls") or [])
|
||||
if steps and not self._mentions_steps(answer, steps):
|
||||
reasons.append("missing_flow_steps")
|
||||
if calls and not self._mentions_fact_group(answer, calls):
|
||||
reasons.append("missing_concrete_calls")
|
||||
if steps and not self._mentions_relations(answer, steps):
|
||||
reasons.append("missing_sequence_edges")
|
||||
if any(claim in answer for claim in _OPTIMISTIC_TRACE_CLAIMS):
|
||||
reasons.append("overclaims_trace_completeness")
|
||||
if steps and not (self._mentions_steps(answer, steps) and self._mentions_relations(answer, steps)):
|
||||
reasons.append("too_vague_for_trace_flow")
|
||||
return reasons
|
||||
|
||||
def _validate_target_focus(self, answer: str, evidence_pack: EvidenceBundle) -> list[str]:
|
||||
target = str(evidence_pack.resolved_target or "").strip().lower()
|
||||
return [] if not target or target in answer else ["missing_resolved_target"]
|
||||
|
||||
def _mentions_fact_group(self, answer: str, values: list[str]) -> bool:
|
||||
return any(alias in answer for value in values for alias in _aliases(value))
|
||||
|
||||
def _mentions_relations(self, answer: str, relations: list[dict]) -> bool:
|
||||
for relation in relations:
|
||||
source = str(relation.get("source") or "").lower()
|
||||
target = str(relation.get("target") or "").lower()
|
||||
verb = str(relation.get("verb") or "").lower()
|
||||
if source and target and source in answer and target in answer:
|
||||
return True
|
||||
if source and verb and target and source in answer and verb in answer and target in answer:
|
||||
return True
|
||||
return False
|
||||
|
||||
def _mentions_steps(self, answer: str, steps: list[dict]) -> bool:
|
||||
if "сначала" in answer and "затем" in answer:
|
||||
return True
|
||||
numeric_steps = sum(1 for marker in ("1.", "2.", "3.") if marker in answer)
|
||||
if numeric_steps >= 2:
|
||||
return True
|
||||
mentioned = sum(1 for step in steps[:3] if self._mentions_relations(answer, [step]))
|
||||
return mentioned >= min(2, len(steps[:3]))
|
||||
|
||||
def _methods_dominate_components(self, answer: str, components: list[str]) -> bool:
|
||||
method_like = re.findall(r"\b[a-z_]+\(\)", answer)
|
||||
component_hits = sum(1 for component in components if component.lower() in answer)
|
||||
return bool(method_like) and component_hits == 0
|
||||
|
||||
def _semantic_leakage(self, answer: str, facts: dict, *, has_concrete_support: bool) -> bool:
|
||||
if has_concrete_support:
|
||||
return False
|
||||
semantic_roles = [str(item.get("role") or "").strip().lower() for item in facts.get("semantic_hints") or [] if str(item.get("role") or "").strip()]
|
||||
return bool(semantic_roles) and any(role in answer for role in semantic_roles)
|
||||
|
||||
def _vagueness_reasons(self, answer: str, scenario: str) -> list[str]:
|
||||
if any(phrase in answer for phrase in _VAGUE_PHRASES):
|
||||
return [f"too_vague_for_{scenario}"]
|
||||
return []
|
||||
|
||||
def _tokens(self, value: str) -> set[str]:
|
||||
return {token.lower().strip("/") for token in _TOKEN_RE.findall(value or "") if token.strip("/")}
|
||||
|
||||
|
||||
def _aliases(value: str) -> list[str]:
|
||||
text = str(value or "").strip().lower()
|
||||
if not text:
|
||||
return []
|
||||
aliases = [text]
|
||||
bare = text.removesuffix("()")
|
||||
if bare != text:
|
||||
aliases.append(bare)
|
||||
tail = bare.rsplit(".", 1)[-1]
|
||||
if tail and tail not in aliases:
|
||||
aliases.append(tail)
|
||||
if tail and f"{tail}()" not in aliases:
|
||||
aliases.append(f"{tail}()")
|
||||
return aliases
|
||||
|
||||
|
||||
def _dedupe(values: list[str]) -> list[str]:
|
||||
seen: set[str] = set()
|
||||
result: list[str] = []
|
||||
for value in values:
|
||||
if value in seen:
|
||||
continue
|
||||
seen.add(value)
|
||||
result.append(value)
|
||||
return result
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import re
|
||||
|
||||
from app.modules.rag.code_qa_pipeline.contracts import AnswerSynthesisInput, EvidenceBundle
|
||||
|
||||
@@ -11,6 +12,7 @@ _LAYER_GUIDE = (
|
||||
"- C3_ENTRYPOINTS: подтвержденные точки входа.\n"
|
||||
"- C4_SEMANTIC_ROLES: вспомогательная роль компонента, использовать осторожно."
|
||||
)
|
||||
_TOKEN_RE = re.compile(r"[a-zA-Zа-яА-Я0-9_/]+")
|
||||
|
||||
|
||||
class CodeQaPromptPayloadBuilder:
|
||||
@@ -30,8 +32,82 @@ class CodeQaPromptPayloadBuilder:
|
||||
"fast_context": synthesis_input.fast_context,
|
||||
"deep_context": synthesis_input.deep_context,
|
||||
"evidence_summary": synthesis_input.evidence_summary,
|
||||
"semantic_hints": synthesis_input.semantic_hints,
|
||||
"diagnostic_hints": synthesis_input.diagnostic_hints,
|
||||
"retrieval_summary": evidence_pack.retrieval_summary,
|
||||
"confirmed_entrypoints": self._entrypoints(user_query, evidence_pack),
|
||||
"required_entrypoints": self._required_entrypoints(user_query, evidence_pack),
|
||||
"layer_guide": _LAYER_GUIDE,
|
||||
}
|
||||
payload.update(self._scenario_payload(synthesis_input))
|
||||
return json.dumps(payload, ensure_ascii=False, indent=2)
|
||||
|
||||
def _entrypoints(self, user_query: str, evidence_pack: EvidenceBundle) -> list[dict]:
|
||||
query_tokens = self._tokens(user_query)
|
||||
enriched: list[dict] = []
|
||||
for item in list(evidence_pack.entrypoints or []):
|
||||
route_path = str(item.get("route_path") or "").strip()
|
||||
http_method = str(item.get("http_method") or "").strip().upper()
|
||||
if not http_method:
|
||||
continue
|
||||
candidate = {
|
||||
"http_method": http_method,
|
||||
"route_path": route_path,
|
||||
"display": f"{http_method} {route_path}".strip(),
|
||||
"handler_symbol": str(item.get("handler_symbol") or "").strip(),
|
||||
"path": str(item.get("path") or "").strip(),
|
||||
"start_line": item.get("start_line"),
|
||||
"end_line": item.get("end_line"),
|
||||
"query_match": self._matches_query(route_path, query_tokens),
|
||||
}
|
||||
if candidate not in enriched:
|
||||
enriched.append(candidate)
|
||||
return sorted(enriched, key=lambda item: (-int(bool(item["query_match"])), -int(bool(item["route_path"])), len(item["route_path"] or "/"), item["display"]))
|
||||
|
||||
def _required_entrypoints(self, user_query: str, evidence_pack: EvidenceBundle) -> list[str]:
|
||||
return [item["display"] for item in self._entrypoints(user_query, evidence_pack) if item["query_match"] and item["route_path"]]
|
||||
|
||||
def _scenario_payload(self, synthesis_input: AnswerSynthesisInput) -> dict:
|
||||
scenario = (synthesis_input.resolved_scenario or "").upper()
|
||||
curated = dict(synthesis_input.curated_facts or {})
|
||||
if scenario == "EXPLAIN":
|
||||
facts = dict(curated.get("explain") or {})
|
||||
return {
|
||||
"must_mention_methods": facts.get("required_methods", []),
|
||||
"must_mention_fields": facts.get("required_fields", []),
|
||||
"must_mention_calls": facts.get("required_calls", []),
|
||||
"must_mention_dependencies": facts.get("required_dependencies", []),
|
||||
"must_mention_constructor_args": facts.get("required_constructor_args", []),
|
||||
"must_mention_files": facts.get("required_files", []),
|
||||
"must_not_infer_missing_details": True,
|
||||
"fact_gaps": facts.get("fact_gaps", []),
|
||||
}
|
||||
if scenario == "ARCHITECTURE":
|
||||
facts = dict(curated.get("architecture") or {})
|
||||
return {
|
||||
"must_mention_components": facts.get("required_components", []),
|
||||
"must_mention_relations": facts.get("required_relations", []),
|
||||
"must_use_relation_verbs": facts.get("required_relation_verbs", []),
|
||||
"must_avoid_semantic_labels_as_primary_claims": True,
|
||||
"must_not_use_retrieval_labels": facts.get("forbidden_labels", []),
|
||||
"fact_gaps": facts.get("fact_gaps", []),
|
||||
}
|
||||
if scenario == "TRACE_FLOW":
|
||||
facts = dict(curated.get("trace_flow") or {})
|
||||
return {
|
||||
"must_mention_flow_steps": facts.get("required_flow_steps", []),
|
||||
"must_mention_calls": facts.get("required_calls", []),
|
||||
"must_mention_sequence_edges": facts.get("required_sequence_edges", []),
|
||||
"must_avoid_overclaiming_full_flow": True,
|
||||
"fact_gaps": facts.get("fact_gaps", []),
|
||||
}
|
||||
return {}
|
||||
|
||||
def _matches_query(self, route_path: str, query_tokens: set[str]) -> bool:
|
||||
if not route_path:
|
||||
return False
|
||||
path_tokens = self._tokens(route_path)
|
||||
return bool(path_tokens & query_tokens)
|
||||
|
||||
def _tokens(self, value: str) -> set[str]:
|
||||
return {token.lower().strip("/") for token in _TOKEN_RE.findall(value or "") if token.strip("/")}
|
||||
|
||||
@@ -17,10 +17,12 @@ class CodeQaAnswerRepairService:
|
||||
validation: CodeQaValidationResult,
|
||||
prompt_payload: str,
|
||||
) -> str:
|
||||
repair_focus = self._repair_focus(validation.reasons)
|
||||
repair_input = json.dumps(
|
||||
{
|
||||
"draft_answer": draft_answer,
|
||||
"validation_reasons": validation.reasons,
|
||||
"repair_focus": repair_focus,
|
||||
"prompt_payload": prompt_payload,
|
||||
},
|
||||
ensure_ascii=False,
|
||||
@@ -31,3 +33,24 @@ class CodeQaAnswerRepairService:
|
||||
repair_input,
|
||||
log_context="graph.project_qa.code_qa.repair",
|
||||
).strip()
|
||||
|
||||
def _repair_focus(self, reasons: list[str]) -> list[str]:
|
||||
mapping = {
|
||||
"missing_concrete_methods": "missing_concrete_methods",
|
||||
"missing_concrete_calls": "missing_concrete_calls",
|
||||
"missing_concrete_dependencies": "missing_concrete_dependencies",
|
||||
"missing_concrete_components": "missing_concrete_components",
|
||||
"missing_concrete_relations": "missing_concrete_relations",
|
||||
"missing_relation_verbs": "missing_relation_verbs",
|
||||
"missing_flow_steps": "missing_flow_steps",
|
||||
"missing_sequence_edges": "missing_sequence_edges",
|
||||
"too_vague_for_explain": "too_vague_for_explain",
|
||||
"too_vague_for_architecture": "too_vague_for_architecture",
|
||||
"too_vague_for_trace_flow": "too_vague_for_trace_flow",
|
||||
"semantic_labels_without_code_edges": "semantic_labels_without_code_edges",
|
||||
"contains_retrieval_artifacts": "contains_retrieval_artifacts",
|
||||
"methods_as_primary_components": "methods_as_primary_components",
|
||||
"overclaims_trace_completeness": "overclaims_trace_completeness",
|
||||
}
|
||||
result = [mapping[reason] for reason in reasons if reason in mapping]
|
||||
return result or ["tighten_to_evidence"]
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
class CodeQaShortAnswerFormatter:
|
||||
def open_file_not_found(self, target: str) -> str:
|
||||
return f"Файл {target} не найден."
|
||||
|
||||
def entity_not_found(self, target: str, alternatives: list[str]) -> str:
|
||||
base = f"Сущность {target} не найдена в доступном коде."
|
||||
suffix = self._alternatives(alternatives)
|
||||
return f"{base} {suffix}".strip()
|
||||
|
||||
def entity_ambiguous(self, target: str, alternatives: list[str]) -> str:
|
||||
base = f"Сущность {target} не удалось однозначно разрешить."
|
||||
suffix = self._alternatives(alternatives)
|
||||
return f"{base} {suffix}".strip()
|
||||
|
||||
def insufficient(self, message: str) -> str:
|
||||
normalized = (message or "").strip()
|
||||
if normalized:
|
||||
return normalized
|
||||
return "Недостаточно подтверждённых данных для уверенного ответа."
|
||||
|
||||
def related_only(self, target: str, alternatives: list[str]) -> str:
|
||||
base = f"Прямых подтверждений для сущности {target} не найдено."
|
||||
suffix = self._alternatives(alternatives)
|
||||
return f"{base} {suffix}".strip()
|
||||
|
||||
def _alternatives(self, alternatives: list[str]) -> str:
|
||||
items = [item.strip() for item in alternatives if item and item.strip()]
|
||||
if not items:
|
||||
return ""
|
||||
return f"Близкие варианты: {', '.join(items[:3])}."
|
||||
@@ -17,9 +17,15 @@
|
||||
Не выводи пустые разделы, пустые списки и формулировки вида "кандидатов нет", если это не помогает ответу.
|
||||
|
||||
Дай архитектурное объяснение без лишней теории.
|
||||
Назови подтверждённые компоненты и конкретные связи между ними: создаёт, вызывает, регистрирует, читает, пишет, передаёт, оборачивает.
|
||||
Строй ответ вокруг concrete facts из payload: `must_mention_components`, `must_mention_relations`, `must_use_relation_verbs`.
|
||||
Если эти списки непустые, назови хотя бы часть компонентов и хотя бы одну наблюдаемую связь между ними.
|
||||
Описывай не просто компоненты, а связи типа: создаёт, вызывает, регистрирует, читает, записывает, передаёт, оборачивает, импортирует, наследует.
|
||||
Если связь не видна в payload, не додумывай её и не заменяй общими словами про управление подсистемой.
|
||||
Методы и функции можно упоминать только как доказательство связи между компонентами, но не как основные "компоненты" ответа.
|
||||
Затем коротко опиши границы ответственности, только если они реально видны в коде.
|
||||
Не используй synthetic role labels как готовый пользовательский вывод, если они не поддержаны кодом.
|
||||
Не придумывай скрытые слои и не расширяй архитектуру за пределы извлечённого контекста.
|
||||
Не используй обязательные markdown-секции.
|
||||
Не используй абстрактные формулы вроде "главный компонент", "центральный управляющий компонент", "управляет потоками данных и состоянием системы", если конкретная связь не раскрыта через наблюдаемые методы, поля или вызовы.
|
||||
Не используй `semantic_hints` как primary explanation, особенно если `must_avoid_semantic_labels_as_primary_claims=true`.
|
||||
Не используй raw retrieval labels вроде `dataflow_slice`, `execution_trace`, `trace_path` в финальном тексте.
|
||||
Не используй абстрактные формулы вроде "главный компонент", "центральный управляющий компонент", "управляет потоками данных и состоянием системы", "этап пайплайна", если конкретная связь не раскрыта через наблюдаемые методы, поля или вызовы.
|
||||
|
||||
@@ -18,9 +18,15 @@
|
||||
|
||||
Объясни, как работает сущность из вопроса пользователя, обычным инженерным текстом.
|
||||
Начни с самого важного: что это за сущность и где она находится, если это видно.
|
||||
Затем кратко опиши подтверждённые зависимости, вызовы, аргументы, поля или шаги работы, только если они реально видны.
|
||||
Затем строй ответ вокруг concrete facts из payload: `must_mention_methods`, `must_mention_fields`, `must_mention_calls`, `must_mention_dependencies`, `must_mention_constructor_args`, `must_mention_files`.
|
||||
Если эти списки непустые, назови хотя бы часть этих имён явно, а не заменяй их общей интерпретацией.
|
||||
Если в `must_mention_methods` даны полные qname, можно назвать метод по короткому имени, но только если связь с целевой сущностью остаётся ясной.
|
||||
Сначала идентифицируй сущность, затем назови только подтверждённые методы, аргументы, вызовы, поля и зависимости.
|
||||
Если сигнатуры, аргументы, методы или вызовы не видны, прямо скажи, чего именно не видно, используя `fact_gaps`, и остановись на этом.
|
||||
Не используй общие формулы без конкретных имён.
|
||||
Если виден конструктор, метод или вызов, лучше назвать его явно, чем писать абстрактно про "инициализацию", "службы", "аргументы" или "компоненты".
|
||||
Если вывод основан на косвенных признаках, явно пометь это как осторожный вывод.
|
||||
Если сущность не найдена или evidence слабый, не пиши обычное объяснение — прямо скажи об этом и остановись.
|
||||
Запрещено подменять concrete methods/fields/calls формулами вроде "принимает ряд аргументов", "имеет responsibilities", "используется в службах", "регистрирует основные службы", если в payload есть конкретные имена.
|
||||
Не используй `semantic_hints` как основной каркас ответа. Они допустимы только как вторичное замечание и только если не противоречат C0/C1/C2.
|
||||
Не используй обязательные секции и подзаголовки.
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
Найди точки входа, обработчики запуска или важные entrypoints.
|
||||
Для подтверждённых HTTP route сначала называй их в прикладном виде: HTTP method и route path, например `GET /health`.
|
||||
Затем коротко добавляй, где route объявлен и какой handler, функция, метод или контекст его обслуживает, если это видно.
|
||||
Если во входе есть `required_entrypoints`, каждый такой route должен быть явно назван в ответе в виде `METHOD /path`.
|
||||
Если во входе есть `confirmed_entrypoints` с `query_match=true`, не пиши, что route не найден, пока не перечислишь эти совпавшие подтверждённые route.
|
||||
Подтверждённые entrypoints перечисляй первыми.
|
||||
Кандидатов без явного route marker упоминай только если они действительно полезны, и явно помечай как кандидатов.
|
||||
Не своди ответ к обсуждению декораторов вроде `@app.get`; пользователю важнее method, path и контекст.
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
Ты исправляешь черновой ответ по коду после проверки groundedness.
|
||||
Сделай ответ короче, точнее и строже по evidence payload.
|
||||
Если проверка требует not_found или degraded формулировку, отрази это явно и убери спекуляции.
|
||||
Если в `repair_focus` есть причины для `EXPLAIN`, перепиши ответ так, чтобы он назвал concrete methods, calls, fields, constructor args или dependencies из payload, а не общие responsibilities.
|
||||
Если в `repair_focus` есть причины для `ARCHITECTURE`, перепиши ответ так, чтобы он назвал concrete components и связи с relation verbs из payload: создает, вызывает, читает, записывает, импортирует, наследует.
|
||||
Если в `repair_focus` есть причины для `TRACE_FLOW`, перепиши ответ как последовательность concrete steps с явными methods/calls/edges из payload. Если виден только partial flow, так и скажи.
|
||||
Если в `repair_focus` есть `semantic_labels_without_code_edges`, убери semantic role labels из основной формулировки, если они не подкреплены concrete code edges.
|
||||
Если в `repair_focus` есть `contains_retrieval_artifacts` или `methods_as_primary_components`, убери raw retrieval labels и не выдавай методы за компоненты.
|
||||
Если в `repair_focus` есть `overclaims_trace_completeness`, убери фразы про полный/полностью восстановленный flow, если payload не подтверждает это явно.
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
Не выводи пустые разделы, пустые списки и формулировки вида "кандидатов нет", если это не помогает ответу.
|
||||
|
||||
Проследи поток выполнения или поток данных по найденным артефактам.
|
||||
Старайся описывать шаги последовательно и коротко, без лишних подзаголовков.
|
||||
Строй ответ вокруг `must_mention_flow_steps`, `must_mention_calls` и `must_mention_sequence_edges` из payload.
|
||||
Старайся описывать шаги последовательно и коротко, без лишних подзаголовков: сначала, затем, после этого, в конце.
|
||||
Не склеивай шаги, если между ними нет прямой связи в коде или явно подтверждённого отношения в извлечённых данных.
|
||||
Если поток восстанавливается только частично, так и скажи.
|
||||
Если поток восстанавливается только частично, так и скажи, опираясь на `fact_gaps`, и не заявляй, что flow восстановлен полностью.
|
||||
Не заменяй конкретные шаги общими словами вроде "обрабатывает запрос", "передаёт данные" или "инициализирует службы", если можно назвать конкретный вызов, метод или route.
|
||||
Не используй сильные формулировки вроде "полностью восстанавливается", "полный поток виден", если payload показывает только часть цепочки.
|
||||
|
||||
300
src/app/modules/rag/code_qa_pipeline/answer_fact_curator.py
Normal file
300
src/app/modules/rag/code_qa_pipeline/answer_fact_curator.py
Normal file
@@ -0,0 +1,300 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
from typing import Any
|
||||
|
||||
from app.modules.rag.code_qa_pipeline.contracts import CodeChunkItem, EvidenceBundle
|
||||
|
||||
_CALL_RE = re.compile(r"([A-Za-z_][\w\.]*)\s*\(")
|
||||
_FIELD_RE = re.compile(r"self\.(\w+)")
|
||||
_SIGNATURE_RE = re.compile(r"(?P<name>[A-Za-z_][\w\.]*)\((?P<args>[^)]*)\)")
|
||||
_RETRIEVAL_LABELS = ("dataflow_slice", "execution_trace", "trace_path")
|
||||
_RELATION_VERBS = {
|
||||
"calls": "вызывает",
|
||||
"instantiates": "создает",
|
||||
"inherits": "наследует",
|
||||
"imports": "импортирует",
|
||||
"reads_attr": "читает",
|
||||
"writes_attr": "записывает",
|
||||
}
|
||||
|
||||
|
||||
def build_curated_answer_facts(bundle: EvidenceBundle) -> dict[str, Any]:
|
||||
target = str(bundle.resolved_target or "").strip()
|
||||
semantic_hints = _semantic_hints(bundle.code_chunks)
|
||||
primary_chunks = [chunk for chunk in bundle.code_chunks if chunk.layer != "C4_SEMANTIC_ROLES"]
|
||||
relations = _normalized_relations(bundle.relations)
|
||||
target_relations = [relation for relation in relations if _is_target_relation(relation, target)]
|
||||
|
||||
return {
|
||||
"scenario": (bundle.resolved_sub_intent or "EXPLAIN").upper(),
|
||||
"semantic_hints": semantic_hints,
|
||||
"primary_chunk_count": len(primary_chunks),
|
||||
"relation_count": len(relations),
|
||||
"explain": _explain_facts(bundle, primary_chunks, target_relations),
|
||||
"architecture": _architecture_facts(bundle, primary_chunks, target_relations),
|
||||
"trace_flow": _trace_flow_facts(bundle, primary_chunks, target_relations),
|
||||
}
|
||||
|
||||
|
||||
def _explain_facts(bundle: EvidenceBundle, chunks: list[CodeChunkItem], relations: list[dict[str, Any]]) -> dict[str, Any]:
|
||||
target = str(bundle.resolved_target or "").strip()
|
||||
signatures = [_signature_payload(chunk) for chunk in chunks if chunk.layer == "C1_SYMBOL_CATALOG"]
|
||||
target_signatures = [item for item in signatures if _is_target_symbol(item["name"], target)]
|
||||
methods = _unique(item["name"] for item in target_signatures if item["kind"] == "method")
|
||||
constructor_args = _unique(
|
||||
arg
|
||||
for item in target_signatures
|
||||
if item["name"].endswith(".__init__")
|
||||
for arg in item["args"]
|
||||
if arg not in {"self", "cls"}
|
||||
)
|
||||
calls = _unique(
|
||||
_display_call_target(relation["target"])
|
||||
for relation in relations
|
||||
if relation["edge_type"] in {"calls", "instantiates"}
|
||||
)
|
||||
if not calls:
|
||||
calls = _fallback_calls(chunks, target)
|
||||
fields = _unique(
|
||||
relation["target"].split(".", 1)[-1]
|
||||
for relation in relations
|
||||
if relation["edge_type"] in {"reads_attr", "writes_attr"}
|
||||
)
|
||||
if not fields:
|
||||
fields = _unique(field for chunk in chunks if _chunk_matches_target(chunk, target) for field in _FIELD_RE.findall(chunk.content or ""))
|
||||
dependencies = _unique(
|
||||
_display_dependency_target(relation["target"])
|
||||
for relation in relations
|
||||
if relation["edge_type"] in {"imports", "instantiates"}
|
||||
)
|
||||
required_files = _unique(chunk.path for chunk in chunks if _chunk_matches_target(chunk, target) and chunk.path)
|
||||
required_symbols = _unique(item["name"] for item in target_signatures if item["name"]) or _unique([target] if target else bundle.target_symbol_candidates)
|
||||
|
||||
fact_gaps: list[str] = []
|
||||
if not methods:
|
||||
fact_gaps.append("Методы целевой сущности не подтверждены в извлеченных C0/C1 данных.")
|
||||
if not calls:
|
||||
fact_gaps.append("Конкретные вызовы целевой сущности не подтверждены в C2/C0.")
|
||||
if not dependencies:
|
||||
fact_gaps.append("Явные зависимости целевой сущности не подтверждены.")
|
||||
|
||||
return {
|
||||
"required_symbols": required_symbols[:8],
|
||||
"required_methods": methods[:6],
|
||||
"required_calls": calls[:6],
|
||||
"required_fields": fields[:6],
|
||||
"required_constructor_args": constructor_args[:6],
|
||||
"required_dependencies": dependencies[:6],
|
||||
"required_files": required_files[:4],
|
||||
"fact_gaps": fact_gaps,
|
||||
}
|
||||
|
||||
|
||||
def _architecture_facts(bundle: EvidenceBundle, chunks: list[CodeChunkItem], relations: list[dict[str, Any]]) -> dict[str, Any]:
|
||||
target = str(bundle.resolved_target or "").strip()
|
||||
components = _unique(
|
||||
([target] if target else [])
|
||||
+ [_component_name(relation["source"]) for relation in relations]
|
||||
+ [_component_name(relation["target"]) for relation in relations]
|
||||
+ [_component_name(chunk.title) for chunk in chunks if _chunk_matches_target(chunk, target)]
|
||||
)
|
||||
relation_rows = [
|
||||
{
|
||||
"source": _component_name(relation["source"]),
|
||||
"verb": relation["verb"],
|
||||
"target": _component_name(relation["target"]),
|
||||
"source_method": relation["source"],
|
||||
"target_method": relation["target"],
|
||||
"path": relation["path"],
|
||||
"line_span": relation["line_span"],
|
||||
"edge_type": relation["edge_type"],
|
||||
}
|
||||
for relation in relations
|
||||
if _component_name(relation["source"]) and _component_name(relation["target"])
|
||||
]
|
||||
relation_rows = [row for row in relation_rows if row["source"] != row["target"]]
|
||||
relation_verbs = _unique(row["verb"] for row in relation_rows if row["verb"])
|
||||
fact_gaps: list[str] = []
|
||||
if not relation_rows:
|
||||
fact_gaps.append("Concrete code edges между компонентами не подтверждены.")
|
||||
|
||||
return {
|
||||
"required_components": components[:8],
|
||||
"required_relations": relation_rows[:8],
|
||||
"required_relation_verbs": relation_verbs[:6],
|
||||
"required_creation_edges": [row for row in relation_rows if row["edge_type"] == "instantiates"][:4],
|
||||
"required_call_edges": [row for row in relation_rows if row["edge_type"] == "calls"][:4],
|
||||
"required_registration_edges": [row for row in relation_rows if row["edge_type"] == "imports"][:4],
|
||||
"required_data_edges": [row for row in relation_rows if row["edge_type"] in {"reads_attr", "writes_attr"}][:4],
|
||||
"fact_gaps": fact_gaps,
|
||||
"forbidden_labels": list(_RETRIEVAL_LABELS),
|
||||
}
|
||||
|
||||
|
||||
def _trace_flow_facts(bundle: EvidenceBundle, chunks: list[CodeChunkItem], relations: list[dict[str, Any]]) -> dict[str, Any]:
|
||||
target = str(bundle.resolved_target or "").strip()
|
||||
flow_steps = [
|
||||
{
|
||||
"step": index,
|
||||
"source": relation["source"],
|
||||
"verb": relation["verb"],
|
||||
"target": relation["target"],
|
||||
"path": relation["path"],
|
||||
"line_span": relation["line_span"],
|
||||
}
|
||||
for index, relation in enumerate(sorted(relations, key=lambda item: (item["path"], item["sort_line"], item["source"], item["target"])), start=1)
|
||||
]
|
||||
fact_gaps: list[str] = []
|
||||
if len(flow_steps) < 2:
|
||||
fact_gaps.append("Полная последовательность шагов не подтверждена; виден только частичный flow.")
|
||||
if not flow_steps:
|
||||
fact_gaps.append("Конкретные sequence edges для flow не подтверждены.")
|
||||
|
||||
return {
|
||||
"required_flow_steps": flow_steps[:8],
|
||||
"required_calls": _unique(_display_call_target(item["target"]) for item in flow_steps),
|
||||
"required_sequence_edges": flow_steps[:8],
|
||||
"required_files": _unique(chunk.path for chunk in chunks if _chunk_matches_target(chunk, target) and chunk.path)[:4],
|
||||
"fact_gaps": fact_gaps,
|
||||
}
|
||||
|
||||
|
||||
def _semantic_hints(chunks: list[CodeChunkItem]) -> list[dict[str, Any]]:
|
||||
hints: list[dict[str, Any]] = []
|
||||
for chunk in chunks:
|
||||
if chunk.layer != "C4_SEMANTIC_ROLES":
|
||||
continue
|
||||
meta = dict(chunk.metadata or {})
|
||||
hints.append(
|
||||
{
|
||||
"symbol": meta.get("symbol_name") or chunk.title,
|
||||
"role": meta.get("role"),
|
||||
"path": chunk.path,
|
||||
"confidence": meta.get("confidence"),
|
||||
}
|
||||
)
|
||||
return hints[:8]
|
||||
|
||||
|
||||
def _normalized_relations(relations: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
||||
normalized: list[dict[str, Any]] = []
|
||||
for relation in relations:
|
||||
metadata = dict(relation.get("metadata") or {})
|
||||
edge_type = str(metadata.get("edge_type") or relation.get("edge_type") or "").strip()
|
||||
source = _clean_endpoint(str(metadata.get("src_qname") or relation.get("source") or "").strip())
|
||||
target = _clean_endpoint(str(metadata.get("dst_ref") or relation.get("target") or "").strip())
|
||||
if not edge_type or not source or not target:
|
||||
continue
|
||||
normalized.append(
|
||||
{
|
||||
"edge_type": edge_type,
|
||||
"source": source,
|
||||
"target": target,
|
||||
"verb": _RELATION_VERBS.get(edge_type, edge_type),
|
||||
"path": str(relation.get("path") or ""),
|
||||
"line_span": _line_span(relation),
|
||||
"sort_line": int(relation.get("start_line") or 0),
|
||||
}
|
||||
)
|
||||
return normalized
|
||||
|
||||
|
||||
def _signature_payload(chunk: CodeChunkItem) -> dict[str, Any]:
|
||||
meta = dict(chunk.metadata or {})
|
||||
signature = str(meta.get("signature") or chunk.content or "").strip()
|
||||
match = _SIGNATURE_RE.search(signature)
|
||||
args = [part.strip() for part in match.group("args").split(",") if part.strip()] if match else []
|
||||
return {
|
||||
"name": _clean_endpoint(str(meta.get("qname") or chunk.title or "").strip()),
|
||||
"kind": str(meta.get("kind") or "").strip(),
|
||||
"args": args,
|
||||
}
|
||||
|
||||
|
||||
def _fallback_calls(chunks: list[CodeChunkItem], target: str) -> list[str]:
|
||||
values: list[str] = []
|
||||
for chunk in chunks:
|
||||
if not _chunk_matches_target(chunk, target):
|
||||
continue
|
||||
values.extend(_display_call_target(item) for item in _CALL_RE.findall(chunk.content or ""))
|
||||
return _unique(values)
|
||||
|
||||
|
||||
def _chunk_matches_target(chunk: CodeChunkItem, target: str) -> bool:
|
||||
if not target:
|
||||
return True
|
||||
title = _clean_endpoint(chunk.title)
|
||||
symbol = _clean_endpoint(str(dict(chunk.metadata or {}).get("qname") or ""))
|
||||
return _is_target_symbol(title, target) or _is_target_symbol(symbol, target) or target.lower() in (chunk.content or "").lower()
|
||||
|
||||
|
||||
def _is_target_relation(relation: dict[str, Any], target: str) -> bool:
|
||||
if not target:
|
||||
return True
|
||||
return _is_target_symbol(relation["source"], target) or _component_name(relation["source"]) == target or _component_name(relation["target"]) == target
|
||||
|
||||
|
||||
def _is_target_symbol(name: str, target: str) -> bool:
|
||||
clean_name = _clean_endpoint(name)
|
||||
clean_target = _clean_endpoint(target)
|
||||
if not clean_target:
|
||||
return True
|
||||
return clean_name == clean_target or clean_name.startswith(f"{clean_target}.")
|
||||
|
||||
|
||||
def _component_name(value: str) -> str:
|
||||
clean = _clean_endpoint(value)
|
||||
if not clean:
|
||||
return ""
|
||||
parts = clean.split(".")
|
||||
if len(parts) <= 1:
|
||||
return clean
|
||||
if len(parts) == 2:
|
||||
return clean if parts[1][:1].isupper() else parts[0]
|
||||
return ".".join(parts[:-1])
|
||||
|
||||
|
||||
def _display_call_target(value: str) -> str:
|
||||
clean = _clean_endpoint(value)
|
||||
if not clean:
|
||||
return ""
|
||||
tail = clean.rsplit(".", 1)[-1]
|
||||
return f"{tail}()" if tail and tail != clean else clean
|
||||
|
||||
|
||||
def _display_dependency_target(value: str) -> str:
|
||||
clean = _clean_endpoint(value)
|
||||
if not clean:
|
||||
return ""
|
||||
return _component_name(clean) or clean
|
||||
|
||||
|
||||
def _clean_endpoint(value: str) -> str:
|
||||
clean = str(value or "").strip()
|
||||
if not clean:
|
||||
return ""
|
||||
for label in _RETRIEVAL_LABELS:
|
||||
clean = clean.replace(f".{label}", "")
|
||||
clean = clean.replace(label, "")
|
||||
return clean.strip(".: ")
|
||||
|
||||
|
||||
def _line_span(item: dict[str, Any]) -> str:
|
||||
start = item.get("start_line")
|
||||
end = item.get("end_line")
|
||||
if start is None and end is None:
|
||||
return "?:?"
|
||||
return f"{start or '?'}-{end or '?'}"
|
||||
|
||||
|
||||
def _unique(values: Any) -> list[str]:
|
||||
seen: set[str] = set()
|
||||
result: list[str] = []
|
||||
for value in values:
|
||||
text = str(value or "").strip()
|
||||
if not text or text in seen:
|
||||
continue
|
||||
seen.add(text)
|
||||
result.append(text)
|
||||
return result
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from app.modules.rag.code_qa_pipeline.answer_fact_curator import build_curated_answer_facts
|
||||
from app.modules.rag.code_qa_pipeline.contracts import AnswerSynthesisInput, EvidenceBundle
|
||||
|
||||
|
||||
@@ -13,11 +14,16 @@ def build_answer_synthesis_input(
|
||||
scenario = bundle.resolved_sub_intent or "EXPLAIN"
|
||||
target = bundle.resolved_target
|
||||
sufficient = bundle.sufficient
|
||||
curated = build_curated_answer_facts(bundle)
|
||||
semantic_hints = list(curated.get("semantic_hints") or [])
|
||||
|
||||
fast_lines = [
|
||||
f"Scenario: {scenario}",
|
||||
f"Target: {target or 'none'}",
|
||||
f"Evidence chunks: {bundle.evidence_count}",
|
||||
f"Primary chunks: {curated.get('primary_chunk_count', 0)}",
|
||||
f"Semantic hints: {len(semantic_hints)}",
|
||||
f"Relations: {curated.get('relation_count', 0)}",
|
||||
f"Sufficient: {sufficient}",
|
||||
]
|
||||
if bundle.failure_reasons:
|
||||
@@ -25,18 +31,21 @@ def build_answer_synthesis_input(
|
||||
fast_context = "\n".join(fast_lines)
|
||||
|
||||
deep_parts = []
|
||||
for i, c in enumerate(bundle.code_chunks[:30], 1):
|
||||
primary_chunks = [chunk for chunk in bundle.code_chunks if scenario.upper() not in {"EXPLAIN", "ARCHITECTURE"} or chunk.layer != "C4_SEMANTIC_ROLES"]
|
||||
for i, c in enumerate(primary_chunks[:30], 1):
|
||||
deep_parts.append(f"[{i}] {c.path}:{c.start_line or '?'}-{c.end_line or '?'}\n{c.content[:800]}")
|
||||
deep_context = "\n\n---\n\n".join(deep_parts) if deep_parts else "(no code chunks)"
|
||||
|
||||
evidence_summary = []
|
||||
for c in bundle.code_chunks[:20]:
|
||||
for c in primary_chunks[:20]:
|
||||
evidence_summary.append({
|
||||
"layer": c.layer,
|
||||
"path": c.path,
|
||||
"title": c.title,
|
||||
"lines": f"{c.start_line or '?'}-{c.end_line or '?'}",
|
||||
})
|
||||
if semantic_hints:
|
||||
evidence_summary.append({"kind": "semantic_hints", "count": len(semantic_hints)})
|
||||
if bundle.entrypoints:
|
||||
evidence_summary.append({"kind": "entrypoints", "count": len(bundle.entrypoints)})
|
||||
if bundle.test_evidence:
|
||||
@@ -45,6 +54,9 @@ def build_answer_synthesis_input(
|
||||
hints = list(bundle.failure_reasons) if bundle.failure_reasons else []
|
||||
if not sufficient and bundle.retrieval_summary.get("missing_layers"):
|
||||
hints.append(f"Missing layers: {', '.join(bundle.retrieval_summary['missing_layers'])}")
|
||||
scenario_key = scenario.lower()
|
||||
scenario_facts = dict(curated.get(scenario_key) or {})
|
||||
hints.extend(list(scenario_facts.get("fact_gaps") or []))
|
||||
|
||||
return AnswerSynthesisInput(
|
||||
user_question=user_question,
|
||||
@@ -53,6 +65,8 @@ def build_answer_synthesis_input(
|
||||
fast_context=fast_context,
|
||||
deep_context=deep_context,
|
||||
evidence_summary=evidence_summary,
|
||||
semantic_hints=semantic_hints,
|
||||
curated_facts=curated,
|
||||
evidence_sufficient=sufficient,
|
||||
diagnostic_hints=hints,
|
||||
)
|
||||
|
||||
@@ -98,6 +98,7 @@ class RetrievalResult(BaseModel):
|
||||
file_candidates: list[str] = Field(default_factory=list)
|
||||
code_chunks: list[CodeChunkItem] = Field(default_factory=list)
|
||||
relations: list[dict[str, Any]] = Field(default_factory=list)
|
||||
semantic_hints: list[dict[str, Any]] = Field(default_factory=list)
|
||||
entrypoints: list[dict[str, Any]] = Field(default_factory=list)
|
||||
test_candidates: list[dict[str, Any]] = Field(default_factory=list)
|
||||
layer_outcomes: list[LayerOutcome] = Field(default_factory=list)
|
||||
@@ -138,6 +139,8 @@ class AnswerSynthesisInput(BaseModel):
|
||||
fast_context: str = ""
|
||||
deep_context: str = ""
|
||||
evidence_summary: list[dict[str, Any]] = Field(default_factory=list)
|
||||
semantic_hints: list[dict[str, Any]] = Field(default_factory=list)
|
||||
curated_facts: dict[str, Any] = Field(default_factory=dict)
|
||||
evidence_sufficient: bool = False
|
||||
diagnostic_hints: list[str] = Field(default_factory=list)
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ def build_evidence_bundle(
|
||||
summary = {
|
||||
"chunk_count": len(retrieval_result.code_chunks),
|
||||
"relation_count": len(retrieval_result.relations),
|
||||
"semantic_hint_count": len(retrieval_result.semantic_hints),
|
||||
"entrypoint_count": len(retrieval_result.entrypoints),
|
||||
"test_candidate_count": len(retrieval_result.test_candidates),
|
||||
"layers_with_hits": [
|
||||
|
||||
@@ -2,13 +2,14 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from app.modules.rag.code_qa_pipeline.contracts import (
|
||||
CodeChunkItem,
|
||||
LayerOutcome,
|
||||
RetrievalResult,
|
||||
)
|
||||
import re
|
||||
|
||||
from app.modules.rag.code_qa_pipeline.contracts import CodeChunkItem, LayerOutcome, RetrievalResult
|
||||
from app.modules.rag.retrieval.test_filter import is_test_path
|
||||
|
||||
_ROUTE_RE = re.compile(r'@[\w\.]+\.(get|post|put|delete|patch|options|head)\(\s*["\']([^"\']+)["\']')
|
||||
_DEF_RE = re.compile(r"async\s+def\s+(\w+)|def\s+(\w+)")
|
||||
|
||||
|
||||
def build_retrieval_result(
|
||||
raw_rows: list[dict],
|
||||
@@ -21,52 +22,210 @@ def build_retrieval_result(
|
||||
layers_seen: set[str] = set()
|
||||
code_chunks: list[CodeChunkItem] = []
|
||||
relations: list[dict] = []
|
||||
entrypoints: list[dict] = []
|
||||
semantic_hints: list[dict] = []
|
||||
entrypoint_rows: list[CodeChunkItem] = []
|
||||
test_candidates: list[dict] = []
|
||||
file_candidates: list[str] = []
|
||||
target_symbols: list[str] = []
|
||||
|
||||
for row in raw_rows:
|
||||
layer = str(row.get("layer") or "")
|
||||
path = str(row.get("path") or "")
|
||||
chunk = _to_chunk(row)
|
||||
layer = chunk.layer
|
||||
path = chunk.path
|
||||
if layer:
|
||||
layers_seen.add(layer)
|
||||
if path and path not in file_candidates:
|
||||
file_candidates.append(path)
|
||||
code_chunks.append(chunk)
|
||||
|
||||
chunk = CodeChunkItem(
|
||||
layer=layer,
|
||||
path=path,
|
||||
if layer == "C1_SYMBOL_CATALOG":
|
||||
title = chunk.title.strip()
|
||||
if title and title not in target_symbols:
|
||||
target_symbols.append(title)
|
||||
continue
|
||||
if layer == "C2_DEPENDENCY_GRAPH":
|
||||
relations.append(_relation_payload(chunk))
|
||||
continue
|
||||
if layer == "C4_SEMANTIC_ROLES":
|
||||
semantic_hints.append(_semantic_hint_payload(chunk))
|
||||
continue
|
||||
if layer == "C3_ENTRYPOINTS":
|
||||
entrypoint_rows.append(chunk)
|
||||
continue
|
||||
if is_test_path(path):
|
||||
test_candidates.append({"path": path, "title": chunk.title, "content": chunk.content[:300]})
|
||||
|
||||
entrypoints = _normalize_entrypoints(entrypoint_rows, code_chunks)
|
||||
executed = list(report.get("executed_layers") or [])
|
||||
missing_layers = [lid for lid in executed if lid not in layers_seen]
|
||||
layer_outcomes = _layer_outcomes(raw_rows, executed, layers_seen, report)
|
||||
|
||||
resolved = str(sym.get("resolved_symbol") or "").strip() or None
|
||||
status = str(sym.get("status") or "not_requested")
|
||||
|
||||
return RetrievalResult(
|
||||
target_symbol_candidates=target_symbols,
|
||||
resolved_symbol=resolved,
|
||||
symbol_resolution_status=status,
|
||||
file_candidates=file_candidates,
|
||||
code_chunks=code_chunks,
|
||||
relations=relations,
|
||||
semantic_hints=semantic_hints,
|
||||
entrypoints=entrypoints,
|
||||
test_candidates=test_candidates,
|
||||
layer_outcomes=layer_outcomes,
|
||||
missing_layers=missing_layers,
|
||||
raw_rows=raw_rows,
|
||||
retrieval_report=report,
|
||||
)
|
||||
|
||||
|
||||
def _to_chunk(row: dict) -> CodeChunkItem:
|
||||
return CodeChunkItem(
|
||||
layer=str(row.get("layer") or ""),
|
||||
path=str(row.get("path") or ""),
|
||||
title=str(row.get("title") or ""),
|
||||
content=str(row.get("content") or ""),
|
||||
start_line=row.get("span_start"),
|
||||
end_line=row.get("span_end"),
|
||||
metadata=dict(row.get("metadata") or {}),
|
||||
)
|
||||
code_chunks.append(chunk)
|
||||
|
||||
if layer == "C1_SYMBOL_CATALOG":
|
||||
title = str(row.get("title") or "").strip()
|
||||
if title and title not in target_symbols:
|
||||
target_symbols.append(title)
|
||||
elif layer == "C2_DEPENDENCY_GRAPH":
|
||||
relations.append({"path": path, "metadata": chunk.metadata, "content": chunk.content[:500]})
|
||||
elif layer == "C3_ENTRYPOINTS":
|
||||
entrypoints.append({"path": path, "title": chunk.title, "metadata": chunk.metadata})
|
||||
elif is_test_path(path):
|
||||
test_candidates.append({"path": path, "title": chunk.title, "content": chunk.content[:300]})
|
||||
|
||||
executed = list(report.get("executed_layers") or [])
|
||||
missing_layers = [lid for lid in executed if lid not in layers_seen]
|
||||
def _normalize_entrypoints(entrypoint_rows: list[CodeChunkItem], code_chunks: list[CodeChunkItem]) -> list[dict]:
|
||||
chunks_by_path: dict[str, list[CodeChunkItem]] = {}
|
||||
for chunk in code_chunks:
|
||||
chunks_by_path.setdefault(chunk.path, []).append(chunk)
|
||||
|
||||
normalized: list[dict] = []
|
||||
seen: set[tuple[str, str, str, int | None, int | None]] = set()
|
||||
for chunk in entrypoint_rows:
|
||||
item = _entrypoint_payload(chunk, chunks_by_path.get(chunk.path, []))
|
||||
key = (
|
||||
str(item.get("http_method") or ""),
|
||||
str(item.get("route_path") or ""),
|
||||
str(item.get("path") or ""),
|
||||
chunk.start_line,
|
||||
chunk.end_line,
|
||||
)
|
||||
if key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
normalized.append(item)
|
||||
return sorted(normalized, key=_entrypoint_sort_key)
|
||||
|
||||
|
||||
def _relation_payload(chunk: CodeChunkItem) -> dict:
|
||||
metadata = dict(chunk.metadata or {})
|
||||
edge_type = str(metadata.get("edge_type") or "").strip()
|
||||
src_qname = str(metadata.get("src_qname") or "").strip()
|
||||
dst_ref = str(metadata.get("dst_ref") or "").strip()
|
||||
return {
|
||||
"path": chunk.path,
|
||||
"start_line": chunk.start_line,
|
||||
"end_line": chunk.end_line,
|
||||
"edge_type": edge_type,
|
||||
"source": src_qname,
|
||||
"target": dst_ref,
|
||||
"source_component": _component_name(src_qname),
|
||||
"target_component": _component_name(dst_ref),
|
||||
"has_retrieval_label": "dataflow_slice" in dst_ref or "dataflow_slice" in src_qname,
|
||||
"metadata": metadata,
|
||||
"content": chunk.content[:500],
|
||||
}
|
||||
|
||||
|
||||
def _semantic_hint_payload(chunk: CodeChunkItem) -> dict:
|
||||
metadata = dict(chunk.metadata or {})
|
||||
return {
|
||||
"path": chunk.path,
|
||||
"title": chunk.title,
|
||||
"symbol": metadata.get("symbol_name") or chunk.title,
|
||||
"role": metadata.get("role"),
|
||||
"confidence": metadata.get("confidence"),
|
||||
"content": chunk.content[:300],
|
||||
}
|
||||
|
||||
|
||||
def _component_name(value: str) -> str:
|
||||
cleaned = str(value or "").replace(".dataflow_slice", "").strip(". ")
|
||||
if "." not in cleaned:
|
||||
return cleaned
|
||||
head, tail = cleaned.rsplit(".", 1)
|
||||
return head if tail and not tail[:1].isupper() else cleaned
|
||||
|
||||
|
||||
def _entrypoint_payload(chunk: CodeChunkItem, siblings: list[CodeChunkItem]) -> dict:
|
||||
methods = [str(item).strip().upper() for item in list(dict(chunk.metadata).get("lang_payload", {}).get("methods", [])) if str(item).strip()]
|
||||
method = methods[0] if methods else ""
|
||||
route_path = _infer_route_path(chunk, siblings)
|
||||
handler_symbol = _infer_handler_symbol(chunk, siblings)
|
||||
return {
|
||||
"path": chunk.path,
|
||||
"title": chunk.title,
|
||||
"start_line": chunk.start_line,
|
||||
"end_line": chunk.end_line,
|
||||
"http_method": method,
|
||||
"route_path": route_path,
|
||||
"handler_symbol": handler_symbol,
|
||||
"handler_symbol_id": dict(chunk.metadata).get("handler_symbol_id"),
|
||||
"route_or_command": dict(chunk.metadata).get("route_or_command"),
|
||||
"metadata": chunk.metadata,
|
||||
}
|
||||
|
||||
|
||||
def _infer_route_path(chunk: CodeChunkItem, siblings: list[CodeChunkItem]) -> str:
|
||||
for candidate in siblings:
|
||||
if candidate.layer != "C0_SOURCE_CHUNKS":
|
||||
continue
|
||||
match = _ROUTE_RE.search(_window_text(candidate, chunk.start_line))
|
||||
if match:
|
||||
return match.group(2).strip()
|
||||
return ""
|
||||
|
||||
|
||||
def _infer_handler_symbol(chunk: CodeChunkItem, siblings: list[CodeChunkItem]) -> str:
|
||||
for candidate in siblings:
|
||||
if candidate.layer != "C0_SOURCE_CHUNKS":
|
||||
continue
|
||||
match = _DEF_RE.search(_window_text(candidate, chunk.start_line, before=2, after=12))
|
||||
if match:
|
||||
return match.group(1) or match.group(2) or ""
|
||||
return ""
|
||||
|
||||
|
||||
def _window_text(chunk: CodeChunkItem, target_line: int | None, *, before: int = 6, after: int = 8) -> str:
|
||||
text = chunk.content or ""
|
||||
if not text or not target_line or not chunk.start_line:
|
||||
return text
|
||||
lines = text.splitlines()
|
||||
offset = max(0, target_line - chunk.start_line - before)
|
||||
end = min(len(lines), target_line - chunk.start_line + after)
|
||||
if offset >= end:
|
||||
return text
|
||||
return "\n".join(lines[offset:end])
|
||||
|
||||
|
||||
def _entrypoint_sort_key(item: dict) -> tuple[int, int, str, str, int]:
|
||||
route_path = str(item.get("route_path") or "")
|
||||
method = str(item.get("http_method") or "")
|
||||
score = 0
|
||||
if route_path:
|
||||
score += 3
|
||||
if route_path and route_path != "/":
|
||||
score += 3
|
||||
if method:
|
||||
score += 1
|
||||
return (-score, len(route_path or "zzzz"), method, str(item.get("path") or ""), int(item.get("start_line") or 0))
|
||||
|
||||
|
||||
def _layer_outcomes(raw_rows: list[dict], executed: list[str], layers_seen: set[str], report: dict) -> list[LayerOutcome]:
|
||||
layer_outcomes = [
|
||||
LayerOutcome(
|
||||
layer_id=layer_id,
|
||||
hit_count=sum(1 for r in raw_rows if str(r.get("layer") or "") == layer_id),
|
||||
empty=layer_id not in layers_seen,
|
||||
fallback_used=bool(
|
||||
(report.get("fallback") or {}).get("used")
|
||||
and report.get("retrieval_mode_by_layer", {}).get(layer_id)
|
||||
),
|
||||
fallback_used=bool((report.get("fallback") or {}).get("used") and report.get("retrieval_mode_by_layer", {}).get(layer_id)),
|
||||
)
|
||||
for layer_id in executed
|
||||
]
|
||||
@@ -80,21 +239,4 @@ def build_retrieval_result(
|
||||
fallback_used=False,
|
||||
)
|
||||
)
|
||||
|
||||
resolved = str(sym.get("resolved_symbol") or "").strip() or None
|
||||
status = str(sym.get("status") or "not_requested")
|
||||
|
||||
return RetrievalResult(
|
||||
target_symbol_candidates=target_symbols,
|
||||
resolved_symbol=resolved,
|
||||
symbol_resolution_status=status,
|
||||
file_candidates=file_candidates,
|
||||
code_chunks=code_chunks,
|
||||
relations=relations,
|
||||
entrypoints=entrypoints,
|
||||
test_candidates=test_candidates,
|
||||
layer_outcomes=layer_outcomes,
|
||||
missing_layers=missing_layers,
|
||||
raw_rows=raw_rows,
|
||||
retrieval_report=report,
|
||||
)
|
||||
return layer_outcomes
|
||||
|
||||
@@ -20,6 +20,6 @@ class GigaChatSettings:
|
||||
scope=os.getenv("GIGACHAT_SCOPE", "GIGACHAT_API_PERS"),
|
||||
credentials=os.getenv("GIGACHAT_TOKEN", "").strip(),
|
||||
ssl_verify=os.getenv("GIGACHAT_SSL_VERIFY", "true").lower() in {"1", "true", "yes"},
|
||||
model=os.getenv("GIGACHAT_MODEL", "GigaChat"),
|
||||
model=os.getenv("GIGACHAT_MODEL", "GigaChat-Pro"),
|
||||
embedding_model=os.getenv("GIGACHAT_EMBEDDING_MODEL", "Embeddings"),
|
||||
)
|
||||
|
||||
@@ -0,0 +1,323 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
|
||||
from app.modules.agent.code_qa_runtime.post_gate import CodeQaPostEvidenceGate
|
||||
from app.modules.agent.code_qa_runtime.prompt_payload_builder import CodeQaPromptPayloadBuilder
|
||||
from app.modules.rag.code_qa_pipeline.answer_synthesis import build_answer_synthesis_input
|
||||
from app.modules.rag.code_qa_pipeline.contracts import CodeChunkItem, EvidenceBundle
|
||||
from app.modules.rag.code_qa_pipeline.retrieval_result_builder import build_retrieval_result
|
||||
|
||||
|
||||
def test_retrieval_result_separates_semantic_hints_and_relations() -> None:
|
||||
raw = [
|
||||
{
|
||||
"layer": "C2_DEPENDENCY_GRAPH",
|
||||
"path": "src/runtime.py",
|
||||
"content": "RuntimeManager calls TraceService",
|
||||
"span_start": 10,
|
||||
"span_end": 10,
|
||||
"metadata": {"edge_type": "calls", "src_qname": "RuntimeManager.start", "dst_ref": "TraceService.record"},
|
||||
},
|
||||
{
|
||||
"layer": "C4_SEMANTIC_ROLES",
|
||||
"path": "src/runtime.py",
|
||||
"title": "RuntimeManager",
|
||||
"content": "role: orchestrator",
|
||||
"span_start": 1,
|
||||
"span_end": 20,
|
||||
"metadata": {"symbol_name": "RuntimeManager", "role": "orchestrator", "confidence": 0.7},
|
||||
},
|
||||
]
|
||||
result = build_retrieval_result(raw, {"executed_layers": ["C2_DEPENDENCY_GRAPH", "C4_SEMANTIC_ROLES"]}, {"status": "resolved"})
|
||||
assert result.relations[0]["edge_type"] == "calls"
|
||||
assert result.relations[0]["source"] == "RuntimeManager.start"
|
||||
assert result.semantic_hints[0]["role"] == "orchestrator"
|
||||
|
||||
|
||||
def test_answer_synthesis_curates_explain_facts_and_demotes_c4() -> None:
|
||||
bundle = EvidenceBundle(
|
||||
resolved_sub_intent="EXPLAIN",
|
||||
resolved_target="RuntimeManager",
|
||||
target_type="symbol",
|
||||
evidence_count=4,
|
||||
sufficient=True,
|
||||
code_chunks=[
|
||||
CodeChunkItem(
|
||||
layer="C1_SYMBOL_CATALOG",
|
||||
path="src/runtime.py",
|
||||
title="RuntimeManager.__init__",
|
||||
content="__init__(self, tracer, registry)",
|
||||
start_line=1,
|
||||
end_line=3,
|
||||
metadata={"qname": "RuntimeManager.__init__", "kind": "method", "signature": "__init__(self, tracer, registry)"},
|
||||
),
|
||||
CodeChunkItem(
|
||||
layer="C0_SOURCE_CHUNKS",
|
||||
path="src/runtime.py",
|
||||
title="",
|
||||
content="self.tracer = tracer\nself.registry = registry\nself.tracer.record()\n",
|
||||
start_line=1,
|
||||
end_line=4,
|
||||
metadata={},
|
||||
),
|
||||
CodeChunkItem(
|
||||
layer="C4_SEMANTIC_ROLES",
|
||||
path="src/runtime.py",
|
||||
title="RuntimeManager",
|
||||
content="role: orchestrator",
|
||||
start_line=1,
|
||||
end_line=4,
|
||||
metadata={"symbol_name": "RuntimeManager", "role": "orchestrator"},
|
||||
),
|
||||
],
|
||||
relations=[
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"start_line": 3,
|
||||
"end_line": 3,
|
||||
"metadata": {"edge_type": "calls", "src_qname": "RuntimeManager.__init__", "dst_ref": "self.tracer.record"},
|
||||
}
|
||||
],
|
||||
)
|
||||
synthesis = build_answer_synthesis_input("Explain RuntimeManager", bundle)
|
||||
explain = synthesis.curated_facts["explain"]
|
||||
assert "RuntimeManager.__init__" in explain["required_methods"]
|
||||
assert "tracer" in explain["required_constructor_args"]
|
||||
assert "record" in synthesis.deep_context or "self.tracer.record" in json.dumps(explain)
|
||||
assert "orchestrator" not in synthesis.deep_context
|
||||
assert synthesis.semantic_hints[0]["role"] == "orchestrator"
|
||||
|
||||
|
||||
def test_prompt_payload_builder_adds_explain_constraints() -> None:
|
||||
bundle = EvidenceBundle(resolved_sub_intent="EXPLAIN", resolved_target="RuntimeManager")
|
||||
synthesis = build_answer_synthesis_input(
|
||||
"Explain RuntimeManager",
|
||||
EvidenceBundle(
|
||||
resolved_sub_intent="EXPLAIN",
|
||||
resolved_target="RuntimeManager",
|
||||
code_chunks=[
|
||||
CodeChunkItem(
|
||||
layer="C1_SYMBOL_CATALOG",
|
||||
path="src/runtime.py",
|
||||
title="RuntimeManager.start",
|
||||
content="start(self)",
|
||||
metadata={"qname": "RuntimeManager.start", "kind": "method", "signature": "start(self)"},
|
||||
)
|
||||
],
|
||||
evidence_count=1,
|
||||
),
|
||||
)
|
||||
payload = json.loads(
|
||||
CodeQaPromptPayloadBuilder().build(
|
||||
user_query="Explain RuntimeManager",
|
||||
synthesis_input=synthesis,
|
||||
evidence_pack=bundle,
|
||||
answer_mode="normal",
|
||||
)
|
||||
)
|
||||
assert "must_mention_methods" in payload
|
||||
assert "RuntimeManager.start" in payload["must_mention_methods"]
|
||||
assert payload["must_not_infer_missing_details"] is True
|
||||
|
||||
|
||||
def test_prompt_payload_builder_adds_trace_flow_constraints() -> None:
|
||||
synthesis = build_answer_synthesis_input(
|
||||
"Trace RuntimeManager",
|
||||
EvidenceBundle(
|
||||
resolved_sub_intent="TRACE_FLOW",
|
||||
resolved_target="RuntimeManager",
|
||||
relations=[
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"start_line": 10,
|
||||
"metadata": {"edge_type": "calls", "src_qname": "RuntimeManager.start", "dst_ref": "TraceService.record"},
|
||||
},
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"start_line": 11,
|
||||
"metadata": {"edge_type": "calls", "src_qname": "TraceService.record", "dst_ref": "Registry.register"},
|
||||
},
|
||||
],
|
||||
evidence_count=2,
|
||||
),
|
||||
)
|
||||
payload = json.loads(
|
||||
CodeQaPromptPayloadBuilder().build(
|
||||
user_query="Trace RuntimeManager",
|
||||
synthesis_input=synthesis,
|
||||
evidence_pack=EvidenceBundle(resolved_sub_intent="TRACE_FLOW", resolved_target="RuntimeManager"),
|
||||
answer_mode="normal",
|
||||
)
|
||||
)
|
||||
assert payload["must_mention_flow_steps"]
|
||||
assert payload["must_avoid_overclaiming_full_flow"] is True
|
||||
|
||||
|
||||
def test_post_gate_rejects_vague_explain_without_concrete_facts() -> None:
|
||||
bundle = EvidenceBundle(
|
||||
resolved_sub_intent="EXPLAIN",
|
||||
resolved_target="RuntimeManager",
|
||||
evidence_count=3,
|
||||
code_chunks=[
|
||||
CodeChunkItem(
|
||||
layer="C1_SYMBOL_CATALOG",
|
||||
path="src/runtime.py",
|
||||
title="RuntimeManager.start",
|
||||
content="start(self)",
|
||||
metadata={"qname": "RuntimeManager.start", "kind": "method", "signature": "start(self)"},
|
||||
)
|
||||
],
|
||||
relations=[
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"metadata": {"edge_type": "calls", "src_qname": "RuntimeManager.start", "dst_ref": "TraceService.record"},
|
||||
}
|
||||
],
|
||||
)
|
||||
result = CodeQaPostEvidenceGate().validate(
|
||||
answer="RuntimeManager имеет responsibilities и управляет системой.",
|
||||
answer_mode="normal",
|
||||
degraded_message="",
|
||||
sub_intent="EXPLAIN",
|
||||
user_query="Explain RuntimeManager",
|
||||
evidence_pack=bundle,
|
||||
)
|
||||
assert result.passed is False
|
||||
assert "missing_concrete_methods" in result.reasons
|
||||
assert "too_vague_for_explain" in result.reasons
|
||||
|
||||
|
||||
def test_post_gate_accepts_explain_with_method_alias_and_call() -> None:
|
||||
bundle = EvidenceBundle(
|
||||
resolved_sub_intent="EXPLAIN",
|
||||
resolved_target="RuntimeManager",
|
||||
evidence_count=3,
|
||||
code_chunks=[
|
||||
CodeChunkItem(
|
||||
layer="C1_SYMBOL_CATALOG",
|
||||
path="src/runtime.py",
|
||||
title="RuntimeManager.start",
|
||||
content="start(self)",
|
||||
metadata={"qname": "RuntimeManager.start", "kind": "method", "signature": "start(self)"},
|
||||
)
|
||||
],
|
||||
relations=[
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"metadata": {"edge_type": "calls", "src_qname": "RuntimeManager.start", "dst_ref": "TraceService.record"},
|
||||
}
|
||||
],
|
||||
)
|
||||
result = CodeQaPostEvidenceGate().validate(
|
||||
answer="RuntimeManager запускает работу через метод start(), а затем вызывает record() у TraceService.",
|
||||
answer_mode="normal",
|
||||
degraded_message="",
|
||||
sub_intent="EXPLAIN",
|
||||
user_query="Explain RuntimeManager",
|
||||
evidence_pack=bundle,
|
||||
)
|
||||
assert result.passed is True
|
||||
|
||||
|
||||
def test_post_gate_requires_architecture_relations() -> None:
|
||||
bundle = EvidenceBundle(
|
||||
resolved_sub_intent="ARCHITECTURE",
|
||||
resolved_target="RuntimeManager",
|
||||
evidence_count=3,
|
||||
code_chunks=[
|
||||
CodeChunkItem(layer="C1_SYMBOL_CATALOG", path="src/runtime.py", title="RuntimeManager", content="", metadata={"qname": "RuntimeManager", "kind": "class"}),
|
||||
CodeChunkItem(layer="C4_SEMANTIC_ROLES", path="src/runtime.py", title="RuntimeManager", content="", metadata={"symbol_name": "RuntimeManager", "role": "orchestrator"}),
|
||||
],
|
||||
relations=[
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"metadata": {"edge_type": "calls", "src_qname": "RuntimeManager.start", "dst_ref": "TraceService.record"},
|
||||
}
|
||||
],
|
||||
)
|
||||
gate = CodeQaPostEvidenceGate()
|
||||
vague = gate.validate(
|
||||
answer="RuntimeManager и TraceService образуют центральный компонент runtime.",
|
||||
answer_mode="normal",
|
||||
degraded_message="",
|
||||
sub_intent="ARCHITECTURE",
|
||||
user_query="Architecture of RuntimeManager",
|
||||
evidence_pack=bundle,
|
||||
)
|
||||
concrete = gate.validate(
|
||||
answer="RuntimeManager.start вызывает TraceService.record в src/runtime.py.",
|
||||
answer_mode="normal",
|
||||
degraded_message="",
|
||||
sub_intent="ARCHITECTURE",
|
||||
user_query="Architecture of RuntimeManager",
|
||||
evidence_pack=bundle,
|
||||
)
|
||||
assert vague.passed is False
|
||||
assert "missing_relation_verbs" in vague.reasons or "missing_concrete_relations" in vague.reasons
|
||||
assert concrete.passed is True
|
||||
|
||||
|
||||
def test_post_gate_rejects_architecture_with_retrieval_labels() -> None:
|
||||
bundle = EvidenceBundle(
|
||||
resolved_sub_intent="ARCHITECTURE",
|
||||
resolved_target="RuntimeManager",
|
||||
evidence_count=2,
|
||||
relations=[
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"metadata": {"edge_type": "calls", "src_qname": "RuntimeManager.start", "dst_ref": "TraceService.dataflow_slice"},
|
||||
}
|
||||
],
|
||||
)
|
||||
result = CodeQaPostEvidenceGate().validate(
|
||||
answer="RuntimeManager связан с dataflow_slice и строит вокруг него архитектуру.",
|
||||
answer_mode="normal",
|
||||
degraded_message="",
|
||||
sub_intent="ARCHITECTURE",
|
||||
user_query="Architecture of RuntimeManager",
|
||||
evidence_pack=bundle,
|
||||
)
|
||||
assert result.passed is False
|
||||
assert "contains_retrieval_artifacts" in result.reasons
|
||||
|
||||
|
||||
def test_post_gate_trace_flow_requires_sequence_and_blocks_overclaim() -> None:
|
||||
bundle = EvidenceBundle(
|
||||
resolved_sub_intent="TRACE_FLOW",
|
||||
resolved_target="RuntimeManager",
|
||||
evidence_count=3,
|
||||
relations=[
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"start_line": 10,
|
||||
"metadata": {"edge_type": "calls", "src_qname": "RuntimeManager.start", "dst_ref": "TraceService.record"},
|
||||
},
|
||||
{
|
||||
"path": "src/runtime.py",
|
||||
"start_line": 11,
|
||||
"metadata": {"edge_type": "calls", "src_qname": "TraceService.record", "dst_ref": "Registry.register"},
|
||||
},
|
||||
],
|
||||
)
|
||||
gate = CodeQaPostEvidenceGate()
|
||||
vague = gate.validate(
|
||||
answer="RuntimeManager инициализирует службы и полностью восстанавливается.",
|
||||
answer_mode="normal",
|
||||
degraded_message="",
|
||||
sub_intent="TRACE_FLOW",
|
||||
user_query="Trace RuntimeManager",
|
||||
evidence_pack=bundle,
|
||||
)
|
||||
concrete = gate.validate(
|
||||
answer="Сначала RuntimeManager.start вызывает TraceService.record, затем TraceService.record вызывает Registry.register.",
|
||||
answer_mode="normal",
|
||||
degraded_message="",
|
||||
sub_intent="TRACE_FLOW",
|
||||
user_query="Trace RuntimeManager",
|
||||
evidence_pack=bundle,
|
||||
)
|
||||
assert vague.passed is False
|
||||
assert "missing_flow_steps" in vague.reasons or "too_vague_for_trace_flow" in vague.reasons
|
||||
assert "overclaims_trace_completeness" in vague.reasons
|
||||
assert concrete.passed is True
|
||||
@@ -65,8 +65,8 @@ class SummaryComposer:
|
||||
"",
|
||||
f"Passed: {passed}/{len(results)}",
|
||||
"",
|
||||
"| File | Case | Query | Expected sub-intent | Intent | Actual sub-intent | RAG layers | Pass |",
|
||||
"|------|------|-------|---------------------|--------|-------------------|------------|------|",
|
||||
"| File | Case | Query | Expected sub-intent | Intent | Actual sub-intent | RAG layers | Tokens | Pass |",
|
||||
"|------|------|-------|---------------------|--------|-------------------|------------|--------|------|",
|
||||
]
|
||||
lines.extend(self._result_rows(results))
|
||||
lines.extend(self._failure_section(results))
|
||||
@@ -80,7 +80,7 @@ class SummaryComposer:
|
||||
rows.append(
|
||||
f"| {item.case.source_file.name} | {item.case.case_id} | {self._table_text(item.case.query)} | "
|
||||
f"{item.case.expectations.router.sub_intent or '—'} | {actual.get('intent') or '—'} | "
|
||||
f"{actual.get('sub_intent') or '—'} | {self._rag_layers_text(item)} | {'✓' if item.passed else '✗'} |"
|
||||
f"{actual.get('sub_intent') or '—'} | {self._rag_layers_text(item)} | {self._token_text(item)} | {'✓' if item.passed else '✗'} |"
|
||||
)
|
||||
return rows
|
||||
|
||||
@@ -142,3 +142,10 @@ class SummaryComposer:
|
||||
return "—"
|
||||
parts = [f"{layer}:{counts[layer]}" for layer in sorted(counts)]
|
||||
return self._table_text(", ".join(parts), limit=120)
|
||||
|
||||
def _token_text(self, item: V2CaseResult) -> str:
|
||||
diagnostics = dict(item.details.get("diagnostics") or {})
|
||||
prompt = dict(diagnostics.get("prompt") or {})
|
||||
stats = dict(prompt.get("prompt_stats") or {})
|
||||
value = stats.get("tokens_in_estimate")
|
||||
return str(value) if value is not None else "—"
|
||||
|
||||
@@ -2,6 +2,7 @@ from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from tests.pipeline_setup_v2.core.artifacts import SummaryComposer
|
||||
from tests.pipeline_setup_v2.core.models import CaseExpectations, LlmExpectation, RetrievalExpectation, RouterExpectation, V2Case
|
||||
from tests.pipeline_setup_v2.core.validators import CaseValidator
|
||||
|
||||
@@ -108,3 +109,29 @@ def test_llm_contains_and_excludes_checks() -> None:
|
||||
mismatches = CaseValidator().validate(case, actual, {})
|
||||
|
||||
assert mismatches == []
|
||||
|
||||
|
||||
def test_summary_includes_token_usage_column() -> None:
|
||||
case = V2Case(
|
||||
case_id="llm-quality",
|
||||
runner="runtime",
|
||||
mode="full_chain",
|
||||
query="Где health endpoint?",
|
||||
source_file=Path("cases.yaml"),
|
||||
)
|
||||
result_text = SummaryComposer().compose([
|
||||
type(
|
||||
"Result",
|
||||
(),
|
||||
{
|
||||
"case": case,
|
||||
"actual": {"intent": "CODE_QA", "sub_intent": "FIND_ENTRYPOINTS"},
|
||||
"details": {"diagnostics": {"prompt": {"prompt_stats": {"tokens_in_estimate": 654}}}, "rag_rows": []},
|
||||
"passed": True,
|
||||
"mismatches": [],
|
||||
},
|
||||
)()
|
||||
])
|
||||
|
||||
assert "Tokens" in result_text
|
||||
assert "654" in result_text
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
defaults:
|
||||
runner: runtime
|
||||
mode: full_chain
|
||||
input:
|
||||
rag_session_id: "7d11da21-faa0-4cea-aede-aeabe069164c"
|
||||
|
||||
cases:
|
||||
- id: plba-v3-open-file-runtime
|
||||
query: "Открой файл src/app_runtime/core/runtime.py"
|
||||
notes: "Representative OPEN_FILE case copied from full_chain_plba_code_subintents_v2.yaml"
|
||||
expected:
|
||||
router:
|
||||
intent: CODE_QA
|
||||
sub_intent: OPEN_FILE
|
||||
graph_id: CodeQAGraph
|
||||
conversation_mode: START
|
||||
retrieval:
|
||||
non_empty: true
|
||||
path_scope_contains: ["src/app_runtime/core/runtime.py"]
|
||||
layers_include: ["C0_SOURCE_CHUNKS"]
|
||||
llm:
|
||||
non_empty: true
|
||||
|
||||
- id: plba-v3-explain-runtime-manager
|
||||
query: "Объясни как работает класс RuntimeManager"
|
||||
notes: "Representative EXPLAIN case copied from full_chain_plba_code_subintents_v2.yaml"
|
||||
expected:
|
||||
router:
|
||||
intent: CODE_QA
|
||||
sub_intent: EXPLAIN
|
||||
graph_id: CodeQAGraph
|
||||
conversation_mode: START
|
||||
retrieval:
|
||||
non_empty: true
|
||||
symbol_candidates_contain: ["RuntimeManager"]
|
||||
layers_include: ["C1_SYMBOL_CATALOG", "C0_SOURCE_CHUNKS", "C2_DEPENDENCY_GRAPH"]
|
||||
llm:
|
||||
non_empty: true
|
||||
excludes: ["ряд аргументов", "основные службы"]
|
||||
|
||||
- id: plba-v3-explain-local-http-channel
|
||||
query: "Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?"
|
||||
notes: "Representative EXPLAIN_LOCAL case copied from full_chain_plba_code_subintents_v2.yaml"
|
||||
expected:
|
||||
router:
|
||||
intent: CODE_QA
|
||||
sub_intent: EXPLAIN_LOCAL
|
||||
graph_id: CodeQAGraph
|
||||
conversation_mode: START
|
||||
retrieval:
|
||||
non_empty: true
|
||||
path_scope_contains: ["src/app_runtime/control/http_channel.py"]
|
||||
symbol_candidates_contain: ["HttpControlChannel"]
|
||||
layers_include: ["C1_SYMBOL_CATALOG", "C0_SOURCE_CHUNKS", "C2_DEPENDENCY_GRAPH"]
|
||||
llm:
|
||||
non_empty: true
|
||||
|
||||
- id: plba-v3-find-tests-runtime-manager
|
||||
query: "Где тесты для RuntimeManager?"
|
||||
notes: "Representative FIND_TESTS case copied from full_chain_plba_code_subintents_v2.yaml"
|
||||
expected:
|
||||
router:
|
||||
intent: CODE_QA
|
||||
sub_intent: FIND_TESTS
|
||||
graph_id: CodeQAGraph
|
||||
conversation_mode: START
|
||||
retrieval:
|
||||
non_empty: true
|
||||
symbol_candidates_contain: ["RuntimeManager"]
|
||||
layers_include: ["C1_SYMBOL_CATALOG", "C2_DEPENDENCY_GRAPH", "C0_SOURCE_CHUNKS"]
|
||||
llm:
|
||||
non_empty: true
|
||||
|
||||
- id: plba-v3-find-entrypoints-health-endpoint
|
||||
query: "Где health endpoint?"
|
||||
notes: "Representative FIND_ENTRYPOINTS case copied from full_chain_plba_code_subintents_v2.yaml"
|
||||
expected:
|
||||
router:
|
||||
intent: CODE_QA
|
||||
sub_intent: FIND_ENTRYPOINTS
|
||||
graph_id: CodeQAGraph
|
||||
conversation_mode: START
|
||||
retrieval:
|
||||
non_empty: true
|
||||
layers_include: ["C3_ENTRYPOINTS", "C0_SOURCE_CHUNKS"]
|
||||
llm:
|
||||
non_empty: true
|
||||
contains_all: ["GET /health"]
|
||||
excludes: ["нет явных неподтвержденных кандидатов", "кандидаты на health-endpoint"]
|
||||
|
||||
- id: plba-v3-trace-flow-runtime-start
|
||||
query: "Покажи поток выполнения при запуске RuntimeManager"
|
||||
notes: "Representative TRACE_FLOW case copied from full_chain_plba_code_subintents_v2.yaml"
|
||||
expected:
|
||||
router:
|
||||
intent: CODE_QA
|
||||
sub_intent: TRACE_FLOW
|
||||
graph_id: CodeQAGraph
|
||||
conversation_mode: START
|
||||
retrieval:
|
||||
non_empty: true
|
||||
symbol_candidates_contain: ["RuntimeManager"]
|
||||
layers_include: ["C2_DEPENDENCY_GRAPH", "C3_ENTRYPOINTS", "C0_SOURCE_CHUNKS"]
|
||||
llm:
|
||||
non_empty: true
|
||||
|
||||
- id: plba-v3-architecture-runtime-manager
|
||||
query: "Какие компоненты участвуют в RuntimeManager?"
|
||||
notes: "Representative ARCHITECTURE case copied from full_chain_plba_code_subintents_v2.yaml"
|
||||
expected:
|
||||
router:
|
||||
intent: CODE_QA
|
||||
sub_intent: ARCHITECTURE
|
||||
graph_id: CodeQAGraph
|
||||
conversation_mode: START
|
||||
retrieval:
|
||||
non_empty: true
|
||||
symbol_candidates_contain: ["RuntimeManager"]
|
||||
layers_include: ["C4_SEMANTIC_ROLES", "C2_DEPENDENCY_GRAPH", "C0_SOURCE_CHUNKS"]
|
||||
llm:
|
||||
non_empty: true
|
||||
@@ -66,8 +66,8 @@ class SummaryComposer:
|
||||
"",
|
||||
f"Passed: {passed}/{len(results)}",
|
||||
"",
|
||||
"| File | Case | Mode | Query | Actual sub-intent | RAG layers | Pass |",
|
||||
"|------|------|------|-------|-------------------|------------|------|",
|
||||
"| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass |",
|
||||
"|------|------|------|-------|-------------------|------------|--------|------|",
|
||||
]
|
||||
lines.extend(self._rows(results))
|
||||
failures = [item for item in results if not item.passed]
|
||||
@@ -84,7 +84,7 @@ class SummaryComposer:
|
||||
rows.append(
|
||||
f"| {item.case.source_file.name} | {item.case.case_id} | {item.case.mode} | "
|
||||
f"{self._cell(item.case.query)} | {item.actual.get('sub_intent') or '—'} | "
|
||||
f"{self._layer_text(item.details)} | {'✓' if item.passed else '✗'} |"
|
||||
f"{self._layer_text(item.details)} | {self._token_text(item.details)} | {'✓' if item.passed else '✗'} |"
|
||||
)
|
||||
return rows
|
||||
|
||||
@@ -104,6 +104,16 @@ class SummaryComposer:
|
||||
return compact
|
||||
return compact[: limit - 1].rstrip() + "…"
|
||||
|
||||
def _token_text(self, details: dict) -> str:
|
||||
token_usage = dict(details.get("token_usage") or {})
|
||||
direct = token_usage.get("tokens_in_estimate")
|
||||
if direct is not None:
|
||||
return str(direct)
|
||||
prompt = dict(details.get("diagnostics", {}).get("prompt") or {})
|
||||
stats = dict(prompt.get("prompt_stats") or {})
|
||||
value = stats.get("tokens_in_estimate")
|
||||
return str(value) if value is not None else "—"
|
||||
|
||||
def _llm_section(self, results: list[V3CaseResult]) -> list[str]:
|
||||
llm_results = [item for item in results if str(item.actual.get("llm_answer") or "").strip()]
|
||||
if not llm_results:
|
||||
|
||||
@@ -2,6 +2,7 @@ from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from tests.pipeline_setup_v3.core.artifacts import SummaryComposer
|
||||
from tests.pipeline_setup_v3.core.models import CaseExpectations, LlmExpectation, RetrievalExpectation, RouterExpectation, V3Case
|
||||
from tests.pipeline_setup_v3.core.validators import CaseValidator
|
||||
|
||||
@@ -66,3 +67,29 @@ def test_llm_contains_and_excludes_checks() -> None:
|
||||
}
|
||||
|
||||
assert CaseValidator().validate(case, actual, {}) == []
|
||||
|
||||
|
||||
def test_summary_includes_token_usage_column() -> None:
|
||||
case = V3Case(
|
||||
case_id="llm-quality",
|
||||
runner="agent_runtime",
|
||||
mode="full_chain",
|
||||
query="Где health endpoint?",
|
||||
source_file=Path("cases.yaml"),
|
||||
)
|
||||
result_text = SummaryComposer().compose([
|
||||
type(
|
||||
"Result",
|
||||
(),
|
||||
{
|
||||
"case": case,
|
||||
"actual": {"sub_intent": "FIND_ENTRYPOINTS"},
|
||||
"details": {"token_usage": {"tokens_in_estimate": 321}, "rag_rows": []},
|
||||
"passed": True,
|
||||
"mismatches": [],
|
||||
},
|
||||
)()
|
||||
])
|
||||
|
||||
assert "Tokens" in result_text
|
||||
assert "321" in result_text
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
|
||||
from app.modules.agent.code_qa_runtime import CodeQaRuntimeExecutor
|
||||
from app.modules.agent.code_qa_runtime.repo_context import CodeQaRepoContextFactory
|
||||
from app.modules.agent.code_qa_runtime.retrieval_adapter import CodeQaRetrievalAdapter
|
||||
@@ -87,6 +89,7 @@ class AgentRuntimeAdapter:
|
||||
"diagnostics": result.diagnostics.model_dump(mode="json"),
|
||||
"rag_rows": list(result.retrieval_result.raw_rows) if result.retrieval_result else [],
|
||||
"validation": result.validation.model_dump(mode="json"),
|
||||
"token_usage": _token_usage(result),
|
||||
"steps": list(result.runtime_trace),
|
||||
}
|
||||
return ExecutionPayload(actual=actual, details=details)
|
||||
@@ -169,3 +172,15 @@ def _answer_status(answer_mode: str, llm_used: bool) -> str:
|
||||
if answer_mode == "normal" and llm_used:
|
||||
return "answered"
|
||||
return answer_mode
|
||||
|
||||
|
||||
def _token_usage(result) -> dict:
|
||||
draft = result.draft_answer
|
||||
if draft is None:
|
||||
return {}
|
||||
system_prompt = PromptLoader().load(draft.prompt_name)
|
||||
tokens_in_estimate = max(1, int(math.ceil((len(system_prompt or "") + len(draft.prompt_payload or "")) / 4)))
|
||||
return {
|
||||
"prompt_name": draft.prompt_name,
|
||||
"tokens_in_estimate": tokens_in_estimate,
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"case_id": "plba-v2-architecture-runtime-manager",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"case_id": "plba-v3-architecture-runtime-manager",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Какие компоненты участвуют в RuntimeManager?",
|
||||
@@ -10,7 +10,7 @@
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "### Компоненты, участвующие в RuntimeManager\n\n#### Подтвержденные связи\n1. **RuntimeManager**\n - Role: Pipeline Stage\n - Responsibilities:\n - Manager responsibilities\n - Orchestration of role-like calls\n - State attribute reading/writing\n - Participation in dataflow slices\n\n2. **ControlPlaneService**\n - Role: Pipeline Stage\n - Responsibilities:\n - Service responsibilities\n - State attribute reading/writing\n - Participation in dataflow slices\n\n3. **UvicornThreadRunner**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n4. **HttpControlChannel**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n5. **WorkflowPersistence**\n - Role: Pipeline Stage\n - Responsibilities:\n - Orchestration of role-like calls\n - State attribute reading/writing\n - Participation in dataflow slices\n\n6. **InMemoryTaskQueue**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n7. **ConfigFileLoader**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n8. **TraceContextStore**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n9. **WorkerSupervisor**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n### Ограничения найденного контекста\n- Все перечисленные компоненты являются участниками данных потоков выполнения (dataflow slices).\n- Каждый компонент выполняет операции чтения и записи состояния атрибутов.\n- Некоторые из них выполняют дополнительные обязанности, такие как участие в оркестрации или инициировании ролей.\n\nТаким образом, участники RuntimeManager включают перечисленные выше компоненты.",
|
||||
"llm_answer": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_async** (src/app_runtime/control/service.py:14-47)\n- **RuntimeManager.start** (src/app_runtime/core/runtime.py:32-59)\n- **ControlPlaneService.start** (src/app_runtime/control/service.py:14-20)\n- **ControlPlaneService.stop** (src/app_runtime/control/service.py:14-25)\n- **ControlPlaneService._stop_async** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.add_config_file** (src/app_runtime/core/runtime.py:32-52)\n- **ControlPlaneService.register_channel** (src/app_runtime/control/service.py:14-17)\n\nСвязи между компонентами:\n\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService._start_async**\n- **RuntimeManager.__init__ dataflow_slice RuntimeManager.start**\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService.start**\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService.stop**\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService._stop_async**\n- **RuntimeManager.__init__ dataflow_slice RuntimeManager.add_config_file**\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService.register_channel**\n- **RuntimeManager.__init__ dataflow_slice RuntimeManager._register_core_services**\n\nОтветственность подсистемы заключается в управлении жизненным циклом приложения, загрузке конфигурационных файлов и регистрации каналов управления через ControlPlaneService.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
@@ -120,12 +120,16 @@
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "pending",
|
||||
"resolved_symbol": null,
|
||||
"status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"alternatives": [
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager"
|
||||
],
|
||||
"confidence": 0.0
|
||||
"confidence": 0.99
|
||||
},
|
||||
"evidence_policy": {
|
||||
"require_def": true,
|
||||
@@ -1306,6 +1310,11 @@
|
||||
"relations": [
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 47,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService._start_async",
|
||||
"metadata": {
|
||||
"edge_id": "e8e2ddef7499bed745cce7a83d5130d145e9787ca9ddc73f5898372a8da2be06",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1346,6 +1355,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 32,
|
||||
"end_line": 59,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager.start",
|
||||
"metadata": {
|
||||
"edge_id": "98312ace7fc62b1c7194c5aa1732b6ef736eae1668a3a120dd1ecd5ab1d64f7a",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1386,6 +1400,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 20,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.start",
|
||||
"metadata": {
|
||||
"edge_id": "dc85f1ea8fe46c5223a32b4623a249512af7ea30f3af0d890c2fbe842c74d3c2",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1426,6 +1445,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 25,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.stop",
|
||||
"metadata": {
|
||||
"edge_id": "d5433e2950fb6f913453de2694d697f2c5c5b0e759501aa31c37125d4d29c118",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1466,6 +1490,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 51,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService._stop_async",
|
||||
"metadata": {
|
||||
"edge_id": "991ae894d11340626f4d9361e176c5009c2f33d95ce1a8864740bc85306accc3",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1506,6 +1535,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 32,
|
||||
"end_line": 52,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager.add_config_file",
|
||||
"metadata": {
|
||||
"edge_id": "a23b8a11ebdb12708b60c96ea12a69f7f042082f1adfddd572444e246d81d167",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1546,6 +1580,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 17,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.register_channel",
|
||||
"metadata": {
|
||||
"edge_id": "e21fe35e6cd37bb929561a316c9b5156bd379de768b11d96c989a75a4a9330f2",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1586,6 +1625,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 32,
|
||||
"end_line": 127,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager._register_core_services",
|
||||
"metadata": {
|
||||
"edge_id": "3e5811f3b511fa0cabe363f5d01f2ac5fa039bc8b93f7ee108323e1f5f45a293",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1625,37 +1669,115 @@
|
||||
"content": "RuntimeManager.__init__\n -> RuntimeManager.configuration\n -> RuntimeManager._register_core_services"
|
||||
}
|
||||
],
|
||||
"semantic_hints": [
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"title": "RuntimeManager",
|
||||
"symbol": "RuntimeManager",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.67,
|
||||
"content": "RuntimeManager\nrole: pipeline_stage\n\nResponsibilities:\n- name suffix suggests manager\n- orchestrates role-like calls (4)\n- reads and writes state attributes\n- participates in dataflow slices (50)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/base.py",
|
||||
"title": "ControlActionSet",
|
||||
"symbol": "ControlActionSet",
|
||||
"role": "model",
|
||||
"confidence": 0.99,
|
||||
"content": "ControlActionSet\nrole: model\n\nResponsibilities:\n- default model role"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/base.py",
|
||||
"title": "ControlChannel",
|
||||
"symbol": "ControlChannel",
|
||||
"role": "model",
|
||||
"confidence": 0.99,
|
||||
"content": "ControlChannel\nrole: model\n\nResponsibilities:\n- default model role"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"title": "ControlPlaneService",
|
||||
"symbol": "ControlPlaneService",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.57,
|
||||
"content": "ControlPlaneService\nrole: pipeline_stage\n\nResponsibilities:\n- name suffix suggests service\n- reads and writes state attributes\n- participates in dataflow slices (5)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_runner.py",
|
||||
"title": "UvicornThreadRunner",
|
||||
"symbol": "UvicornThreadRunner",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "UvicornThreadRunner\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (24)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_channel.py",
|
||||
"title": "HttpControlChannel",
|
||||
"symbol": "HttpControlChannel",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "HttpControlChannel\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (10)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "HttpControlAppFactory",
|
||||
"symbol": "HttpControlAppFactory",
|
||||
"role": "factory",
|
||||
"confidence": 0.99,
|
||||
"content": "HttpControlAppFactory\nrole: factory\n\nResponsibilities:\n- name suffix suggests factory"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/workflow/persistence/workflow_persistence.py",
|
||||
"title": "WorkflowPersistence",
|
||||
"symbol": "WorkflowPersistence",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "WorkflowPersistence\nrole: pipeline_stage\n\nResponsibilities:\n- orchestrates role-like calls (2)\n- reads and writes state attributes\n- participates in dataflow slices (16)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/queue/in_memory.py",
|
||||
"title": "InMemoryTaskQueue",
|
||||
"symbol": "InMemoryTaskQueue",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "InMemoryTaskQueue\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (9)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/config/file_loader.py",
|
||||
"title": "ConfigFileLoader",
|
||||
"symbol": "ConfigFileLoader",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "ConfigFileLoader\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (8)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/tracing/store.py",
|
||||
"title": "TraceContextStore",
|
||||
"symbol": "TraceContextStore",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "TraceContextStore\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (6)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/workers/supervisor.py",
|
||||
"title": "WorkerSupervisor",
|
||||
"symbol": "WorkerSupervisor",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "WorkerSupervisor\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (6)"
|
||||
}
|
||||
],
|
||||
"entrypoints": [
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.post",
|
||||
"metadata": {
|
||||
"entry_id": "56ed4b3229229e985cbf949d567b742b156412c7280eba9b5b54668f61bf0305",
|
||||
"entry_type": "http",
|
||||
"framework": "fastapi",
|
||||
"route_or_command": "app.post",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"is_test": false,
|
||||
"lang_payload": {
|
||||
"methods": [
|
||||
"POST"
|
||||
]
|
||||
},
|
||||
"artifact_type": null,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.get",
|
||||
"start_line": 31,
|
||||
"end_line": 34,
|
||||
"http_method": "GET",
|
||||
"route_path": "/health",
|
||||
"handler_symbol": "health",
|
||||
"handler_symbol_id": "ab49f8d604dfed17bd83972a4158047a7c773c20ff58fbabc7963f4a1ec96834",
|
||||
"route_or_command": "app.get",
|
||||
"metadata": {
|
||||
"entry_id": "5377b9336800b5d63cc3b67a58730d18a409b245650dd9449325d87c64e24f62",
|
||||
"entry_type": "http",
|
||||
@@ -1683,6 +1805,13 @@
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.get",
|
||||
"start_line": 38,
|
||||
"end_line": 42,
|
||||
"http_method": "GET",
|
||||
"route_path": "/actions/{action}",
|
||||
"handler_symbol": "action",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"route_or_command": "app.get",
|
||||
"metadata": {
|
||||
"entry_id": "06e2f03cced7c1146b2d29f81951f2a2839140484eae22b2d6a63075d903ca4a",
|
||||
"entry_type": "http",
|
||||
@@ -1706,6 +1835,40 @@
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.post",
|
||||
"start_line": 38,
|
||||
"end_line": 42,
|
||||
"http_method": "POST",
|
||||
"route_path": "/actions/{action}",
|
||||
"handler_symbol": "action",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"route_or_command": "app.post",
|
||||
"metadata": {
|
||||
"entry_id": "56ed4b3229229e985cbf949d567b742b156412c7280eba9b5b54668f61bf0305",
|
||||
"entry_type": "http",
|
||||
"framework": "fastapi",
|
||||
"route_or_command": "app.post",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"is_test": false,
|
||||
"lang_payload": {
|
||||
"methods": [
|
||||
"POST"
|
||||
]
|
||||
},
|
||||
"artifact_type": null,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"test_candidates": [],
|
||||
@@ -3025,11 +3188,11 @@
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C4_SEMANTIC_ROLES": 36,
|
||||
"C3_ENTRYPOINTS": 15,
|
||||
"C2_DEPENDENCY_GRAPH": 59,
|
||||
"C1_SYMBOL_CATALOG": 27,
|
||||
"C0_SOURCE_CHUNKS": 17
|
||||
"C4_SEMANTIC_ROLES": 43,
|
||||
"C3_ENTRYPOINTS": 25,
|
||||
"C2_DEPENDENCY_GRAPH": 64,
|
||||
"C1_SYMBOL_CATALOG": 34,
|
||||
"C0_SOURCE_CHUNKS": 27
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -3045,6 +3208,9 @@
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
@@ -3059,7 +3225,7 @@
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "pending"
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
@@ -3112,8 +3278,42 @@
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 33
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 33,
|
||||
"code_chunk_count": 33,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 8,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn"
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {}
|
||||
"timings_ms": {
|
||||
"router": 1,
|
||||
"retrieval": 196,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 9911,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
},
|
||||
"rag_rows": [
|
||||
{
|
||||
@@ -4358,6 +4558,158 @@
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
},
|
||||
"token_usage": {
|
||||
"prompt_name": "code_qa_architecture_answer",
|
||||
"tokens_in_estimate": 4061
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 1
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 196
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 33,
|
||||
"answer_path_rag_count": 33,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"requested_layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C4_SEMANTIC_ROLES": "vector",
|
||||
"C3_ENTRYPOINTS": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector",
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C4_SEMANTIC_ROLES": 12,
|
||||
"C3_ENTRYPOINTS": 8,
|
||||
"C2_DEPENDENCY_GRAPH": 8,
|
||||
"C1_SYMBOL_CATALOG": 6,
|
||||
"C0_SOURCE_CHUNKS": 4
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C4_SEMANTIC_ROLES": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C4_SEMANTIC_ROLES": 43,
|
||||
"C3_ENTRYPOINTS": 25,
|
||||
"C2_DEPENDENCY_GRAPH": 64,
|
||||
"C1_SYMBOL_CATALOG": 34,
|
||||
"C0_SOURCE_CHUNKS": 27
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 33,
|
||||
"code_chunk_count": 33,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 8,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 33
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 9911
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_architecture_answer",
|
||||
"answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,305 @@
|
||||
# plba-v3-architecture-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Какие компоненты участвуют в RuntimeManager?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_async** (src/app_runtime/control/service.py:14-47)\n- **RuntimeManager.start** (src/app_runtime/core/runtime.py:32-59)\n- **ControlPlaneService.start** (src/app_runtime/control/service.py:14-20)\n- **ControlPlaneService.stop** (src/app_runtime/control/service.py:14-25)\n- **ControlPlaneService._stop_async** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.add_config_file** (src/app_runtime/core/runtime.py:32-52)\n- **ControlPlaneService.register_channel** (src/app_runtime/control/service.py:14-17)\n\nСвязи между компонентами:\n\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService._start_async**\n- **RuntimeManager.__init__ dataflow_slice RuntimeManager.start**\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService.start**\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService.stop**\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService._stop_async**\n- **RuntimeManager.__init__ dataflow_slice RuntimeManager.add_config_file**\n- **ControlPlaneService.__init__ dataflow_slice ControlPlaneService.register_channel**\n- **RuntimeManager.__init__ dataflow_slice RuntimeManager._register_core_services**\n\nОтветственность подсистемы заключается в управлении жизненным циклом приложения, загрузке конфигурационных файлов и регистрации каналов управления через ControlPlaneService.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Steps
|
||||
[
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 1
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 196
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 33,
|
||||
"answer_path_rag_count": 33,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"requested_layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C4_SEMANTIC_ROLES": "vector",
|
||||
"C3_ENTRYPOINTS": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector",
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C4_SEMANTIC_ROLES": 12,
|
||||
"C3_ENTRYPOINTS": 8,
|
||||
"C2_DEPENDENCY_GRAPH": 8,
|
||||
"C1_SYMBOL_CATALOG": 6,
|
||||
"C0_SOURCE_CHUNKS": 4
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C4_SEMANTIC_ROLES": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C4_SEMANTIC_ROLES": 43,
|
||||
"C3_ENTRYPOINTS": 25,
|
||||
"C2_DEPENDENCY_GRAPH": 64,
|
||||
"C1_SYMBOL_CATALOG": 34,
|
||||
"C0_SOURCE_CHUNKS": 27
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 33,
|
||||
"code_chunk_count": 33,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 8,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 33
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 9911
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_architecture_answer",
|
||||
"answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
## Diagnostics
|
||||
{
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"path_scope": [],
|
||||
"layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Какие компоненты участвуют в RuntimeManager?",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"path_scope": [],
|
||||
"requested_layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C4_SEMANTIC_ROLES",
|
||||
"hit_count": 12,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C3_ENTRYPOINTS",
|
||||
"hit_count": 3,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C2_DEPENDENCY_GRAPH",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C1_SYMBOL_CATALOG",
|
||||
"hit_count": 6,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 4,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 33
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 33,
|
||||
"code_chunk_count": 33,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 8,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Компоненты, участвующие в подсистеме RuntimeManager:\n\n- **RuntimeManager** (src/app_runtime/core/runtime.py:18-179)\n- **ControlPlaneService.__init__** (src/app_runtime/control/service.py:14-51)\n- **RuntimeManager.__init__** (src/app_runtime/core/runtime.py:32-127)\n- **ControlPlaneService._start_asyn"
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {
|
||||
"router": 1,
|
||||
"retrieval": 196,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 9911,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"case_id": "plba-v2-explain-local-http-channel",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"case_id": "plba-v3-explain-local-http-channel",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?",
|
||||
@@ -10,7 +10,7 @@
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 13,
|
||||
"llm_answer": "Класс `HttpControlChannel` в файле `src/app_runtime/control/http_channel.py` реализует механизм управления HTTP-каналом для взаимодействия с внешними сервисами или компонентами.\n\n**Ключевые шаги его реализации:**\n1. Инициализация класса:\n - При создании экземпляра устанавливается таймаут (`_timeout`), запускается сервер через объект `UvicornThreadRunner`, создается фабрика приложений `HttpControlAppFactory`.\n \n2. Запуск канала:\n - Метод `start` инициализирует набор действий (`actions`) и создает приложение для работы с ними. Затем запускает сервер через ранее созданный объект `UvicornThreadRunner`.\n \n3. Остановка канала:\n - Метод `stop` останавливает запущенный сервер.\n\nОпорные файлы:\n- `src/app_runtime/control/http_channel.py`: определение и реализация класса `HttpControlChannel`.",
|
||||
"llm_answer": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с переданным набором действий (ControlActionSet), а метод stop останавливает его. Свойство port возвращает текущий порт runner.\n\nВнутри класса определены два обработчика: _health_response проверяет здоровье канала, возвращая статус \"unhealthy\" если действия не установлены; \n_action_response предположительно обрабатывает запросы на выполнение действий, но его реализация в данном фрагменте не показана.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
@@ -151,12 +151,16 @@
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "pending",
|
||||
"resolved_symbol": null,
|
||||
"status": "resolved",
|
||||
"resolved_symbol": "HttpControlChannel",
|
||||
"alternatives": [
|
||||
"HttpControlChannel"
|
||||
"ControlChannel",
|
||||
"ControlActionSet",
|
||||
"JSONResponse",
|
||||
"HttpControlAppFactory",
|
||||
"UvicornThreadRunner"
|
||||
],
|
||||
"confidence": 0.0
|
||||
"confidence": 0.99
|
||||
},
|
||||
"evidence_policy": {
|
||||
"require_def": true,
|
||||
@@ -738,6 +742,11 @@
|
||||
"relations": [
|
||||
{
|
||||
"path": "src/app_runtime/control/http_channel.py",
|
||||
"start_line": 14,
|
||||
"end_line": 47,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "HttpControlChannel.__init__",
|
||||
"target": "HttpControlChannel._action_response",
|
||||
"metadata": {
|
||||
"edge_id": "c3ef21fcae96c82c00be74b3ab827d4af2085d89cb3fa5521c19a174aad84dbb",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -778,6 +787,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_channel.py",
|
||||
"start_line": 15,
|
||||
"end_line": 22,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "HttpControlChannel.__init__",
|
||||
"target": "HttpControlChannel.start",
|
||||
"metadata": {
|
||||
"edge_id": "51d73913df709152258ed1b9a8c8f4eb3c575eccfe6b982aef0b28e0789a29da",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -818,6 +832,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_channel.py",
|
||||
"start_line": 14,
|
||||
"end_line": 34,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "HttpControlChannel.__init__",
|
||||
"target": "HttpControlChannel._health_response",
|
||||
"metadata": {
|
||||
"edge_id": "f858f5c9e575f6c4cdfe3853571b7ee21d1f628a443541d2037c3dc9d0790bef",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -858,6 +877,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_channel.py",
|
||||
"start_line": 15,
|
||||
"end_line": 25,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "HttpControlChannel.__init__",
|
||||
"target": "HttpControlChannel.stop",
|
||||
"metadata": {
|
||||
"edge_id": "0f827ef81a990258a8a74381c8564a8361afa6712dba3200592659c939adcb9d",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -897,6 +921,7 @@
|
||||
"content": "HttpControlChannel.__init__\n -> HttpControlChannel._runner\n -> HttpControlChannel.stop"
|
||||
}
|
||||
],
|
||||
"semantic_hints": [],
|
||||
"entrypoints": [],
|
||||
"test_candidates": [],
|
||||
"layer_outcomes": [
|
||||
@@ -1454,8 +1479,8 @@
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 31,
|
||||
"C0_SOURCE_CHUNKS": 15,
|
||||
"C1_SYMBOL_CATALOG": 26,
|
||||
"C0_SOURCE_CHUNKS": 16,
|
||||
"C2_DEPENDENCY_GRAPH": 17
|
||||
}
|
||||
}
|
||||
@@ -1470,6 +1495,9 @@
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
@@ -1484,7 +1512,7 @@
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
],
|
||||
"symbol_resolution_status": "pending"
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
@@ -1525,8 +1553,44 @@
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 13
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 13,
|
||||
"code_chunk_count": 13,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 4,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"draft_answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер"
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {}
|
||||
"timings_ms": {
|
||||
"router": 2,
|
||||
"retrieval": 60,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 3231,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
},
|
||||
"rag_rows": [
|
||||
{
|
||||
@@ -2028,6 +2092,150 @@
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
},
|
||||
"token_usage": {
|
||||
"prompt_name": "code_qa_explain_local_answer",
|
||||
"tokens_in_estimate": 2071
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 2
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 60
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 13,
|
||||
"answer_path_rag_count": 13,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "HttpControlChannel",
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": 8,
|
||||
"C0_SOURCE_CHUNKS": 12,
|
||||
"C2_DEPENDENCY_GRAPH": 4
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 26,
|
||||
"C0_SOURCE_CHUNKS": 16,
|
||||
"C2_DEPENDENCY_GRAPH": 17
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 13,
|
||||
"code_chunk_count": 13,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 4,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 13
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 3231
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_explain_local_answer",
|
||||
"answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер",
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"draft_answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,285 @@
|
||||
# plba-v3-explain-local-http-channel
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 13,
|
||||
"llm_answer": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с переданным набором действий (ControlActionSet), а метод stop останавливает его. Свойство port возвращает текущий порт runner.\n\nВнутри класса определены два обработчика: _health_response проверяет здоровье канала, возвращая статус \"unhealthy\" если действия не установлены; \n_action_response предположительно обрабатывает запросы на выполнение действий, но его реализация в данном фрагменте не показана.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
],
|
||||
"symbol_candidates": [
|
||||
"HttpControlChannel"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
]
|
||||
}
|
||||
|
||||
## Steps
|
||||
[
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 2
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 60
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 13,
|
||||
"answer_path_rag_count": 13,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "HttpControlChannel",
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": 8,
|
||||
"C0_SOURCE_CHUNKS": 12,
|
||||
"C2_DEPENDENCY_GRAPH": 4
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 26,
|
||||
"C0_SOURCE_CHUNKS": 16,
|
||||
"C2_DEPENDENCY_GRAPH": 17
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 13,
|
||||
"code_chunk_count": 13,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 4,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 13
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 3231
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_explain_local_answer",
|
||||
"answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер",
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"draft_answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
## Diagnostics
|
||||
{
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
],
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
],
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C1_SYMBOL_CATALOG",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 1,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C2_DEPENDENCY_GRAPH",
|
||||
"hit_count": 4,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 13
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 13,
|
||||
"code_chunk_count": 13,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 4,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
]
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "HttpControlChannel",
|
||||
"draft_answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Класс HttpControlChannel наследует ControlChannel и реализует HTTP-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI-приложения. \n\nМетод start запускает сервер с пер"
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {
|
||||
"router": 2,
|
||||
"retrieval": 60,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 3231,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"case_id": "plba-v2-explain-runtime-manager",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"case_id": "plba-v3-explain-runtime-manager",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Объясни как работает класс RuntimeManager",
|
||||
@@ -10,8 +10,8 @@
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Класс `RuntimeManager` играет ключевую роль в управлении выполнением приложений и координации различных компонентов системы. Его основная функция заключается в оркестрации действий, связанных с жизненным циклом приложения, включая инициализацию, запуск и остановку сервисов и модулей.\n\n**Ключевые шаги работы класса:**\n1. Инициализация конфигурации и состояния (`__init__`).\n2. Добавление конфигурационных файлов и настроек (`add_config_file`).\n3. Управление состоянием выполнения через чтение и запись атрибутов состояния (`configuration`, `_state`).\n4. Оркестровка вызова методов запуска и остановки для различных компонентов (`start`, `stop`).\n5. Участие в обработке данных потока и управлении потоками задач (`participates in dataflow slices`).\n\n**Опорные файлы:**\n- `src/app_runtime/core/runtime.py:18-179`\n- `src/app_runtime/control/service.py:12-52`\n- `src/app_runtime/control/base.py:21-28`\n- `src/app_runtime/control/base.py:14-18`",
|
||||
"answer_mode": "answered",
|
||||
"llm_answer": "Недостаточно подтверждённых данных для уверенного ответа по RuntimeManager.",
|
||||
"answer_mode": "degraded",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
@@ -131,12 +131,16 @@
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "pending",
|
||||
"resolved_symbol": null,
|
||||
"status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"alternatives": [
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager"
|
||||
],
|
||||
"confidence": 0.0
|
||||
"confidence": 0.99
|
||||
},
|
||||
"evidence_policy": {
|
||||
"require_def": true,
|
||||
@@ -1277,6 +1281,11 @@
|
||||
"relations": [
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 25,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.stop",
|
||||
"metadata": {
|
||||
"edge_id": "d5433e2950fb6f913453de2694d697f2c5c5b0e759501aa31c37125d4d29c118",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1317,6 +1326,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 51,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService._stop_async",
|
||||
"metadata": {
|
||||
"edge_id": "991ae894d11340626f4d9361e176c5009c2f33d95ce1a8864740bc85306accc3",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1357,6 +1371,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 17,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.register_channel",
|
||||
"metadata": {
|
||||
"edge_id": "e21fe35e6cd37bb929561a316c9b5156bd379de768b11d96c989a75a4a9330f2",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1397,6 +1416,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 20,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.start",
|
||||
"metadata": {
|
||||
"edge_id": "dc85f1ea8fe46c5223a32b4623a249512af7ea30f3af0d890c2fbe842c74d3c2",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1437,6 +1461,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 47,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService._start_async",
|
||||
"metadata": {
|
||||
"edge_id": "e8e2ddef7499bed745cce7a83d5130d145e9787ca9ddc73f5898372a8da2be06",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1477,6 +1506,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 32,
|
||||
"end_line": 52,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager.add_config_file",
|
||||
"metadata": {
|
||||
"edge_id": "a23b8a11ebdb12708b60c96ea12a69f7f042082f1adfddd572444e246d81d167",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1516,37 +1550,83 @@
|
||||
"content": "RuntimeManager.__init__\n -> RuntimeManager.configuration\n -> RuntimeManager.add_config_file"
|
||||
}
|
||||
],
|
||||
"semantic_hints": [
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"title": "RuntimeManager",
|
||||
"symbol": "RuntimeManager",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.67,
|
||||
"content": "RuntimeManager\nrole: pipeline_stage\n\nResponsibilities:\n- name suffix suggests manager\n- orchestrates role-like calls (4)\n- reads and writes state attributes\n- participates in dataflow slices (50)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/base.py",
|
||||
"title": "ControlChannel",
|
||||
"symbol": "ControlChannel",
|
||||
"role": "model",
|
||||
"confidence": 0.99,
|
||||
"content": "ControlChannel\nrole: model\n\nResponsibilities:\n- default model role"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/base.py",
|
||||
"title": "ControlActionSet",
|
||||
"symbol": "ControlActionSet",
|
||||
"role": "model",
|
||||
"confidence": 0.99,
|
||||
"content": "ControlActionSet\nrole: model\n\nResponsibilities:\n- default model role"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"title": "ControlPlaneService",
|
||||
"symbol": "ControlPlaneService",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.57,
|
||||
"content": "ControlPlaneService\nrole: pipeline_stage\n\nResponsibilities:\n- name suffix suggests service\n- reads and writes state attributes\n- participates in dataflow slices (5)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_runner.py",
|
||||
"title": "UvicornThreadRunner",
|
||||
"symbol": "UvicornThreadRunner",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "UvicornThreadRunner\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (24)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_channel.py",
|
||||
"title": "HttpControlChannel",
|
||||
"symbol": "HttpControlChannel",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "HttpControlChannel\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (10)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "HttpControlAppFactory",
|
||||
"symbol": "HttpControlAppFactory",
|
||||
"role": "factory",
|
||||
"confidence": 0.99,
|
||||
"content": "HttpControlAppFactory\nrole: factory\n\nResponsibilities:\n- name suffix suggests factory"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/workflow/persistence/workflow_persistence.py",
|
||||
"title": "WorkflowPersistence",
|
||||
"symbol": "WorkflowPersistence",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "WorkflowPersistence\nrole: pipeline_stage\n\nResponsibilities:\n- orchestrates role-like calls (2)\n- reads and writes state attributes\n- participates in dataflow slices (16)"
|
||||
}
|
||||
],
|
||||
"entrypoints": [
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.post",
|
||||
"metadata": {
|
||||
"entry_id": "56ed4b3229229e985cbf949d567b742b156412c7280eba9b5b54668f61bf0305",
|
||||
"entry_type": "http",
|
||||
"framework": "fastapi",
|
||||
"route_or_command": "app.post",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"is_test": false,
|
||||
"lang_payload": {
|
||||
"methods": [
|
||||
"POST"
|
||||
]
|
||||
},
|
||||
"artifact_type": null,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.get",
|
||||
"start_line": 31,
|
||||
"end_line": 34,
|
||||
"http_method": "GET",
|
||||
"route_path": "/health",
|
||||
"handler_symbol": "health",
|
||||
"handler_symbol_id": "ab49f8d604dfed17bd83972a4158047a7c773c20ff58fbabc7963f4a1ec96834",
|
||||
"route_or_command": "app.get",
|
||||
"metadata": {
|
||||
"entry_id": "5377b9336800b5d63cc3b67a58730d18a409b245650dd9449325d87c64e24f62",
|
||||
"entry_type": "http",
|
||||
@@ -1574,6 +1654,13 @@
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.get",
|
||||
"start_line": 38,
|
||||
"end_line": 42,
|
||||
"http_method": "GET",
|
||||
"route_path": "/actions/{action}",
|
||||
"handler_symbol": "action",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"route_or_command": "app.get",
|
||||
"metadata": {
|
||||
"entry_id": "06e2f03cced7c1146b2d29f81951f2a2839140484eae22b2d6a63075d903ca4a",
|
||||
"entry_type": "http",
|
||||
@@ -1597,6 +1684,40 @@
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.post",
|
||||
"start_line": 38,
|
||||
"end_line": 42,
|
||||
"http_method": "POST",
|
||||
"route_path": "/actions/{action}",
|
||||
"handler_symbol": "action",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"route_or_command": "app.post",
|
||||
"metadata": {
|
||||
"entry_id": "56ed4b3229229e985cbf949d567b742b156412c7280eba9b5b54668f61bf0305",
|
||||
"entry_type": "http",
|
||||
"framework": "fastapi",
|
||||
"route_or_command": "app.post",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"is_test": false,
|
||||
"lang_payload": {
|
||||
"methods": [
|
||||
"POST"
|
||||
]
|
||||
},
|
||||
"artifact_type": null,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"test_candidates": [],
|
||||
@@ -2866,11 +2987,11 @@
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 51,
|
||||
"C0_SOURCE_CHUNKS": 16,
|
||||
"C1_SYMBOL_CATALOG": 494,
|
||||
"C0_SOURCE_CHUNKS": 17,
|
||||
"C4_SEMANTIC_ROLES": 14,
|
||||
"C2_DEPENDENCY_GRAPH": 54,
|
||||
"C3_ENTRYPOINTS": 11
|
||||
"C2_DEPENDENCY_GRAPH": 55,
|
||||
"C3_ENTRYPOINTS": 14
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2885,7 +3006,10 @@
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"answer_mode": "degraded",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
@@ -2900,7 +3024,7 @@
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"symbol_resolution_status": "pending"
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
@@ -2953,8 +3077,46 @@
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 33
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 33,
|
||||
"code_chunk_count": 33,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 6,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Класс `RuntimeManager` определён в файле `src/app_runtime/core/runtime.py`. Он является основным компонентом для управления жизненным циклом приложения и конфигурациями.\n\nМетоды:\n- Конструктор `__init__`: инициализирует объект RuntimeManager и принимает конфигурацию.\n- `add_config_file`: добавляет ф",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": false,
|
||||
"action": "repair",
|
||||
"reasons": [
|
||||
"missing_concrete_methods"
|
||||
],
|
||||
"repair_used": true,
|
||||
"final_answer_preview": "Недостаточно подтверждённых данных для уверенного ответа по RuntimeManager."
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {}
|
||||
"timings_ms": {
|
||||
"router": 2,
|
||||
"retrieval": 597,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 5865,
|
||||
"post_evidence_gate": 2,
|
||||
"repair": 4529,
|
||||
"post_evidence_gate_recheck": 2
|
||||
}
|
||||
},
|
||||
"rag_rows": [
|
||||
{
|
||||
@@ -4146,9 +4308,165 @@
|
||||
}
|
||||
],
|
||||
"validation": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
"passed": false,
|
||||
"action": "repair",
|
||||
"reasons": [
|
||||
"missing_concrete_methods"
|
||||
]
|
||||
},
|
||||
"token_usage": {
|
||||
"prompt_name": "code_qa_explain_answer",
|
||||
"tokens_in_estimate": 4504
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 2
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 597
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 33,
|
||||
"answer_path_rag_count": 33,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector",
|
||||
"C4_SEMANTIC_ROLES": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector",
|
||||
"C3_ENTRYPOINTS": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": 8,
|
||||
"C0_SOURCE_CHUNKS": 8,
|
||||
"C4_SEMANTIC_ROLES": 8,
|
||||
"C2_DEPENDENCY_GRAPH": 6,
|
||||
"C3_ENTRYPOINTS": 6
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C4_SEMANTIC_ROLES": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 494,
|
||||
"C0_SOURCE_CHUNKS": 17,
|
||||
"C4_SEMANTIC_ROLES": 14,
|
||||
"C2_DEPENDENCY_GRAPH": 55,
|
||||
"C3_ENTRYPOINTS": 14
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 33,
|
||||
"code_chunk_count": 33,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 6,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 33
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 5865
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_explain_answer",
|
||||
"answer_preview": "Класс `RuntimeManager` определён в файле `src/app_runtime/core/runtime.py`. Он является основным компонентом для управления жизненным циклом приложения и конфигурациями.\n\nМетоды:\n- Конструктор `__init__`: инициализирует объект RuntimeManager и принимает конфигурацию.\n- `add_config_file`: добавляет ф",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "failed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 2,
|
||||
"post_evidence_gate_recheck": 2,
|
||||
"repair": 4529
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Класс `RuntimeManager` определён в файле `src/app_runtime/core/runtime.py`. Он является основным компонентом для управления жизненным циклом приложения и конфигурациями.\n\nМетоды:\n- Конструктор `__init__`: инициализирует объект RuntimeManager и принимает конфигурацию.\n- `add_config_file`: добавляет ф",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": false,
|
||||
"action": "repair",
|
||||
"reasons": [
|
||||
"missing_concrete_methods"
|
||||
],
|
||||
"repair_used": true,
|
||||
"final_answer_preview": "Недостаточно подтверждённых данных для уверенного ответа по RuntimeManager."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,311 @@
|
||||
# plba-v3-explain-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Объясни как работает класс RuntimeManager
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Недостаточно подтверждённых данных для уверенного ответа по RuntimeManager.",
|
||||
"answer_mode": "degraded",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Steps
|
||||
[
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 2
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 597
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 33,
|
||||
"answer_path_rag_count": 33,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector",
|
||||
"C4_SEMANTIC_ROLES": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector",
|
||||
"C3_ENTRYPOINTS": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": 8,
|
||||
"C0_SOURCE_CHUNKS": 8,
|
||||
"C4_SEMANTIC_ROLES": 8,
|
||||
"C2_DEPENDENCY_GRAPH": 6,
|
||||
"C3_ENTRYPOINTS": 6
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C4_SEMANTIC_ROLES": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 494,
|
||||
"C0_SOURCE_CHUNKS": 17,
|
||||
"C4_SEMANTIC_ROLES": 14,
|
||||
"C2_DEPENDENCY_GRAPH": 55,
|
||||
"C3_ENTRYPOINTS": 14
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 33,
|
||||
"code_chunk_count": 33,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 6,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 33
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 5865
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_explain_answer",
|
||||
"answer_preview": "Класс `RuntimeManager` определён в файле `src/app_runtime/core/runtime.py`. Он является основным компонентом для управления жизненным циклом приложения и конфигурациями.\n\nМетоды:\n- Конструктор `__init__`: инициализирует объект RuntimeManager и принимает конфигурацию.\n- `add_config_file`: добавляет ф",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "failed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 2,
|
||||
"post_evidence_gate_recheck": 2,
|
||||
"repair": 4529
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Класс `RuntimeManager` определён в файле `src/app_runtime/core/runtime.py`. Он является основным компонентом для управления жизненным циклом приложения и конфигурациями.\n\nМетоды:\n- Конструктор `__init__`: инициализирует объект RuntimeManager и принимает конфигурацию.\n- `add_config_file`: добавляет ф",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": false,
|
||||
"action": "repair",
|
||||
"reasons": [
|
||||
"missing_concrete_methods"
|
||||
],
|
||||
"repair_used": true,
|
||||
"final_answer_preview": "Недостаточно подтверждённых данных для уверенного ответа по RuntimeManager."
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
## Diagnostics
|
||||
{
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "degraded",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"path_scope": [],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Объясни как работает класс RuntimeManager",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"path_scope": [],
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C1_SYMBOL_CATALOG",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C4_SEMANTIC_ROLES",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C2_DEPENDENCY_GRAPH",
|
||||
"hit_count": 6,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C3_ENTRYPOINTS",
|
||||
"hit_count": 3,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 33
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 33,
|
||||
"code_chunk_count": 33,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 6,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Класс `RuntimeManager` определён в файле `src/app_runtime/core/runtime.py`. Он является основным компонентом для управления жизненным циклом приложения и конфигурациями.\n\nМетоды:\n- Конструктор `__init__`: инициализирует объект RuntimeManager и принимает конфигурацию.\n- `add_config_file`: добавляет ф",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": false,
|
||||
"action": "repair",
|
||||
"reasons": [
|
||||
"missing_concrete_methods"
|
||||
],
|
||||
"repair_used": true,
|
||||
"final_answer_preview": "Недостаточно подтверждённых данных для уверенного ответа по RuntimeManager."
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {
|
||||
"router": 2,
|
||||
"retrieval": 597,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 5865,
|
||||
"post_evidence_gate": 2,
|
||||
"repair": 4529,
|
||||
"post_evidence_gate_recheck": 2
|
||||
}
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"case_id": "plba-v2-find-entrypoints-health-endpoint",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"case_id": "plba-v3-find-entrypoints-health-endpoint",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Где health endpoint?",
|
||||
@@ -9,8 +9,8 @@
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 9,
|
||||
"llm_answer": "health endpoint: \n- src/app_runtime/control/http_app.py:38-42 (app.post)\n- src/app_runtime/control/http_app.py:31-34 (app.get)",
|
||||
"rag_count": 10,
|
||||
"llm_answer": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
@@ -22,10 +22,8 @@
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"passed": false,
|
||||
"mismatches": [
|
||||
"llm: expected answer to contain 'GET /health'"
|
||||
],
|
||||
"passed": true,
|
||||
"mismatches": [],
|
||||
"details": {
|
||||
"query": "Где health endpoint?",
|
||||
"router_result": {
|
||||
@@ -122,12 +120,9 @@
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "pending",
|
||||
"status": "not_found",
|
||||
"resolved_symbol": null,
|
||||
"alternatives": [
|
||||
"health",
|
||||
"endpoint"
|
||||
],
|
||||
"alternatives": [],
|
||||
"confidence": 0.0
|
||||
},
|
||||
"evidence_policy": {
|
||||
@@ -491,28 +486,22 @@
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"relations": [],
|
||||
"entrypoints": [
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.post",
|
||||
"metadata": {
|
||||
"entry_id": "56ed4b3229229e985cbf949d567b742b156412c7280eba9b5b54668f61bf0305",
|
||||
"entry_type": "http",
|
||||
"framework": "fastapi",
|
||||
"route_or_command": "app.post",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"is_test": false,
|
||||
"lang_payload": {
|
||||
"methods": [
|
||||
"POST"
|
||||
]
|
||||
},
|
||||
"artifact_type": null,
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "src/app_runtime/control/http_app.py:HttpControlAppFactory",
|
||||
"content": "class HttpControlAppFactory:\n def create(\n self,\n health_provider: Callable[[], Awaitable[HealthPayload]],\n action_provider: Callable[[str, str], Awaitable[JSONResponse]],\n ) -> FastAPI:\n app = FastAPI(title=\"PLBA Control API\")\n\n @app.middleware(\"http\")\n async def log_api_call(request: Request, call_next): # type: ignore[no-untyped-def]\n started = time.monotonic()\n response = await call_next(request)\n response.headers[\"X-Response-Time-Ms\"] = str(int((time.monotonic() - started) * 1000))\n return response\n\n @app.get(\"/health\")\n async def health() -> JSONResponse:\n payload = await health_provider()\n status_code = 200 if payload.get(\"status\") == \"ok\" else 503\n return JSONResponse(content=payload, status_code=status_code)\n\n @app.get(\"/actions/{action}\")\n @app.post(\"/actions/{action}\")\n async def action(action: str, request: Request) -> JSONResponse:\n client_source = self._client_source(request)\n if action in {\"start\", \"stop\"}:\n LOGGER.warning(\"Control action requested: /actions/%s client=%s\", action, client_source)\n return await action_provider(action, client_source)\n\n return app\n\n def _client_source(self, request: Request) -> str:\n explicit_header = request.headers.get(\"X-Client-Source\", \"\").strip()\n if explicit_header:\n return explicit_header\n user_agent = request.headers.get(\"User-Agent\", \"\").strip()\n if user_agent:\n return f\"user-agent:{user_agent}\"\n return \"unknown\"",
|
||||
"start_line": 15,
|
||||
"end_line": 53,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "symbol_block",
|
||||
"module_or_unit": "src.app_runtime.control.http_app",
|
||||
"is_test": false,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
@@ -521,10 +510,21 @@
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
}
|
||||
],
|
||||
"relations": [],
|
||||
"semantic_hints": [],
|
||||
"entrypoints": [
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.get",
|
||||
"start_line": 31,
|
||||
"end_line": 34,
|
||||
"http_method": "GET",
|
||||
"route_path": "/health",
|
||||
"handler_symbol": "health",
|
||||
"handler_symbol_id": "ab49f8d604dfed17bd83972a4158047a7c773c20ff58fbabc7963f4a1ec96834",
|
||||
"route_or_command": "app.get",
|
||||
"metadata": {
|
||||
"entry_id": "5377b9336800b5d63cc3b67a58730d18a409b245650dd9449325d87c64e24f62",
|
||||
"entry_type": "http",
|
||||
@@ -552,6 +552,13 @@
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.get",
|
||||
"start_line": 38,
|
||||
"end_line": 42,
|
||||
"http_method": "GET",
|
||||
"route_path": "/actions/{action}",
|
||||
"handler_symbol": "action",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"route_or_command": "app.get",
|
||||
"metadata": {
|
||||
"entry_id": "06e2f03cced7c1146b2d29f81951f2a2839140484eae22b2d6a63075d903ca4a",
|
||||
"entry_type": "http",
|
||||
@@ -575,6 +582,40 @@
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.post",
|
||||
"start_line": 38,
|
||||
"end_line": 42,
|
||||
"http_method": "POST",
|
||||
"route_path": "/actions/{action}",
|
||||
"handler_symbol": "action",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"route_or_command": "app.post",
|
||||
"metadata": {
|
||||
"entry_id": "56ed4b3229229e985cbf949d567b742b156412c7280eba9b5b54668f61bf0305",
|
||||
"entry_type": "http",
|
||||
"framework": "fastapi",
|
||||
"route_or_command": "app.post",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"is_test": false,
|
||||
"lang_payload": {
|
||||
"methods": [
|
||||
"POST"
|
||||
]
|
||||
},
|
||||
"artifact_type": null,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"test_candidates": [],
|
||||
@@ -587,7 +628,7 @@
|
||||
},
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 6,
|
||||
"hit_count": 7,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
@@ -884,6 +925,36 @@
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"content": "class HttpControlAppFactory:\n def create(\n self,\n health_provider: Callable[[], Awaitable[HealthPayload]],\n action_provider: Callable[[str, str], Awaitable[JSONResponse]],\n ) -> FastAPI:\n app = FastAPI(title=\"PLBA Control API\")\n\n @app.middleware(\"http\")\n async def log_api_call(request: Request, call_next): # type: ignore[no-untyped-def]\n started = time.monotonic()\n response = await call_next(request)\n response.headers[\"X-Response-Time-Ms\"] = str(int((time.monotonic() - started) * 1000))\n return response\n\n @app.get(\"/health\")\n async def health() -> JSONResponse:\n payload = await health_provider()\n status_code = 200 if payload.get(\"status\") == \"ok\" else 503\n return JSONResponse(content=payload, status_code=status_code)\n\n @app.get(\"/actions/{action}\")\n @app.post(\"/actions/{action}\")\n async def action(action: str, request: Request) -> JSONResponse:\n client_source = self._client_source(request)\n if action in {\"start\", \"stop\"}:\n LOGGER.warning(\"Control action requested: /actions/%s client=%s\", action, client_source)\n return await action_provider(action, client_source)\n\n return app\n\n def _client_source(self, request: Request) -> str:\n explicit_header = request.headers.get(\"X-Client-Source\", \"\").strip()\n if explicit_header:\n return explicit_header\n user_agent = request.headers.get(\"User-Agent\", \"\").strip()\n if user_agent:\n return f\"user-agent:{user_agent}\"\n return \"unknown\"",
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"title": "src/app_runtime/control/http_app.py:HttpControlAppFactory",
|
||||
"span_start": 15,
|
||||
"span_end": 53,
|
||||
"lexical_rank": 0,
|
||||
"prefer_bonus": 0,
|
||||
"test_penalty": 0,
|
||||
"structural_rank": 0,
|
||||
"layer_rank": 0,
|
||||
"distance": 0,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "symbol_block",
|
||||
"module_or_unit": "src.app_runtime.control.http_app",
|
||||
"is_test": false,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"retrieval_report": {
|
||||
@@ -893,18 +964,20 @@
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C3_ENTRYPOINTS": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector"
|
||||
"C0_SOURCE_CHUNKS": "exact_path_fetch"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C3_ENTRYPOINTS": 12,
|
||||
"C0_SOURCE_CHUNKS": 6
|
||||
"C0_SOURCE_CHUNKS": 24
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_app.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
@@ -912,9 +985,16 @@
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C3_ENTRYPOINTS": 22,
|
||||
"C0_SOURCE_CHUNKS": 20
|
||||
"C3_ENTRYPOINTS": 34,
|
||||
"C0_SOURCE_CHUNKS": 15
|
||||
},
|
||||
"supplemental_requests": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"query": "Где health endpoint?",
|
||||
"ranking_profile": "entrypoint_source_hydration"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"diagnostics": {
|
||||
@@ -926,6 +1006,9 @@
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
@@ -937,7 +1020,7 @@
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "pending"
|
||||
"symbol_resolution_status": "not_found"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
@@ -958,7 +1041,7 @@
|
||||
},
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 6,
|
||||
"hit_count": 7,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
@@ -967,10 +1050,44 @@
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 9
|
||||
"evidence_count": 10
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"target_type": "file",
|
||||
"evidence_count": 10,
|
||||
"code_chunk_count": 10,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 0,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "not_found",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"draft_answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'.",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'."
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {}
|
||||
"timings_ms": {
|
||||
"router": 1,
|
||||
"retrieval": 64,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 1406,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
},
|
||||
"rag_rows": [
|
||||
{
|
||||
@@ -1263,12 +1380,179 @@
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"content": "class HttpControlAppFactory:\n def create(\n self,\n health_provider: Callable[[], Awaitable[HealthPayload]],\n action_provider: Callable[[str, str], Awaitable[JSONResponse]],\n ) -> FastAPI:\n app = FastAPI(title=\"PLBA Control API\")\n\n @app.middleware(\"http\")\n async def log_api_call(request: Request, call_next): # type: ignore[no-untyped-def]\n started = time.monotonic()\n response = await call_next(request)\n response.headers[\"X-Response-Time-Ms\"] = str(int((time.monotonic() - started) * 1000))\n return response\n\n @app.get(\"/health\")\n async def health() -> JSONResponse:\n payload = await health_provider()\n status_code = 200 if payload.get(\"status\") == \"ok\" else 503\n return JSONResponse(content=payload, status_code=status_code)\n\n @app.get(\"/actions/{action}\")\n @app.post(\"/actions/{action}\")\n async def action(action: str, request: Request) -> JSONResponse:\n client_source = self._client_source(request)\n if action in {\"start\", \"stop\"}:\n LOGGER.warning(\"Control action requested: /actions/%s client=%s\", action, client_source)\n return await action_provider(action, client_source)\n\n return app\n\n def _client_source(self, request: Request) -> str:\n explicit_header = request.headers.get(\"X-Client-Source\", \"\").strip()\n if explicit_header:\n return explicit_header\n user_agent = request.headers.get(\"User-Agent\", \"\").strip()\n if user_agent:\n return f\"user-agent:{user_agent}\"\n return \"unknown\"",
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"title": "src/app_runtime/control/http_app.py:HttpControlAppFactory",
|
||||
"span_start": 15,
|
||||
"span_end": 53,
|
||||
"lexical_rank": 0,
|
||||
"prefer_bonus": 0,
|
||||
"test_penalty": 0,
|
||||
"structural_rank": 0,
|
||||
"layer_rank": 0,
|
||||
"distance": 0,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "symbol_block",
|
||||
"module_or_unit": "src.app_runtime.control.http_app",
|
||||
"is_test": false,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"validation": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
},
|
||||
"token_usage": {
|
||||
"prompt_name": "code_qa_find_entrypoints_answer",
|
||||
"tokens_in_estimate": 2531
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 1
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 64
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 10,
|
||||
"answer_path_rag_count": 10,
|
||||
"resolved_symbol_status": "not_found",
|
||||
"resolved_symbol": null,
|
||||
"requested_layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C3_ENTRYPOINTS": "vector",
|
||||
"C0_SOURCE_CHUNKS": "exact_path_fetch"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C3_ENTRYPOINTS": 12,
|
||||
"C0_SOURCE_CHUNKS": 24
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_app.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C3_ENTRYPOINTS": 34,
|
||||
"C0_SOURCE_CHUNKS": 15
|
||||
},
|
||||
"supplemental_requests": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"query": "Где health endpoint?",
|
||||
"ranking_profile": "entrypoint_source_hydration"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"target_type": "file",
|
||||
"evidence_count": 10,
|
||||
"code_chunk_count": 10,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 0,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "not_found",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 1406
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_find_entrypoints_answer",
|
||||
"answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'.",
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"draft_answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'.",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,261 @@
|
||||
# plba-v3-find-entrypoints-health-endpoint
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где health endpoint?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 10,
|
||||
"llm_answer": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"health",
|
||||
"endpoint"
|
||||
],
|
||||
"layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Steps
|
||||
[
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 1
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 64
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 10,
|
||||
"answer_path_rag_count": 10,
|
||||
"resolved_symbol_status": "not_found",
|
||||
"resolved_symbol": null,
|
||||
"requested_layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C3_ENTRYPOINTS": "vector",
|
||||
"C0_SOURCE_CHUNKS": "exact_path_fetch"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C3_ENTRYPOINTS": 12,
|
||||
"C0_SOURCE_CHUNKS": 24
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_app.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C3_ENTRYPOINTS": 34,
|
||||
"C0_SOURCE_CHUNKS": 15
|
||||
},
|
||||
"supplemental_requests": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"query": "Где health endpoint?",
|
||||
"ranking_profile": "entrypoint_source_hydration"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"target_type": "file",
|
||||
"evidence_count": 10,
|
||||
"code_chunk_count": 10,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 0,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "not_found",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 10
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 1406
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_find_entrypoints_answer",
|
||||
"answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'.",
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"draft_answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'.",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'."
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
## Diagnostics
|
||||
{
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"path_scope": [],
|
||||
"layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "not_found"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Где health endpoint?",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"path_scope": [],
|
||||
"requested_layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C3_ENTRYPOINTS",
|
||||
"hit_count": 3,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 7,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 10
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"target_type": "file",
|
||||
"evidence_count": 10,
|
||||
"code_chunk_count": 10,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 0,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "not_found",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "src/app_runtime/control/http_app.py",
|
||||
"draft_answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'.",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Подтверждённая точка входа для health endpoint:\nGET /health, declared in src/app_runtime/control/http_app.py, lines 31-34, handler function named 'health'."
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {
|
||||
"router": 1,
|
||||
"retrieval": 64,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 1406,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"case_id": "plba-v2-find-tests-runtime-manager",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"case_id": "plba-v3-find-tests-runtime-manager",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Где тесты для RuntimeManager?",
|
||||
@@ -10,7 +10,7 @@
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "- tests/test_runtime.py:12-12\n- tests/test_business_control_actions.py:14-14",
|
||||
"llm_answer": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
@@ -136,12 +136,16 @@
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "pending",
|
||||
"resolved_symbol": null,
|
||||
"status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"alternatives": [
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager"
|
||||
],
|
||||
"confidence": 0.0
|
||||
"confidence": 0.99
|
||||
},
|
||||
"evidence_policy": {
|
||||
"require_def": true,
|
||||
@@ -1017,6 +1021,11 @@
|
||||
"relations": [
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 25,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.stop",
|
||||
"metadata": {
|
||||
"edge_id": "d5433e2950fb6f913453de2694d697f2c5c5b0e759501aa31c37125d4d29c118",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1057,6 +1066,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 51,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService._stop_async",
|
||||
"metadata": {
|
||||
"edge_id": "991ae894d11340626f4d9361e176c5009c2f33d95ce1a8864740bc85306accc3",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1097,6 +1111,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 17,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.register_channel",
|
||||
"metadata": {
|
||||
"edge_id": "e21fe35e6cd37bb929561a316c9b5156bd379de768b11d96c989a75a4a9330f2",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1137,6 +1156,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 20,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.start",
|
||||
"metadata": {
|
||||
"edge_id": "dc85f1ea8fe46c5223a32b4623a249512af7ea30f3af0d890c2fbe842c74d3c2",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1177,6 +1201,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 47,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService._start_async",
|
||||
"metadata": {
|
||||
"edge_id": "e8e2ddef7499bed745cce7a83d5130d145e9787ca9ddc73f5898372a8da2be06",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1217,6 +1246,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 32,
|
||||
"end_line": 52,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager.add_config_file",
|
||||
"metadata": {
|
||||
"edge_id": "a23b8a11ebdb12708b60c96ea12a69f7f042082f1adfddd572444e246d81d167",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1256,6 +1290,7 @@
|
||||
"content": "RuntimeManager.__init__\n -> RuntimeManager.configuration\n -> RuntimeManager.add_config_file"
|
||||
}
|
||||
],
|
||||
"semantic_hints": [],
|
||||
"entrypoints": [],
|
||||
"test_candidates": [
|
||||
{
|
||||
@@ -2188,9 +2223,9 @@
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 45,
|
||||
"C2_DEPENDENCY_GRAPH": 53,
|
||||
"C0_SOURCE_CHUNKS": 17
|
||||
"C1_SYMBOL_CATALOG": 50,
|
||||
"C2_DEPENDENCY_GRAPH": 59,
|
||||
"C0_SOURCE_CHUNKS": 22
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2204,6 +2239,9 @@
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
@@ -2216,7 +2254,7 @@
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "pending"
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
@@ -2255,8 +2293,42 @@
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 24
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 24,
|
||||
"code_chunk_count": 24,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 6,
|
||||
"test_evidence_count": 2,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`.",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`."
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {}
|
||||
"timings_ms": {
|
||||
"router": 1,
|
||||
"retrieval": 132,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 1662,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
},
|
||||
"rag_rows": [
|
||||
{
|
||||
@@ -3128,6 +3200,142 @@
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
},
|
||||
"token_usage": {
|
||||
"prompt_name": "code_qa_find_tests_answer",
|
||||
"tokens_in_estimate": 3660
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 1
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 132
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 24,
|
||||
"answer_path_rag_count": 24,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": 8,
|
||||
"C2_DEPENDENCY_GRAPH": 6,
|
||||
"C0_SOURCE_CHUNKS": 10
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 50,
|
||||
"C2_DEPENDENCY_GRAPH": 59,
|
||||
"C0_SOURCE_CHUNKS": 22
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 24,
|
||||
"code_chunk_count": 24,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 6,
|
||||
"test_evidence_count": 2,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 24
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 1662
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_find_tests_answer",
|
||||
"answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`.",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`.",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,269 @@
|
||||
# plba-v3-find-tests-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для RuntimeManager?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Steps
|
||||
[
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 1
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 132
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 24,
|
||||
"answer_path_rag_count": 24,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": 8,
|
||||
"C2_DEPENDENCY_GRAPH": 6,
|
||||
"C0_SOURCE_CHUNKS": 10
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 50,
|
||||
"C2_DEPENDENCY_GRAPH": 59,
|
||||
"C0_SOURCE_CHUNKS": 22
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 24,
|
||||
"code_chunk_count": 24,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 6,
|
||||
"test_evidence_count": 2,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 24
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 1662
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_find_tests_answer",
|
||||
"answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`.",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`.",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`."
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
## Diagnostics
|
||||
{
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"path_scope": [],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Где тесты для RuntimeManager?",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"path_scope": [],
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C1_SYMBOL_CATALOG",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C2_DEPENDENCY_GRAPH",
|
||||
"hit_count": 6,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 10,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 24
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 24,
|
||||
"code_chunk_count": 24,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 6,
|
||||
"test_evidence_count": 2,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`.",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "Прямые тесты для `RuntimeManager` находятся в файле `tests/test_runtime.py`.\n\nКосвенные тесты:\n- В файле `tests/test_business_control_actions.py` есть тесты, использующие сущности контроля, которые взаимодействуют с `RuntimeManager`."
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {
|
||||
"router": 1,
|
||||
"retrieval": 132,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 1662,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"case_id": "plba-v2-open-file-runtime",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"case_id": "plba-v3-open-file-runtime",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Открой файл src/app_runtime/core/runtime.py",
|
||||
@@ -10,7 +10,7 @@
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 1,
|
||||
"llm_answer": "Виден класс `RuntimeManager` с методом `__init__`, принимающим несколько параметров. Фиксированы также константы `ACTION_TIMEOUT_SECONDS` и `ACTION_POLL_INTERVAL_SECONDS`.",
|
||||
"llm_answer": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип `LogManager`\n- `workers`: тип `WorkerSupervisor`\n- `control_plane`: тип `ControlPlaneService`\n\nТакже определены константы таймаутов:\n- `ACTION_TIMEOUT_SECONDS = 10.0`\n- `ACTION_POLL_INTERVAL_SECONDS = 0.05`",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
@@ -250,6 +250,7 @@
|
||||
}
|
||||
],
|
||||
"relations": [],
|
||||
"semantic_hints": [],
|
||||
"entrypoints": [],
|
||||
"test_candidates": [],
|
||||
"layer_outcomes": [
|
||||
@@ -322,7 +323,7 @@
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C0_SOURCE_CHUNKS": 221
|
||||
"C0_SOURCE_CHUNKS": 132
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -334,6 +335,9 @@
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
@@ -373,12 +377,43 @@
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 1
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"target_type": "file",
|
||||
"evidence_count": 1,
|
||||
"code_chunk_count": 1,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 0,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "not_requested",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
]
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"draft_answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип"
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {
|
||||
"router": 0,
|
||||
"retrieval": 221,
|
||||
"pre_evidence_gate": 0,
|
||||
"llm": 578
|
||||
"router": 1,
|
||||
"retrieval": 132,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 3550,
|
||||
"post_evidence_gate": 2
|
||||
}
|
||||
},
|
||||
"rag_rows": [
|
||||
@@ -418,12 +453,16 @@
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
},
|
||||
"token_usage": {
|
||||
"prompt_name": "code_qa_open_file_answer",
|
||||
"tokens_in_estimate": 1128
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 0
|
||||
"router": 1
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
@@ -436,7 +475,7 @@
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 221
|
||||
"retrieval": 132
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 1,
|
||||
@@ -476,7 +515,7 @@
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C0_SOURCE_CHUNKS": 221
|
||||
"C0_SOURCE_CHUNKS": 132
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -484,36 +523,64 @@
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 0
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"target_type": "file",
|
||||
"evidence_count": 1,
|
||||
"code_chunk_count": 1,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 0,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "not_requested",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": ""
|
||||
"degraded_message": "",
|
||||
"evidence_count": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 578
|
||||
"llm": 3550
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_open_file_answer",
|
||||
"answer_preview": "Виден класс `RuntimeManager` с методом `__init__`, принимающим несколько параметров. Фиксированы также константы `ACTION_TIMEOUT_SECONDS` и `ACTION_POLL_INTERVAL_SECONDS`."
|
||||
"answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип",
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 0,
|
||||
"post_evidence_gate": 2,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"draft_answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,250 @@
|
||||
# plba-v3-open-file-runtime
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Открой файл src/app_runtime/core/runtime.py
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 1,
|
||||
"llm_answer": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип `LogManager`\n- `workers`: тип `WorkerSupervisor`\n- `control_plane`: тип `ControlPlaneService`\n\nТакже определены константы таймаутов:\n- `ACTION_TIMEOUT_SECONDS = 10.0`\n- `ACTION_POLL_INTERVAL_SECONDS = 0.05`",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Steps
|
||||
[
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 1
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 132
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 1,
|
||||
"answer_path_rag_count": 1,
|
||||
"resolved_symbol_status": "not_requested",
|
||||
"resolved_symbol": null,
|
||||
"requested_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": "exact_path_fetch"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": 200
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"requests": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"query": "Открой файл src/app_runtime/core/runtime.py",
|
||||
"ranking_profile": "code"
|
||||
}
|
||||
],
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C0_SOURCE_CHUNKS": 132
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"target_type": "file",
|
||||
"evidence_count": 1,
|
||||
"code_chunk_count": 1,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 0,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "not_requested",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 3550
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_open_file_answer",
|
||||
"answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип",
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 2,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"draft_answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
## Diagnostics
|
||||
{
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "not_requested"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Открой файл src/app_runtime/core/runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
],
|
||||
"requested_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 1,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 1
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"target_type": "file",
|
||||
"evidence_count": 1,
|
||||
"code_chunk_count": 1,
|
||||
"entrypoint_count": 0,
|
||||
"relation_count": 0,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "not_requested",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
]
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "src/app_runtime/core/runtime.py",
|
||||
"draft_answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "В файле `src/app_runtime/core/runtime.py` определён класс `RuntimeManager`.\nУ него есть несколько классов полей с умолчательными сервисами:\n- `configuration`: тип `ConfigurationManager`\n- `services`: тип `ServiceContainer`\n- `traces`: тип `TraceService`\n- `health`: тип `HealthRegistry`\n- `logs`: тип"
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {
|
||||
"router": 1,
|
||||
"retrieval": 132,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 3550,
|
||||
"post_evidence_gate": 2
|
||||
}
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"case_id": "plba-v2-trace-flow-runtime-start",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"case_id": "plba-v3-trace-flow-runtime-start",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Покажи поток выполнения при запуске RuntimeManager",
|
||||
@@ -10,7 +10,7 @@
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 37,
|
||||
"llm_answer": "1. Запускается `RuntimeManager` через импорт в `bootstrap.py` (`src/plba/bootstrap.py:4`).\n2. Далее, в `control/service.py`, происходит повторный импорт и переопределение переменной `RuntimeManager` как `app_runtime.core.runtime.RuntimeManager` (`src/app_runtime/control/service.py:9`).\n3. В файле `core/runtime.py` начинается определение класса `RuntimeManager`. Этот класс управляет состоянием приложения и участвует в управлении жизненным циклом различных сервисов и модулей (`src/app_runtime/core/runtime.py:18-179`).\n4. Из `__init__.py` модуля `plba` (`src/plba/__init__.py:16`) импортируется другой экземпляр `RuntimeManager`.\n5. Затем идет обращение к инициализации объекта `ControlPlaneService` в модуле `control/service.py` (`src/app_runtime/control/service.py:12-52`), который регистрирует каналы управления.\n6. Контроллер канала управления определяется в `base.py` файла `control` и имеет методы для запуска и остановки каналов (`src/app_runtime/control/base.py:21-28`).\n7. В `control/http_channel.py` создается объект `HttpControlChannel`, управляющий HTTP-запросами с использованием библиотеки uvicorn (`src/app_runtime/control/http_channel.py:12-57`).\n8. Модуль `control/http_app.py` создает фабрику приложений для обработки HTTP-запросов, связанных с управлением состоянием системы (`src/app_runtime/control/http_app.py:15-53`).\n9. Инициализация конфигурации и параметров происходит в методах `_register_core_services` и `_start_async` внутри класса `RuntimeManager` (`src/app_runtime/core/runtime.py:32-127`).\n\nПолный путь вызова:\n\n1. `src/plba/bootstrap.py`\n2. `src/app_runtime/control/service.py`\n3. `src/app_runtime/core/runtime.py`\n4. `src/plba/__init__.py`\n5. `src/app_runtime/control/service.py`\n6. `src/app_runtime/control/base.py`\n7. `src/app_runtime/control/http_channel.py`\n8. `src/app_runtime/control/http_app.py`\n9. `src/app_runtime/core/runtime.py`",
|
||||
"llm_answer": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связях внутри класса `RuntimeManager`. \nКонкретные реализации логики запуска находятся в файле `src/app_runtime/core/runtime.py`, строки 32–127.\n\nПоток выполнения полностью восстанавливается по данным контекстного фрагмента.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
@@ -120,12 +120,16 @@
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "pending",
|
||||
"resolved_symbol": null,
|
||||
"status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"alternatives": [
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager",
|
||||
"RuntimeManager"
|
||||
],
|
||||
"confidence": 0.0
|
||||
"confidence": 0.99
|
||||
},
|
||||
"evidence_policy": {
|
||||
"require_def": true,
|
||||
@@ -1431,6 +1435,11 @@
|
||||
"relations": [
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 32,
|
||||
"end_line": 52,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager.add_config_file",
|
||||
"metadata": {
|
||||
"edge_id": "a23b8a11ebdb12708b60c96ea12a69f7f042082f1adfddd572444e246d81d167",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1471,6 +1480,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 33,
|
||||
"end_line": 39,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager.__init__",
|
||||
"metadata": {
|
||||
"edge_id": "d43af85989222ee6d788ce418cdcb217c7ff044cfb915e3bdbd184417dc7bd61",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1511,6 +1525,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 25,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.stop",
|
||||
"metadata": {
|
||||
"edge_id": "d5433e2950fb6f913453de2694d697f2c5c5b0e759501aa31c37125d4d29c118",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1551,6 +1570,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 51,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService._stop_async",
|
||||
"metadata": {
|
||||
"edge_id": "991ae894d11340626f4d9361e176c5009c2f33d95ce1a8864740bc85306accc3",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1591,6 +1615,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 32,
|
||||
"end_line": 59,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager.start",
|
||||
"metadata": {
|
||||
"edge_id": "98312ace7fc62b1c7194c5aa1732b6ef736eae1668a3a120dd1ecd5ab1d64f7a",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1631,6 +1660,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 32,
|
||||
"end_line": 127,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager._register_core_services",
|
||||
"metadata": {
|
||||
"edge_id": "3e5811f3b511fa0cabe363f5d01f2ac5fa039bc8b93f7ee108323e1f5f45a293",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1671,6 +1705,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 17,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.register_channel",
|
||||
"metadata": {
|
||||
"edge_id": "e21fe35e6cd37bb929561a316c9b5156bd379de768b11d96c989a75a4a9330f2",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1711,6 +1750,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 20,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService.start",
|
||||
"metadata": {
|
||||
"edge_id": "dc85f1ea8fe46c5223a32b4623a249512af7ea30f3af0d890c2fbe842c74d3c2",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1751,6 +1795,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"start_line": 14,
|
||||
"end_line": 47,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "ControlPlaneService.__init__",
|
||||
"target": "ControlPlaneService._start_async",
|
||||
"metadata": {
|
||||
"edge_id": "e8e2ddef7499bed745cce7a83d5130d145e9787ca9ddc73f5898372a8da2be06",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1791,6 +1840,11 @@
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"start_line": 33,
|
||||
"end_line": 127,
|
||||
"edge_type": "dataflow_slice",
|
||||
"source": "RuntimeManager.__init__",
|
||||
"target": "RuntimeManager._register_core_services",
|
||||
"metadata": {
|
||||
"edge_id": "aac6f9dda73963b977083a892bee39a48eca4fbd7404787e022ecf4ebedec65d",
|
||||
"edge_type": "dataflow_slice",
|
||||
@@ -1830,37 +1884,83 @@
|
||||
"content": "RuntimeManager.__init__\n -> RuntimeManager.services\n -> RuntimeManager._register_core_services"
|
||||
}
|
||||
],
|
||||
"semantic_hints": [
|
||||
{
|
||||
"path": "src/app_runtime/core/runtime.py",
|
||||
"title": "RuntimeManager",
|
||||
"symbol": "RuntimeManager",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.67,
|
||||
"content": "RuntimeManager\nrole: pipeline_stage\n\nResponsibilities:\n- name suffix suggests manager\n- orchestrates role-like calls (4)\n- reads and writes state attributes\n- participates in dataflow slices (50)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/base.py",
|
||||
"title": "ControlChannel",
|
||||
"symbol": "ControlChannel",
|
||||
"role": "model",
|
||||
"confidence": 0.99,
|
||||
"content": "ControlChannel\nrole: model\n\nResponsibilities:\n- default model role"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/base.py",
|
||||
"title": "ControlActionSet",
|
||||
"symbol": "ControlActionSet",
|
||||
"role": "model",
|
||||
"confidence": 0.99,
|
||||
"content": "ControlActionSet\nrole: model\n\nResponsibilities:\n- default model role"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/service.py",
|
||||
"title": "ControlPlaneService",
|
||||
"symbol": "ControlPlaneService",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.57,
|
||||
"content": "ControlPlaneService\nrole: pipeline_stage\n\nResponsibilities:\n- name suffix suggests service\n- reads and writes state attributes\n- participates in dataflow slices (5)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_runner.py",
|
||||
"title": "UvicornThreadRunner",
|
||||
"symbol": "UvicornThreadRunner",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "UvicornThreadRunner\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (24)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_channel.py",
|
||||
"title": "HttpControlChannel",
|
||||
"symbol": "HttpControlChannel",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "HttpControlChannel\nrole: pipeline_stage\n\nResponsibilities:\n- reads and writes state attributes\n- participates in dataflow slices (10)"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "HttpControlAppFactory",
|
||||
"symbol": "HttpControlAppFactory",
|
||||
"role": "factory",
|
||||
"confidence": 0.99,
|
||||
"content": "HttpControlAppFactory\nrole: factory\n\nResponsibilities:\n- name suffix suggests factory"
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/workflow/persistence/workflow_persistence.py",
|
||||
"title": "WorkflowPersistence",
|
||||
"symbol": "WorkflowPersistence",
|
||||
"role": "pipeline_stage",
|
||||
"confidence": 0.99,
|
||||
"content": "WorkflowPersistence\nrole: pipeline_stage\n\nResponsibilities:\n- orchestrates role-like calls (2)\n- reads and writes state attributes\n- participates in dataflow slices (16)"
|
||||
}
|
||||
],
|
||||
"entrypoints": [
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.post",
|
||||
"metadata": {
|
||||
"entry_id": "56ed4b3229229e985cbf949d567b742b156412c7280eba9b5b54668f61bf0305",
|
||||
"entry_type": "http",
|
||||
"framework": "fastapi",
|
||||
"route_or_command": "app.post",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"is_test": false,
|
||||
"lang_payload": {
|
||||
"methods": [
|
||||
"POST"
|
||||
]
|
||||
},
|
||||
"artifact_type": null,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.get",
|
||||
"start_line": 31,
|
||||
"end_line": 34,
|
||||
"http_method": "GET",
|
||||
"route_path": "/health",
|
||||
"handler_symbol": "health",
|
||||
"handler_symbol_id": "ab49f8d604dfed17bd83972a4158047a7c773c20ff58fbabc7963f4a1ec96834",
|
||||
"route_or_command": "app.get",
|
||||
"metadata": {
|
||||
"entry_id": "5377b9336800b5d63cc3b67a58730d18a409b245650dd9449325d87c64e24f62",
|
||||
"entry_type": "http",
|
||||
@@ -1888,6 +1988,13 @@
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.get",
|
||||
"start_line": 38,
|
||||
"end_line": 42,
|
||||
"http_method": "GET",
|
||||
"route_path": "/actions/{action}",
|
||||
"handler_symbol": "action",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"route_or_command": "app.get",
|
||||
"metadata": {
|
||||
"entry_id": "06e2f03cced7c1146b2d29f81951f2a2839140484eae22b2d6a63075d903ca4a",
|
||||
"entry_type": "http",
|
||||
@@ -1911,6 +2018,40 @@
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "src/app_runtime/control/http_app.py",
|
||||
"title": "app.post",
|
||||
"start_line": 38,
|
||||
"end_line": 42,
|
||||
"http_method": "POST",
|
||||
"route_path": "/actions/{action}",
|
||||
"handler_symbol": "action",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"route_or_command": "app.post",
|
||||
"metadata": {
|
||||
"entry_id": "56ed4b3229229e985cbf949d567b742b156412c7280eba9b5b54668f61bf0305",
|
||||
"entry_type": "http",
|
||||
"framework": "fastapi",
|
||||
"route_or_command": "app.post",
|
||||
"handler_symbol_id": "4da634384f08efb2d4cc12ac58ce1e667a780481392b4e715ae963e8e8a37fab",
|
||||
"is_test": false,
|
||||
"lang_payload": {
|
||||
"methods": [
|
||||
"POST"
|
||||
]
|
||||
},
|
||||
"artifact_type": null,
|
||||
"blob_sha": "1cebc374b1999638635b2f2c2ccf1dcf11c465914c22dd9490b1531278846919",
|
||||
"repo_id": "plba",
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"test_candidates": [],
|
||||
@@ -3380,11 +3521,11 @@
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 50,
|
||||
"C0_SOURCE_CHUNKS": 69,
|
||||
"C4_SEMANTIC_ROLES": 82,
|
||||
"C2_DEPENDENCY_GRAPH": 78,
|
||||
"C3_ENTRYPOINTS": 11
|
||||
"C1_SYMBOL_CATALOG": 59,
|
||||
"C0_SOURCE_CHUNKS": 45,
|
||||
"C4_SEMANTIC_ROLES": 21,
|
||||
"C2_DEPENDENCY_GRAPH": 62,
|
||||
"C3_ENTRYPOINTS": 21
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -3400,6 +3541,9 @@
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
@@ -3414,7 +3558,7 @@
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"symbol_resolution_status": "pending"
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
@@ -3467,8 +3611,42 @@
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 37
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 37,
|
||||
"code_chunk_count": 37,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 10,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ"
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {}
|
||||
"timings_ms": {
|
||||
"router": 2,
|
||||
"retrieval": 211,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 3158,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
},
|
||||
"rag_rows": [
|
||||
{
|
||||
@@ -4863,6 +5041,158 @@
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
},
|
||||
"token_usage": {
|
||||
"prompt_name": "code_qa_trace_flow_answer",
|
||||
"tokens_in_estimate": 4310
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 2
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 211
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 37,
|
||||
"answer_path_rag_count": 37,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector",
|
||||
"C4_SEMANTIC_ROLES": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector",
|
||||
"C3_ENTRYPOINTS": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": 8,
|
||||
"C0_SOURCE_CHUNKS": 8,
|
||||
"C4_SEMANTIC_ROLES": 8,
|
||||
"C2_DEPENDENCY_GRAPH": 10,
|
||||
"C3_ENTRYPOINTS": 10
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C4_SEMANTIC_ROLES": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 59,
|
||||
"C0_SOURCE_CHUNKS": 45,
|
||||
"C4_SEMANTIC_ROLES": 21,
|
||||
"C2_DEPENDENCY_GRAPH": 62,
|
||||
"C3_ENTRYPOINTS": 21
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 37,
|
||||
"code_chunk_count": 37,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 10,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 37
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 3158
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_trace_flow_answer",
|
||||
"answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,305 @@
|
||||
# plba-v3-trace-flow-runtime-start
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_02_pipeline/full_chain_plba_code_subintents_one_per_subintent.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Покажи поток выполнения при запуске RuntimeManager
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 37,
|
||||
"llm_answer": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связях внутри класса `RuntimeManager`. \nКонкретные реализации логики запуска находятся в файле `src/app_runtime/core/runtime.py`, строки 32–127.\n\nПоток выполнения полностью восстанавливается по данным контекстного фрагмента.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Steps
|
||||
[
|
||||
{
|
||||
"step": "router",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"router": 2
|
||||
},
|
||||
"output": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "retrieval",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"retrieval": 211
|
||||
},
|
||||
"output": {
|
||||
"rag_count": 37,
|
||||
"answer_path_rag_count": 37,
|
||||
"resolved_symbol_status": "resolved",
|
||||
"resolved_symbol": "RuntimeManager",
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
},
|
||||
"diagnostics": {
|
||||
"executed_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": "vector",
|
||||
"C0_SOURCE_CHUNKS": "vector",
|
||||
"C4_SEMANTIC_ROLES": "vector",
|
||||
"C2_DEPENDENCY_GRAPH": "vector",
|
||||
"C3_ENTRYPOINTS": "vector"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": 8,
|
||||
"C0_SOURCE_CHUNKS": 8,
|
||||
"C4_SEMANTIC_ROLES": 8,
|
||||
"C2_DEPENDENCY_GRAPH": 10,
|
||||
"C3_ENTRYPOINTS": 10
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C1_SYMBOL_CATALOG": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C4_SEMANTIC_ROLES": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C2_DEPENDENCY_GRAPH": {
|
||||
"path_scope": []
|
||||
},
|
||||
"C3_ENTRYPOINTS": {
|
||||
"path_scope": []
|
||||
}
|
||||
},
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C1_SYMBOL_CATALOG": 59,
|
||||
"C0_SOURCE_CHUNKS": 45,
|
||||
"C4_SEMANTIC_ROLES": 21,
|
||||
"C2_DEPENDENCY_GRAPH": 62,
|
||||
"C3_ENTRYPOINTS": 21
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "pre_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"pre_evidence_gate": 1
|
||||
},
|
||||
"input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 37,
|
||||
"code_chunk_count": 37,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 10,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"failure_reasons": [],
|
||||
"degraded_message": "",
|
||||
"evidence_count": 37
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "llm",
|
||||
"status": "completed",
|
||||
"timings_ms": {
|
||||
"llm": 3158
|
||||
},
|
||||
"output": {
|
||||
"prompt_name": "code_qa_trace_flow_answer",
|
||||
"answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient"
|
||||
}
|
||||
},
|
||||
{
|
||||
"step": "post_evidence_gate",
|
||||
"status": "passed",
|
||||
"timings_ms": {
|
||||
"post_evidence_gate": 1,
|
||||
"post_evidence_gate_recheck": 0,
|
||||
"repair": 0
|
||||
},
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
## Diagnostics
|
||||
{
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"answer_policy_branch": "normal_answer",
|
||||
"decision_reason": "evidence_sufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"path_scope": [],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
],
|
||||
"symbol_resolution_status": "resolved"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Покажи поток выполнения при запуске RuntimeManager",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"path_scope": [],
|
||||
"requested_layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C1_SYMBOL_CATALOG",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C4_SEMANTIC_ROLES",
|
||||
"hit_count": 8,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C2_DEPENDENCY_GRAPH",
|
||||
"hit_count": 10,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
},
|
||||
{
|
||||
"layer_id": "C3_ENTRYPOINTS",
|
||||
"hit_count": 3,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 37
|
||||
},
|
||||
"evidence_gate_input": {
|
||||
"resolved_target": "RuntimeManager",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"target_type": "symbol",
|
||||
"evidence_count": 37,
|
||||
"code_chunk_count": 37,
|
||||
"entrypoint_count": 3,
|
||||
"relation_count": 10,
|
||||
"test_evidence_count": 0,
|
||||
"symbol_resolution_status": "resolved",
|
||||
"path_scope": []
|
||||
},
|
||||
"post_evidence_gate": {
|
||||
"input": {
|
||||
"answer_mode": "normal",
|
||||
"degraded_message": "",
|
||||
"resolved_target": "RuntimeManager",
|
||||
"draft_answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ",
|
||||
"repair_candidate": true
|
||||
},
|
||||
"output": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": [],
|
||||
"repair_used": false,
|
||||
"final_answer_preview": "При запуске `RuntimeManager` выполняются следующие шаги:\n\n1. Инициализация конфигурации через `add_config_file`.\n2. Инициализация сервисов.\n3. Регистрация основных служб через `_register_core_services`.\n4. Запуск менеджера с помощью метода `start`.\n\nЭти этапы основаны на сигнатурах методов и их связ"
|
||||
}
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {
|
||||
"router": 2,
|
||||
"retrieval": 211,
|
||||
"pre_evidence_gate": 1,
|
||||
"llm": 3158,
|
||||
"post_evidence_gate": 1
|
||||
}
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -0,0 +1,36 @@
|
||||
# pipeline_setup_v3 summary
|
||||
|
||||
Passed: 7/7
|
||||
|
||||
| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass |
|
||||
|------|------|------|-------|-------------------|------------|--------|------|
|
||||
| full_chain_plba_code_subintents_one_per_subintent.yaml | plba-v3-open-file-runtime | full_chain | Открой файл src/app_runtime/core/runtime.py | OPEN_FILE | C0_SOURCE_CHUNKS:1 | 1128 | ✓ |
|
||||
| full_chain_plba_code_subintents_one_per_subintent.yaml | plba-v3-explain-runtime-manager | full_chain | Объясни как работает класс RuntimeManager | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | 4504 | ✓ |
|
||||
| full_chain_plba_code_subintents_one_per_subintent.yaml | plba-v3-explain-local-http-channel | full_chain | Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так? | EXPLAIN_LOCAL | C0_SOURCE_CHUNKS:1, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:4 | 2071 | ✓ |
|
||||
| full_chain_plba_code_subintents_one_per_subintent.yaml | plba-v3-find-tests-runtime-manager | full_chain | Где тесты для RuntimeManager? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | 3660 | ✓ |
|
||||
| full_chain_plba_code_subintents_one_per_subintent.yaml | plba-v3-find-entrypoints-health-endpoint | full_chain | Где health endpoint? | FIND_ENTRYPOINTS | C0_SOURCE_CHUNKS:7, C3_ENTRYPOINTS:3 | 2531 | ✓ |
|
||||
| full_chain_plba_code_subintents_one_per_subintent.yaml | plba-v3-trace-flow-runtime-start | full_chain | Покажи поток выполнения при запуске RuntimeManager | TRACE_FLOW | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:10, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | 4310 | ✓ |
|
||||
| full_chain_plba_code_subintents_one_per_subintent.yaml | plba-v3-architecture-runtime-manager | full_chain | Какие компоненты участвуют в RuntimeManager? | ARCHITECTURE | C0_SOURCE_CHUNKS:4, C1_SYMBOL_CATALOG:6, C2_DEPENDENCY_GRAPH:8, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:12 | 4061 | ✓ |
|
||||
|
||||
## LLM Answers
|
||||
- **plba-v3-open-file-runtime**
|
||||
Query: Открой файл src/app_runtime/core/runtime.py
|
||||
> В файле \`src/app\_runtime/core/runtime.py\` определён класс \`RuntimeManager\`. У него есть несколько классов полей с умолчательными сервисами: \- \`configuration\`: тип \`ConfigurationManager\` \- \`services\`: тип \`ServiceContainer\` \- \`traces\`: тип \`TraceService\` \- \`health\`: тип \`HealthRegistry\` \- \`logs\`: тип \`LogManager\` \- \`workers\`: тип \`WorkerSupervisor\` \- \`control\_plane\`: тип \`ControlPlaneService\` Также определены константы таймаутов: \- \`ACTION\_TIMEOUT\_SECONDS = 10.0\` \- \`ACTION\_POLL\_INTERVAL\_SECONDS = 0.05\`
|
||||
- **plba-v3-explain-runtime-manager**
|
||||
Query: Объясни как работает класс RuntimeManager
|
||||
> Недостаточно подтверждённых данных для уверенного ответа по RuntimeManager.
|
||||
- **plba-v3-explain-local-http-channel**
|
||||
Query: Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?
|
||||
> Класс HttpControlChannel наследует ControlChannel и реализует HTTP\-канал управления. Он принимает хост, порт и таймаут при инициализации, создаёт экземпляр UvicornThreadRunner для запуска сервера и использует HttpControlAppFactory для создания FastAPI\-приложения. Метод start запускает сервер с переданным набором действий \(ControlActionSet\), а метод stop останавливает его. Свойство port возвращает текущий порт runner. Внутри класса определены два обработчика: \_health\_response проверяет здоровье канала, возвращая статус "unhealthy" если действия не установлены; \_action\_response предположительно обрабатывает запросы на выполнение действий, но его реализация в данном фрагменте не показана.
|
||||
- **plba-v3-find-tests-runtime-manager**
|
||||
Query: Где тесты для RuntimeManager?
|
||||
> Прямые тесты для \`RuntimeManager\` находятся в файле \`tests/test\_runtime.py\`. Косвенные тесты: \- В файле \`tests/test\_business\_control\_actions.py\` есть тесты, использующие сущности контроля, которые взаимодействуют с \`RuntimeManager\`.
|
||||
- **plba-v3-find-entrypoints-health-endpoint**
|
||||
Query: Где health endpoint?
|
||||
> Подтверждённая точка входа для health endpoint: GET /health, declared in src/app\_runtime/control/http\_app.py, lines 31\-34, handler function named 'health'.
|
||||
- **plba-v3-trace-flow-runtime-start**
|
||||
Query: Покажи поток выполнения при запуске RuntimeManager
|
||||
> При запуске \`RuntimeManager\` выполняются следующие шаги: 1. Инициализация конфигурации через \`add\_config\_file\`. 2. Инициализация сервисов. 3. Регистрация основных служб через \`\_register\_core\_services\`. 4. Запуск менеджера с помощью метода \`start\`. Эти этапы основаны на сигнатурах методов и их связях внутри класса \`RuntimeManager\`. Конкретные реализации логики запуска находятся в файле \`src/app\_runtime/core/runtime.py\`, строки 32–127. Поток выполнения полностью восстанавливается по данным контекстного фрагмента.
|
||||
- **plba-v3-architecture-runtime-manager**
|
||||
Query: Какие компоненты участвуют в RuntimeManager?
|
||||
> Компоненты, участвующие в подсистеме RuntimeManager: \- \*\*RuntimeManager\*\* \(src/app\_runtime/core/runtime.py:18\-179\) \- \*\*ControlPlaneService.\_\_init\_\_\*\* \(src/app\_runtime/control/service.py:14\-51\) \- \*\*RuntimeManager.\_\_init\_\_\*\* \(src/app\_runtime/core/runtime.py:32\-127\) \- \*\*ControlPlaneService.\_start\_async\*\* \(src/app\_runtime/control/service.py:14\-47\) \- \*\*RuntimeManager.start\*\* \(src/app\_runtime/core/runtime.py:32\-59\) \- \*\*ControlPlaneService.start\*\* \(src/app\_runtime/control/service.py:14\-20\) \- \*\*ControlPlaneService.stop\*\* \(src/app\_runtime/control/service.py:14\-25\) \- \*\*ControlPlaneService.\_stop\_async\*\* \(src/app\_runtime/control/service.py:14\-51\) \- \*\*RuntimeManager.add\_config\_file\*\* \(src/app\_runtime/core/runtime.py:32\-52\) \- \*\*ControlPlaneService.register\_channel\*\* \(src/app\_runtime/control/service.py:14\-17\) Связи между компонентами: \- \*\*ControlPlaneService.\_\_init\_\_ dataflow\_slice…
|
||||
@@ -1,34 +0,0 @@
|
||||
# plba-v2-architecture-control-plane
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Какие компоненты участвуют в ControlPlaneService?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Подтвержденные связи и роли компонентов в контексте ControlPlaneService:\n\n### Компоненты и их роли\n\n1. **ControlPlaneService**\n - Роль: pipeline_stage\n - Описание: Инициализирует каналы управления и управляет ими.\n \n2. **ControlChannel**\n - Роль: model\n - Описание: Абстрактный класс для каналов управления с методами старта и остановки.\n\n3. **ControlActionSet**\n - Роль: model\n - Описание: Представляет набор действий контроля.\n\n4. **UvicornThreadRunner**\n - Роль: pipeline_stage\n - Описание: Управляет uvicorn сервером и участвует в потоках данных.\n\n5. **HttpControlChannel**\n - Роль: pipeline_stage\n - Описание: Канал управления HTTP-соединениями, участвующий в потоках данных.\n\n6. **HttpControlAppFactory**\n - Роль: factory\n - Описание: Фабрика для создания fastAPI приложений.\n\n7. **WorkflowPersistence**\n - Роль: pipeline_stage\n - Описание: Хранит информацию о процессах и взаимодействует с ними.\n\n8. **InMemoryTaskQueue**\n - Роль: pipeline_stage\n - Описание: Очередь задач, используемая для хранения промежуточных результатов.\n\n9. **ConfigFileLoader**\n - Роль: pipeline_stage\n - Описание: Загружает конфигурационные файлы и участвует в управлении состоянием приложения.\n\n10. **TraceContextStore**\n - Роль: pipeline_stage\n - Описание: Сохраняет контекст трассировки и управляет им.\n\n11. **WorkerSupervisor**\n - Роль: pipeline_stage\n - Описание: Наблюдает за рабочими процессами и обеспечивает их корректное выполнение.\n\n12. **WorkflowEngine**\n - Роль: pipeline_stage\n - Описание: Координирует выполнение рабочих процессов и управление ими.\n\n### Ограничения и замечания\n\nВсе перечисленные компоненты прямо или косвенно связаны с ControlPlaneService через зависимости или вызовы методов внутри ControlPlaneService. Они активно участвуют в его работе и обеспечивают функциональность и инфраструктуру, необходимую для выполнения его обязанностей.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"ControlPlaneService"
|
||||
],
|
||||
"layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,34 +0,0 @@
|
||||
# plba-v2-architecture-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Какие компоненты участвуют в RuntimeManager?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "### Компоненты, участвующие в RuntimeManager\n\n#### Подтвержденные связи\n1. **RuntimeManager**\n - Role: Pipeline Stage\n - Responsibilities:\n - Manager responsibilities\n - Orchestration of role-like calls\n - State attribute reading/writing\n - Participation in dataflow slices\n\n2. **ControlPlaneService**\n - Role: Pipeline Stage\n - Responsibilities:\n - Service responsibilities\n - State attribute reading/writing\n - Participation in dataflow slices\n\n3. **UvicornThreadRunner**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n4. **HttpControlChannel**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n5. **WorkflowPersistence**\n - Role: Pipeline Stage\n - Responsibilities:\n - Orchestration of role-like calls\n - State attribute reading/writing\n - Participation in dataflow slices\n\n6. **InMemoryTaskQueue**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n7. **ConfigFileLoader**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n8. **TraceContextStore**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n9. **WorkerSupervisor**\n - Role: Pipeline Stage\n - Responsibilities:\n - State attribute reading/writing\n - Participation in dataflow slices\n\n### Ограничения найденного контекста\n- Все перечисленные компоненты являются участниками данных потоков выполнения (dataflow slices).\n- Каждый компонент выполняет операции чтения и записи состояния атрибутов.\n- Некоторые из них выполняют дополнительные обязанности, такие как участие в оркестрации или инициировании ролей.\n\nТаким образом, участники RuntimeManager включают перечисленные выше компоненты.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,34 +0,0 @@
|
||||
# plba-v2-explain-create-runtime
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Что делает функция create_runtime?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Функция `create_runtime` инициализирует и настраивает менеджер выполнения приложения.\n\n**Ключевые шаги:**\n1. Инициализация менеджера выполнения (`RuntimeManager()`).\n2. Добавление конфигурационного файла, если указан путь (`add_config_file`).\n3. Регистрация HTTP-канала управления, если включен режим управления (`register_channel`).\n4. Регистрация модуля приложения в менеджере выполнения (`register_module`).\n\n**Опорные файлы:**\n- `src/plba/bootstrap.py:8-29`\n\nЭтот процесс позволяет настроить и запустить приложение с учетом заданных конфигураций и режимов управления.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"create_runtime"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,34 +0,0 @@
|
||||
# plba-v2-explain-local-http-channel
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 13,
|
||||
"llm_answer": "Класс `HttpControlChannel` предназначен для управления HTTP каналом контроля в приложении.\n\n**Ключевые шаги его реализации:**\n1. Инициализация (`__init__`) – принимает параметры хоста, порта и тайм-аута, создаёт внутренние объекты управления и инициализирует состояние канала.\n2. Запуск (`start`) – запускает сервер с заданными действиями контроля, создавая приложение и вызывая runner для запуска сервера.\n3. Остановка (`stop`) – останавливает запущенный сервер.\n4. Свойство `port` – возвращает порт, используемый сервером.\n5. Метод `_health_response` – генерирует ответ о состоянии здоровья системы (здоров или нет).\n\nОпорные файлы:\n- `src/app_runtime/control/http_channel.py:12-57` (определение класса и методов)\n- `src/app_runtime/control/http_channel.py:13-17` (инициализация)\n- `src/app_runtime/control/http_channel.py:19-22` (запуск)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
],
|
||||
"symbol_candidates": [
|
||||
"HttpControlChannel"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,36 +0,0 @@
|
||||
# plba-v2-explain-nonexistent-symbol
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: False
|
||||
|
||||
## Query
|
||||
Объясни класс RuntimeFactoryManager
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Класс `RuntimeFactoryManager` не указан напрямую в предоставленном коде. Однако, судя по контексту и взаимосвязям между классами:\n\n**Назначение класса:**\n- Управление фабрикой для создания экземпляров классов, связанных с управлением рабочим состоянием приложения.\n\n**Ключевые шаги:**\n1. Инициализация фабрики.\n2. Создание экземпляра соответствующего класса управления каналом (`ControlChannel`) или другого необходимого класса.\n3. Регистрация созданных каналов в сервисе управления каналами.\n\n**Опорные файлы:**\n- `src/app_runtime/control/base.py`: Объявление абстрактного базового класса `ControlChannel`.\n- `src/app_runtime/control/service.py`: Реализация сервиса управления каналами, который регистрирует созданные каналы.\n- `src/app_runtime/control/http_channel.py`: Определение канала HTTP, используемого для взаимодействия через HTTP-протокол.\n\nОбратите внимание, что прямое определение класса `RuntimeFactoryManager` отсутствует в представленном коде, поэтому информация о его назначении основана на логическом выводе и контексте использования других классов.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeFactoryManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- answer_mode: expected degraded, got answered
|
||||
- retrieval: expected empty rag, got 33 rows
|
||||
- llm: expected answer to contain 'не найдена'
|
||||
@@ -1,34 +0,0 @@
|
||||
# plba-v2-explain-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Объясни как работает класс RuntimeManager
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "**Класс `RuntimeManager`** отвечает за управление жизненным циклом приложения и координацию различных компонентов системы.\n\n### Ключевые шаги работы класса:\n1. **Инициализация конфигурации:** \n Класс инициализирует начальные настройки приложения, включая загрузку конфигурационных файлов.\n \n2. **Регистрация каналов управления:**\n Метод `register_channel` позволяет зарегистрировать каналы управления, которые будут использоваться для взаимодействия с различными компонентами системы.\n\n3. **Запуск и остановка системы:**\n Методы `start` и `stop` инициируют запуск и остановку всех зарегистрированных каналов управления, обеспечивая корректное завершение работы системы.\n\n4. **Сохранение состояния:**\n Метод `snapshot` создает снимок текущего состояния системы, который может быть использован для восстановления или анализа состояния в будущем.\n\n### Опорные файлы:\n- `src/app_runtime/core/runtime.py`: Определение и реализация класса `RuntimeManager`.\n- `src/app_runtime/control/service.py`: Реализация методов регистрации и запуска каналов управления.\n- `src/app_runtime/control/http_channel.py`: Управление HTTP-каналом для взаимодействия с внешним миром.\n\nЭтот класс играет центральную роль в управлении потоком выполнения и состоянием приложения, координируя работу различных компонентов и обеспечивая их синхронность и согласованность.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because one or more lines are too long
@@ -1,34 +0,0 @@
|
||||
# plba-v2-explain-trace-service
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Объясни как работает класс TraceService
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "**Класс `TraceService`** предназначен для управления контекстом трассировки в приложении. Его основные функции включают создание нового контекста трассировки, получение текущего идентификатора трассировки и закрытие контекста.\n\n**Ключевые шаги работы класса:**\n1. **Инициализация:** При создании экземпляра `TraceService` задаются транспорт и хранилище контекста трассировки (по умолчанию используются заглушки).\n2. **Создание контекста:** Метод `create_context` создает новый контекст трассировки с заданными параметрами (идентификатор, родительский идентификатор, тип и атрибуты). Контекст сохраняется в хранилище.\n3. **Получение текущего идентификатора:** Метод `current_trace_id` возвращает текущий идентификатор трассировки.\n4. **Открытие контекста:** Метод `open_context` открывает новый контекст трассировки.\n5. **Закрытие контекста:** Метод `close_context` завершает текущую трассировку.\n\n**Опорные файлы:**\n- `src/app_runtime/tracing/service.py`: определение и реализация класса `TraceService`.\n- Другие файлы содержат декларации и зависимости, относящиеся к классу.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"TraceService"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,33 +0,0 @@
|
||||
# plba-v2-find-entrypoints-control-plane
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Найди точки входа HTTP control plane
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 9,
|
||||
"llm_answer": "confirmed_entrypoints:\n- src/app_runtime/control/http_app.py:app.post (line range: 38-42)\n- src/app_runtime/control/http_app.py:app.get (line range: 31-34)\n- src/app_runtime/control/http_app.py:app.get (line range: 38-42)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"HTTP",
|
||||
"control",
|
||||
"plane"
|
||||
],
|
||||
"layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-entrypoints-health-endpoint
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: False
|
||||
|
||||
## Query
|
||||
Где health endpoint?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 9,
|
||||
"llm_answer": "health endpoint: \n- src/app_runtime/control/http_app.py:38-42 (app.post)\n- src/app_runtime/control/http_app.py:31-34 (app.get)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"health",
|
||||
"endpoint"
|
||||
],
|
||||
"layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- llm: expected answer to contain 'GET /health'
|
||||
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-tests-create-runtime
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для create_runtime?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "- tests/test_runtime.py:342-405 (test_public_plba_package_exports_runtime_builder_and_worker_contract)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"create_runtime"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-tests-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для RuntimeManager?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "- tests/test_runtime.py:12-12\n- tests/test_business_control_actions.py:14-14",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because one or more lines are too long
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-tests-trace-service
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для TraceService?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "tests/test_runtime.py:test_trace_service_allows_messages_without_status \ntests/test_runtime.py:test_trace_service_writes_contexts_and_messages \ntests/test_runtime.py:test_trace_service_supports_debug_warning_and_error_levels",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"TraceService"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-tests-workflow-runtime-factory-negative
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для WorkflowRuntimeFactory?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "Insufficient evidence for a confident answer. No test candidates found.",
|
||||
"answer_mode": "degraded",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"WorkflowRuntimeFactory"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,31 +0,0 @@
|
||||
# plba-v2-open-file-nonexistent
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: False
|
||||
|
||||
## Query
|
||||
Открой файл src/app_runtime/core/missing_runtime.py
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 0,
|
||||
"llm_answer": "Файл `src/app_runtime/core/missing_runtime.py` не найден.",
|
||||
"answer_mode": "not_found",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- answer_mode: expected degraded, got not_found
|
||||
- llm: expected answer to contain 'Файл src/app_runtime/core/missing_runtime.py не найден.'
|
||||
@@ -1,419 +0,0 @@
|
||||
{
|
||||
"case_id": "plba-v2-open-file-public-api",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"actual": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 1,
|
||||
"llm_answer": "Путь к файлу: src/plba/__init__.py\n\nВ этом файле находятся импортированные модули и классы из различных подпакетов библиотеки plba. Файл служит точкой входа для пользователей, предоставляя доступ к основным функциям и классам библиотеки. В частности, здесь импортируются:\n\n- Функции и классы для создания runtime (create_runtime)\n- Конфигурационные файлы и провайдеры (ConfigFileLoader, FileConfigProvider)\n- Контрольные каналы и службы (ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel)\n- Определения контрактов (ApplicationModule, ConfigProvider, HealthContributor и др.)\n- Менеджеры конфигурации и выполнения (ConfigurationManager, RuntimeManager, ServiceContainer)\n- Службы мониторинга здоровья (HealthRegistry)\n- Управление логированием (LogManager)\n- Очереди задач (InMemoryTaskQueue)\n- Транспортировка трассировки (MySqlTraceTransport, NoOpTraceTransport, TraceService)\n- Определение рабочих потоков и контекстов (StepResult, WorkflowContext, WorkflowDefinition, Workf)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"passed": false,
|
||||
"mismatches": [
|
||||
"llm: expected answer to exclude 'из различных подпакетов'"
|
||||
],
|
||||
"details": {
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"router_result": {
|
||||
"schema_version": "1.1",
|
||||
"intent": "CODE_QA",
|
||||
"retrieval_profile": "code",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"query_plan": {
|
||||
"raw": "Открой файл src/plba/__init__.py",
|
||||
"normalized": "Открой файл src/plba/__init__.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"negations": [],
|
||||
"expansions": [
|
||||
"file"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"path_hints": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"doc_scope_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"symbol_kind_hint": "unknown",
|
||||
"anchors": [
|
||||
{
|
||||
"type": "FILE_PATH",
|
||||
"value": "src/plba/__init__.py",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 12,
|
||||
"end": 32
|
||||
},
|
||||
"confidence": 0.95
|
||||
},
|
||||
{
|
||||
"type": "KEY_TERM",
|
||||
"value": "файл",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 7,
|
||||
"end": 11
|
||||
},
|
||||
"confidence": 0.9
|
||||
}
|
||||
]
|
||||
},
|
||||
"retrieval_spec": {
|
||||
"domains": [
|
||||
"CODE"
|
||||
],
|
||||
"layer_queries": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"top_k": 12
|
||||
}
|
||||
],
|
||||
"filters": {
|
||||
"test_policy": "EXCLUDE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"language": [
|
||||
"python"
|
||||
]
|
||||
},
|
||||
"rerank_profile": "code"
|
||||
},
|
||||
"retrieval_constraints": {
|
||||
"include_globs": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"exclude_globs": [
|
||||
"tests/**",
|
||||
"**/test_*.py",
|
||||
"**/*_test.py"
|
||||
],
|
||||
"prefer_globs": [],
|
||||
"test_file_globs": [],
|
||||
"test_symbol_patterns": [],
|
||||
"max_candidates": 20,
|
||||
"fuzzy_symbol_search": {
|
||||
"enabled": false,
|
||||
"max_distance": 2,
|
||||
"top_k": 5
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "not_requested",
|
||||
"resolved_symbol": null,
|
||||
"alternatives": [],
|
||||
"confidence": 0.0
|
||||
},
|
||||
"evidence_policy": {
|
||||
"require_def": false,
|
||||
"require_flow": false,
|
||||
"require_spec": false,
|
||||
"allow_answer_without_evidence": false
|
||||
}
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"requested_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_spec": {
|
||||
"domains": [
|
||||
"CODE"
|
||||
],
|
||||
"layer_queries": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"top_k": 12
|
||||
}
|
||||
],
|
||||
"filters": {
|
||||
"test_policy": "EXCLUDE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"language": [
|
||||
"python"
|
||||
]
|
||||
},
|
||||
"rerank_profile": "code"
|
||||
},
|
||||
"retrieval_constraints": {
|
||||
"include_globs": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"exclude_globs": [
|
||||
"tests/**",
|
||||
"**/test_*.py",
|
||||
"**/*_test.py"
|
||||
],
|
||||
"prefer_globs": [],
|
||||
"test_file_globs": [],
|
||||
"test_symbol_patterns": [],
|
||||
"max_candidates": 20,
|
||||
"fuzzy_symbol_search": {
|
||||
"enabled": false,
|
||||
"max_distance": 2,
|
||||
"top_k": 5
|
||||
}
|
||||
},
|
||||
"query_plan": {
|
||||
"raw": "Открой файл src/plba/__init__.py",
|
||||
"normalized": "Открой файл src/plba/__init__.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"negations": [],
|
||||
"expansions": [
|
||||
"file"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"path_hints": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"doc_scope_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"symbol_kind_hint": "unknown",
|
||||
"anchors": [
|
||||
{
|
||||
"type": "FILE_PATH",
|
||||
"value": "src/plba/__init__.py",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 12,
|
||||
"end": 32
|
||||
},
|
||||
"confidence": 0.95
|
||||
},
|
||||
{
|
||||
"type": "KEY_TERM",
|
||||
"value": "файл",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 7,
|
||||
"end": 11
|
||||
},
|
||||
"confidence": 0.9
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"retrieval_result": {
|
||||
"target_symbol_candidates": [],
|
||||
"resolved_symbol": null,
|
||||
"symbol_resolution_status": "not_requested",
|
||||
"file_candidates": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"code_chunks": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"path": "src/plba/__init__.py",
|
||||
"title": "src/plba/__init__.py:1-69",
|
||||
"content": "from plba.bootstrap import create_runtime\nfrom plba.config import ConfigFileLoader, FileConfigProvider\nfrom plba.control import ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel\nfrom plba.contracts import (\n ApplicationModule,\n ConfigProvider,\n HealthContributor,\n TraceContext,\n TraceContextRecord,\n TraceLogMessage,\n TraceTransport,\n Worker,\n WorkerHealth,\n WorkerStatus,\n)\nfrom plba.core import ConfigurationManager, RuntimeManager, ServiceContainer\nfrom plba.health import HealthRegistry\nfrom plba.logging import LogManager\nfrom plba.queue import InMemoryTaskQueue\nfrom plba.tracing import MySqlTraceTransport, NoOpTraceTransport, TraceService\nfrom plba.workflow import (\n StepResult,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowEngine,\n WorkflowEngineHooks,\n WorkflowNode,\n WorkflowRuntimeFactory,\n WorkflowStep,\n)\nfrom plba.workers import WorkerSupervisor\n\n__all__ = [\n \"ApplicationModule\",\n \"ConfigFileLoader\",\n \"ConfigProvider\",\n \"ConfigurationManager\",\n \"ControlActionSet\",\n \"ControlChannel\",\n \"ControlPlaneService\",\n \"create_runtime\",\n \"FileConfigProvider\",\n \"HealthContributor\",\n \"HealthRegistry\",\n \"HttpControlChannel\",\n \"InMemoryTaskQueue\",\n \"LogManager\",\n \"MySqlTraceTransport\",\n \"NoOpTraceTransport\",\n \"RuntimeManager\",\n \"ServiceContainer\",\n \"TraceContext\",\n \"TraceContextRecord\",\n \"TraceLogMessage\",\n \"TraceService\",\n \"TraceTransport\",\n \"StepResult\",\n \"Worker\",\n \"WorkerHealth\",\n \"WorkerStatus\",\n \"WorkflowContext\",\n \"WorkflowDefinition\",\n \"WorkflowEngine\",\n \"WorkflowEngineHooks\",\n \"WorkflowNode\",\n \"WorkflowRuntimeFactory\",\n \"WorkflowStep\",\n \"WorkerSupervisor\",\n]",
|
||||
"start_line": 1,
|
||||
"end_line": 69,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "window",
|
||||
"module_or_unit": "src.plba.__init__",
|
||||
"is_test": false,
|
||||
"blob_sha": "24e755ec8c249d14fb0e675b5dbf2b71ab91afb9c849897eebfa9feb2499e19d",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"relations": [],
|
||||
"entrypoints": [],
|
||||
"test_candidates": [],
|
||||
"layer_outcomes": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 1,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"missing_layers": [],
|
||||
"raw_rows": [
|
||||
{
|
||||
"path": "src/plba/__init__.py",
|
||||
"content": "from plba.bootstrap import create_runtime\nfrom plba.config import ConfigFileLoader, FileConfigProvider\nfrom plba.control import ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel\nfrom plba.contracts import (\n ApplicationModule,\n ConfigProvider,\n HealthContributor,\n TraceContext,\n TraceContextRecord,\n TraceLogMessage,\n TraceTransport,\n Worker,\n WorkerHealth,\n WorkerStatus,\n)\nfrom plba.core import ConfigurationManager, RuntimeManager, ServiceContainer\nfrom plba.health import HealthRegistry\nfrom plba.logging import LogManager\nfrom plba.queue import InMemoryTaskQueue\nfrom plba.tracing import MySqlTraceTransport, NoOpTraceTransport, TraceService\nfrom plba.workflow import (\n StepResult,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowEngine,\n WorkflowEngineHooks,\n WorkflowNode,\n WorkflowRuntimeFactory,\n WorkflowStep,\n)\nfrom plba.workers import WorkerSupervisor\n\n__all__ = [\n \"ApplicationModule\",\n \"ConfigFileLoader\",\n \"ConfigProvider\",\n \"ConfigurationManager\",\n \"ControlActionSet\",\n \"ControlChannel\",\n \"ControlPlaneService\",\n \"create_runtime\",\n \"FileConfigProvider\",\n \"HealthContributor\",\n \"HealthRegistry\",\n \"HttpControlChannel\",\n \"InMemoryTaskQueue\",\n \"LogManager\",\n \"MySqlTraceTransport\",\n \"NoOpTraceTransport\",\n \"RuntimeManager\",\n \"ServiceContainer\",\n \"TraceContext\",\n \"TraceContextRecord\",\n \"TraceLogMessage\",\n \"TraceService\",\n \"TraceTransport\",\n \"StepResult\",\n \"Worker\",\n \"WorkerHealth\",\n \"WorkerStatus\",\n \"WorkflowContext\",\n \"WorkflowDefinition\",\n \"WorkflowEngine\",\n \"WorkflowEngineHooks\",\n \"WorkflowNode\",\n \"WorkflowRuntimeFactory\",\n \"WorkflowStep\",\n \"WorkerSupervisor\",\n]",
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"title": "src/plba/__init__.py:1-69",
|
||||
"span_start": 1,
|
||||
"span_end": 69,
|
||||
"lexical_rank": 0,
|
||||
"prefer_bonus": 0,
|
||||
"test_penalty": 0,
|
||||
"structural_rank": 0,
|
||||
"layer_rank": 0,
|
||||
"distance": 0,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "window",
|
||||
"module_or_unit": "src.plba.__init__",
|
||||
"is_test": false,
|
||||
"blob_sha": "24e755ec8c249d14fb0e675b5dbf2b71ab91afb9c849897eebfa9feb2499e19d",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"retrieval_report": {
|
||||
"executed_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": "exact_path_fetch"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": 200
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"requests": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"ranking_profile": "code"
|
||||
}
|
||||
],
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C0_SOURCE_CHUNKS": 20
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": {
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "not_requested"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"requested_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 1,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 1
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {}
|
||||
},
|
||||
"rag_rows": [
|
||||
{
|
||||
"path": "src/plba/__init__.py",
|
||||
"content": "from plba.bootstrap import create_runtime\nfrom plba.config import ConfigFileLoader, FileConfigProvider\nfrom plba.control import ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel\nfrom plba.contracts import (\n ApplicationModule,\n ConfigProvider,\n HealthContributor,\n TraceContext,\n TraceContextRecord,\n TraceLogMessage,\n TraceTransport,\n Worker,\n WorkerHealth,\n WorkerStatus,\n)\nfrom plba.core import ConfigurationManager, RuntimeManager, ServiceContainer\nfrom plba.health import HealthRegistry\nfrom plba.logging import LogManager\nfrom plba.queue import InMemoryTaskQueue\nfrom plba.tracing import MySqlTraceTransport, NoOpTraceTransport, TraceService\nfrom plba.workflow import (\n StepResult,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowEngine,\n WorkflowEngineHooks,\n WorkflowNode,\n WorkflowRuntimeFactory,\n WorkflowStep,\n)\nfrom plba.workers import WorkerSupervisor\n\n__all__ = [\n \"ApplicationModule\",\n \"ConfigFileLoader\",\n \"ConfigProvider\",\n \"ConfigurationManager\",\n \"ControlActionSet\",\n \"ControlChannel\",\n \"ControlPlaneService\",\n \"create_runtime\",\n \"FileConfigProvider\",\n \"HealthContributor\",\n \"HealthRegistry\",\n \"HttpControlChannel\",\n \"InMemoryTaskQueue\",\n \"LogManager\",\n \"MySqlTraceTransport\",\n \"NoOpTraceTransport\",\n \"RuntimeManager\",\n \"ServiceContainer\",\n \"TraceContext\",\n \"TraceContextRecord\",\n \"TraceLogMessage\",\n \"TraceService\",\n \"TraceTransport\",\n \"StepResult\",\n \"Worker\",\n \"WorkerHealth\",\n \"WorkerStatus\",\n \"WorkflowContext\",\n \"WorkflowDefinition\",\n \"WorkflowEngine\",\n \"WorkflowEngineHooks\",\n \"WorkflowNode\",\n \"WorkflowRuntimeFactory\",\n \"WorkflowStep\",\n \"WorkerSupervisor\",\n]",
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"title": "src/plba/__init__.py:1-69",
|
||||
"span_start": 1,
|
||||
"span_end": 69,
|
||||
"lexical_rank": 0,
|
||||
"prefer_bonus": 0,
|
||||
"test_penalty": 0,
|
||||
"structural_rank": 0,
|
||||
"layer_rank": 0,
|
||||
"distance": 0,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "window",
|
||||
"module_or_unit": "src.plba.__init__",
|
||||
"is_test": false,
|
||||
"blob_sha": "24e755ec8c249d14fb0e675b5dbf2b71ab91afb9c849897eebfa9feb2499e19d",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"validation": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
# plba-v2-open-file-public-api
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: False
|
||||
|
||||
## Query
|
||||
Открой файл src/plba/__init__.py
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 1,
|
||||
"llm_answer": "Путь к файлу: src/plba/__init__.py\n\nВ этом файле находятся импортированные модули и классы из различных подпакетов библиотеки plba. Файл служит точкой входа для пользователей, предоставляя доступ к основным функциям и классам библиотеки. В частности, здесь импортируются:\n\n- Функции и классы для создания runtime (create_runtime)\n- Конфигурационные файлы и провайдеры (ConfigFileLoader, FileConfigProvider)\n- Контрольные каналы и службы (ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel)\n- Определения контрактов (ApplicationModule, ConfigProvider, HealthContributor и др.)\n- Менеджеры конфигурации и выполнения (ConfigurationManager, RuntimeManager, ServiceContainer)\n- Службы мониторинга здоровья (HealthRegistry)\n- Управление логированием (LogManager)\n- Очереди задач (InMemoryTaskQueue)\n- Транспортировка трассировки (MySqlTraceTransport, NoOpTraceTransport, TraceService)\n- Определение рабочих потоков и контекстов (StepResult, WorkflowContext, WorkflowDefinition, Workf)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- llm: expected answer to exclude 'из различных подпакетов'
|
||||
@@ -1,30 +0,0 @@
|
||||
# plba-v2-open-file-runtime
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Открой файл src/app_runtime/core/runtime.py
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 1,
|
||||
"llm_answer": "Путь: src/app_runtime/core/runtime.py\n\nВ этом файле содержится определение класса `RuntimeManager`. В примере приведено начало класса с инициализатором (`__init__`) и некоторыми атрибутами и параметрами, такими как `ACTION_TIMEOUT_SECONDS`, `ACTION_POLL_INTERVAL_SECONDS`, а также параметрами конфигурации и сервисов, которые могут передаваться при создании экземпляра класса.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,35 +0,0 @@
|
||||
# plba-v2-trace-flow-health-endpoint
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Покажи как проходит запрос /health в HttpControlAppFactory
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 37,
|
||||
"llm_answer": "1. HttpControlAppFactory.create(health_provider, action_provider)\n - Создает экземпляр FastAPI приложения.\n - Добавляет middleware для логирования времени ответа.\n - Определяет маршрут `/health`.\n \n2. HttpControlAppFactory.create().get(\"/health\")\n - Вызывает health_provider, чтобы получить состояние здоровья.\n - Устанавливает статус-код ответа:\n - 200, если состояние \"ok\".\n - 503, если состояние отличное от \"ok\".\n - Возвращает JSON с состоянием здоровья.\n\nЦепочка неполная, так как отсутствует детальная информация о вызове health_provider и его реализации.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"health",
|
||||
"HttpControlAppFactory"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,34 +0,0 @@
|
||||
# plba-v2-trace-flow-runtime-start
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Покажи поток выполнения при запуске RuntimeManager
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 37,
|
||||
"llm_answer": "1. Запускается `RuntimeManager` через инициализацию переменной `RuntimeManager`.\n2. Инициализация `RuntimeManager` вызывает метод `RuntimeManager.__init__`.\n3. В методе `RuntimeManager.__init__` происходит регистрация основных сервисов с помощью метода `_register_core_services`.\n4. Метод `_register_core_services` вызывает регистрацию базовых сервисов, таких как конфигурация (`configuration`), сервисы (`services`) и другие компоненты системы.\n5. Далее выполняется метод `start`, который инициирует запуск различных каналов управления и контрольных служб.\n6. Вызывается метод `ControlPlaneService.start`, передавая экземпляр `RuntimeManager`.\n7. Внутри `ControlPlaneService.start` регистрируется канал управления и запускается асинхронный процесс старта с использованием `asyncio.run`.\n8. Контрольный канал (`ControlChannel`) начинает свою работу путем вызова метода `start` и регистрации действий (`ControlActionSet`).\n9. Затем управление передается в HTTP-контроллер, где создается экземпляр `HttpControlChannel`, запускающий веб-сервер с помощью библиотеки Uvicorn.\n10. Веб-сервер принимает запросы на стандартные действия, такие как проверка состояния здоровья (`health`), выполнение стартовых и остановочных операций, получение статусов активности.\n\nЦепочка неполная, так как отсутствует детальная информация о внутренних взаимодействиях между сервисами и модулями после запуска основного канала управления.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,86 +0,0 @@
|
||||
# pipeline_setup_v3 summary
|
||||
|
||||
Passed: 14/18
|
||||
|
||||
| File | Case | Mode | Query | Actual sub-intent | RAG layers | Pass |
|
||||
|------|------|------|-------|-------------------|------------|------|
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-architecture-control-plane | full_chain | Какие компоненты участвуют в ControlPlaneService? | ARCHITECTURE | C0_SOURCE_CHUNKS:4, C1_SYMBOL_CATALOG:6, C2_DEPENDENCY_GRAPH:8, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:12 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-architecture-runtime-manager | full_chain | Какие компоненты участвуют в RuntimeManager? | ARCHITECTURE | C0_SOURCE_CHUNKS:4, C1_SYMBOL_CATALOG:6, C2_DEPENDENCY_GRAPH:8, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:12 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-create-runtime | full_chain | Что делает функция create_runtime? | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-local-http-channel | full_chain | Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так? | EXPLAIN_LOCAL | C0_SOURCE_CHUNKS:1, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:4 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-nonexistent-symbol | full_chain | Объясни класс RuntimeFactoryManager | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✗ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-runtime-manager | full_chain | Объясни как работает класс RuntimeManager | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-trace-service | full_chain | Объясни как работает класс TraceService | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-entrypoints-control-plane | full_chain | Найди точки входа HTTP control plane | FIND_ENTRYPOINTS | C0_SOURCE_CHUNKS:6, C3_ENTRYPOINTS:3 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-entrypoints-health-endpoint | full_chain | Где health endpoint? | FIND_ENTRYPOINTS | C0_SOURCE_CHUNKS:6, C3_ENTRYPOINTS:3 | ✗ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-tests-create-runtime | full_chain | Где тесты для create_runtime? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-tests-runtime-manager | full_chain | Где тесты для RuntimeManager? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-tests-trace-service | full_chain | Где тесты для TraceService? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-tests-workflow-runtime-factory-negative | full_chain | Где тесты для WorkflowRuntimeFactory? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-open-file-nonexistent | full_chain | Открой файл src/app_runtime/core/missing_runtime.py | OPEN_FILE | — | ✗ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-open-file-public-api | full_chain | Открой файл src/plba/__init__.py | OPEN_FILE | C0_SOURCE_CHUNKS:1 | ✗ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-open-file-runtime | full_chain | Открой файл src/app_runtime/core/runtime.py | OPEN_FILE | C0_SOURCE_CHUNKS:1 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-trace-flow-health-endpoint | full_chain | Покажи как проходит запрос /health в HttpControlAppFactory | TRACE_FLOW | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:10, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-trace-flow-runtime-start | full_chain | Покажи поток выполнения при запуске RuntimeManager | TRACE_FLOW | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:10, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
|
||||
## Failures
|
||||
- **plba-v2-explain-nonexistent-symbol**: answer_mode: expected degraded, got answered; retrieval: expected empty rag, got 33 rows; llm: expected answer to contain 'не найдена'
|
||||
- **plba-v2-find-entrypoints-health-endpoint**: llm: expected answer to contain 'GET /health'
|
||||
- **plba-v2-open-file-nonexistent**: answer_mode: expected degraded, got not_found; llm: expected answer to contain 'Файл src/app_runtime/core/missing_runtime.py не найден.'
|
||||
- **plba-v2-open-file-public-api**: llm: expected answer to exclude 'из различных подпакетов'
|
||||
|
||||
## LLM Answers
|
||||
- **plba-v2-architecture-control-plane**
|
||||
Query: Какие компоненты участвуют в ControlPlaneService?
|
||||
> Подтвержденные связи и роли компонентов в контексте ControlPlaneService: \#\#\# Компоненты и их роли 1. \*\*ControlPlaneService\*\* \- Роль: pipeline\_stage \- Описание: Инициализирует каналы управления и управляет ими. 2. \*\*ControlChannel\*\* \- Роль: model \- Описание: Абстрактный класс для каналов управления с методами старта и остановки. 3. \*\*ControlActionSet\*\* \- Роль: model \- Описание: Представляет набор действий контроля. 4. \*\*UvicornThreadRunner\*\* \- Роль: pipeline\_stage \- Описание: Управляет uvicorn сервером и участвует в потоках данных. 5. \*\*HttpControlChannel\*\* \- Роль: pipeline\_stage \- Описание: Канал управления HTTP\-соединениями, участвующий в потоках данных. 6. \*\*HttpControlAppFactory\*\* \- Роль: factory \- Описание: Фабрика для создания fastAPI приложений. 7. \*\*WorkflowPersistence\*\* \- Роль: pipeline\_stage \- Описание: Хранит информацию о процессах и взаимодействует с ними.…
|
||||
- **plba-v2-architecture-runtime-manager**
|
||||
Query: Какие компоненты участвуют в RuntimeManager?
|
||||
> \#\#\# Компоненты, участвующие в RuntimeManager \#\#\#\# Подтвержденные связи 1. \*\*RuntimeManager\*\* \- Role: Pipeline Stage \- Responsibilities: \- Manager responsibilities \- Orchestration of role\-like calls \- State attribute reading/writing \- Participation in dataflow slices 2. \*\*ControlPlaneService\*\* \- Role: Pipeline Stage \- Responsibilities: \- Service responsibilities \- State attribute reading/writing \- Participation in dataflow slices 3. \*\*UvicornThreadRunner\*\* \- Role: Pipeline Stage \- Responsibilities: \- State attribute reading/writing \- Participation in dataflow slices 4. \*\*HttpControlChannel\*\* \- Role: Pipeline Stage \- Responsibilities: \- State attribute reading/writing \- Participation in dataflow slices 5. \*\*WorkflowPersistence\*\* \- Role: Pipeline Stage \- Responsibilities: \- Orchestration of role\-like calls \- State attribute reading/writing \- Participation in dataflow sl…
|
||||
- **plba-v2-explain-create-runtime**
|
||||
Query: Что делает функция create_runtime?
|
||||
> Функция \`create\_runtime\` инициализирует и настраивает менеджер выполнения приложения. \*\*Ключевые шаги:\*\* 1. Инициализация менеджера выполнения \(\`RuntimeManager\(\)\`\). 2. Добавление конфигурационного файла, если указан путь \(\`add\_config\_file\`\). 3. Регистрация HTTP\-канала управления, если включен режим управления \(\`register\_channel\`\). 4. Регистрация модуля приложения в менеджере выполнения \(\`register\_module\`\). \*\*Опорные файлы:\*\* \- \`src/plba/bootstrap.py:8\-29\` Этот процесс позволяет настроить и запустить приложение с учетом заданных конфигураций и режимов управления.
|
||||
- **plba-v2-explain-local-http-channel**
|
||||
Query: Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?
|
||||
> Класс \`HttpControlChannel\` предназначен для управления HTTP каналом контроля в приложении. \*\*Ключевые шаги его реализации:\*\* 1. Инициализация \(\`\_\_init\_\_\`\) – принимает параметры хоста, порта и тайм\-аута, создаёт внутренние объекты управления и инициализирует состояние канала. 2. Запуск \(\`start\`\) – запускает сервер с заданными действиями контроля, создавая приложение и вызывая runner для запуска сервера. 3. Остановка \(\`stop\`\) – останавливает запущенный сервер. 4. Свойство \`port\` – возвращает порт, используемый сервером. 5. Метод \`\_health\_response\` – генерирует ответ о состоянии здоровья системы \(здоров или нет\). Опорные файлы: \- \`src/app\_runtime/control/http\_channel.py:12\-57\` \(определение класса и методов\) \- \`src/app\_runtime/control/http\_channel.py:13\-17\` \(инициализация\) \- \`src/app\_runtime/control/http\_channel.py:19\-22\` \(запуск\)
|
||||
- **plba-v2-explain-nonexistent-symbol**
|
||||
Query: Объясни класс RuntimeFactoryManager
|
||||
> Класс \`RuntimeFactoryManager\` не указан напрямую в предоставленном коде. Однако, судя по контексту и взаимосвязям между классами: \*\*Назначение класса:\*\* \- Управление фабрикой для создания экземпляров классов, связанных с управлением рабочим состоянием приложения. \*\*Ключевые шаги:\*\* 1. Инициализация фабрики. 2. Создание экземпляра соответствующего класса управления каналом \(\`ControlChannel\`\) или другого необходимого класса. 3. Регистрация созданных каналов в сервисе управления каналами. \*\*Опорные файлы:\*\* \- \`src/app\_runtime/control/base.py\`: Объявление абстрактного базового класса \`ControlChannel\`. \- \`src/app\_runtime/control/service.py\`: Реализация сервиса управления каналами, который регистрирует созданные каналы. \- \`src/app\_runtime/control/http\_channel.py\`: Определение канала HTTP, используемого для взаимодействия через HTTP\-протокол. Обратите внимание, что прямое о…
|
||||
- **plba-v2-explain-runtime-manager**
|
||||
Query: Объясни как работает класс RuntimeManager
|
||||
> \*\*Класс \`RuntimeManager\`\*\* отвечает за управление жизненным циклом приложения и координацию различных компонентов системы. \#\#\# Ключевые шаги работы класса: 1. \*\*Инициализация конфигурации:\*\* Класс инициализирует начальные настройки приложения, включая загрузку конфигурационных файлов. 2. \*\*Регистрация каналов управления:\*\* Метод \`register\_channel\` позволяет зарегистрировать каналы управления, которые будут использоваться для взаимодействия с различными компонентами системы. 3. \*\*Запуск и остановка системы:\*\* Методы \`start\` и \`stop\` инициируют запуск и остановку всех зарегистрированных каналов управления, обеспечивая корректное завершение работы системы. 4. \*\*Сохранение состояния:\*\* Метод \`snapshot\` создает снимок текущего состояния системы, который может быть использован для восстановления или анализа состояния в будущем. \#\#\# Опорные файлы: \- \`src/app\_runtime/core/ru…
|
||||
- **plba-v2-explain-trace-service**
|
||||
Query: Объясни как работает класс TraceService
|
||||
> \*\*Класс \`TraceService\`\*\* предназначен для управления контекстом трассировки в приложении. Его основные функции включают создание нового контекста трассировки, получение текущего идентификатора трассировки и закрытие контекста. \*\*Ключевые шаги работы класса:\*\* 1. \*\*Инициализация:\*\* При создании экземпляра \`TraceService\` задаются транспорт и хранилище контекста трассировки \(по умолчанию используются заглушки\). 2. \*\*Создание контекста:\*\* Метод \`create\_context\` создает новый контекст трассировки с заданными параметрами \(идентификатор, родительский идентификатор, тип и атрибуты\). Контекст сохраняется в хранилище. 3. \*\*Получение текущего идентификатора:\*\* Метод \`current\_trace\_id\` возвращает текущий идентификатор трассировки. 4. \*\*Открытие контекста:\*\* Метод \`open\_context\` открывает новый контекст трассировки. 5. \*\*Закрытие контекста:\*\* Метод \`close\_context\` завершает текущ…
|
||||
- **plba-v2-find-entrypoints-control-plane**
|
||||
Query: Найди точки входа HTTP control plane
|
||||
> confirmed\_entrypoints: \- src/app\_runtime/control/http\_app.py:app.post \(line range: 38\-42\) \- src/app\_runtime/control/http\_app.py:app.get \(line range: 31\-34\) \- src/app\_runtime/control/http\_app.py:app.get \(line range: 38\-42\)
|
||||
- **plba-v2-find-entrypoints-health-endpoint**
|
||||
Query: Где health endpoint?
|
||||
> health endpoint: \- src/app\_runtime/control/http\_app.py:38\-42 \(app.post\) \- src/app\_runtime/control/http\_app.py:31\-34 \(app.get\)
|
||||
- **plba-v2-find-tests-create-runtime**
|
||||
Query: Где тесты для create_runtime?
|
||||
> \- tests/test\_runtime.py:342\-405 \(test\_public\_plba\_package\_exports\_runtime\_builder\_and\_worker\_contract\)
|
||||
- **plba-v2-find-tests-runtime-manager**
|
||||
Query: Где тесты для RuntimeManager?
|
||||
> \- tests/test\_runtime.py:12\-12 \- tests/test\_business\_control\_actions.py:14\-14
|
||||
- **plba-v2-find-tests-trace-service**
|
||||
Query: Где тесты для TraceService?
|
||||
> tests/test\_runtime.py:test\_trace\_service\_allows\_messages\_without\_status tests/test\_runtime.py:test\_trace\_service\_writes\_contexts\_and\_messages tests/test\_runtime.py:test\_trace\_service\_supports\_debug\_warning\_and\_error\_levels
|
||||
- **plba-v2-find-tests-workflow-runtime-factory-negative**
|
||||
Query: Где тесты для WorkflowRuntimeFactory?
|
||||
> Insufficient evidence for a confident answer. No test candidates found.
|
||||
- **plba-v2-open-file-nonexistent**
|
||||
Query: Открой файл src/app_runtime/core/missing_runtime.py
|
||||
> Файл \`src/app\_runtime/core/missing\_runtime.py\` не найден.
|
||||
- **plba-v2-open-file-public-api**
|
||||
Query: Открой файл src/plba/__init__.py
|
||||
> Путь к файлу: src/plba/\_\_init\_\_.py В этом файле находятся импортированные модули и классы из различных подпакетов библиотеки plba. Файл служит точкой входа для пользователей, предоставляя доступ к основным функциям и классам библиотеки. В частности, здесь импортируются: \- Функции и классы для создания runtime \(create\_runtime\) \- Конфигурационные файлы и провайдеры \(ConfigFileLoader, FileConfigProvider\) \- Контрольные каналы и службы \(ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel\) \- Определения контрактов \(ApplicationModule, ConfigProvider, HealthContributor и др.\) \- Менеджеры конфигурации и выполнения \(ConfigurationManager, RuntimeManager, ServiceContainer\) \- Службы мониторинга здоровья \(HealthRegistry\) \- Управление логированием \(LogManager\) \- Очереди задач \(InMemoryTaskQueue\) \- Транспортировка трассировки \(MySqlTraceTransport, NoOpTraceTran…
|
||||
- **plba-v2-open-file-runtime**
|
||||
Query: Открой файл src/app_runtime/core/runtime.py
|
||||
> Путь: src/app\_runtime/core/runtime.py В этом файле содержится определение класса \`RuntimeManager\`. В примере приведено начало класса с инициализатором \(\`\_\_init\_\_\`\) и некоторыми атрибутами и параметрами, такими как \`ACTION\_TIMEOUT\_SECONDS\`, \`ACTION\_POLL\_INTERVAL\_SECONDS\`, а также параметрами конфигурации и сервисов, которые могут передаваться при создании экземпляра класса.
|
||||
- **plba-v2-trace-flow-health-endpoint**
|
||||
Query: Покажи как проходит запрос /health в HttpControlAppFactory
|
||||
> 1. HttpControlAppFactory.create\(health\_provider, action\_provider\) \- Создает экземпляр FastAPI приложения. \- Добавляет middleware для логирования времени ответа. \- Определяет маршрут \`/health\`. 2. HttpControlAppFactory.create\(\).get\("/health"\) \- Вызывает health\_provider, чтобы получить состояние здоровья. \- Устанавливает статус\-код ответа: \- 200, если состояние "ok". \- 503, если состояние отличное от "ok". \- Возвращает JSON с состоянием здоровья. Цепочка неполная, так как отсутствует детальная информация о вызове health\_provider и его реализации.
|
||||
- **plba-v2-trace-flow-runtime-start**
|
||||
Query: Покажи поток выполнения при запуске RuntimeManager
|
||||
> 1. Запускается \`RuntimeManager\` через инициализацию переменной \`RuntimeManager\`. 2. Инициализация \`RuntimeManager\` вызывает метод \`RuntimeManager.\_\_init\_\_\`. 3. В методе \`RuntimeManager.\_\_init\_\_\` происходит регистрация основных сервисов с помощью метода \`\_register\_core\_services\`. 4. Метод \`\_register\_core\_services\` вызывает регистрацию базовых сервисов, таких как конфигурация \(\`configuration\`\), сервисы \(\`services\`\) и другие компоненты системы. 5. Далее выполняется метод \`start\`, который инициирует запуск различных каналов управления и контрольных служб. 6. Вызывается метод \`ControlPlaneService.start\`, передавая экземпляр \`RuntimeManager\`. 7. Внутри \`ControlPlaneService.start\` регистрируется канал управления и запускается асинхронный процесс старта с использованием \`asyncio.run\`. 8. Контрольный канал \(\`ControlChannel\`\) начинает свою работу путем вызова метода \`start\` и…
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,34 +0,0 @@
|
||||
# plba-v2-architecture-control-plane
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Какие компоненты участвуют в ControlPlaneService?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "### Подтвержденные Связи\n\n1. **ControlPlaneService**:\n - Вызывает методы инициализации (`_channels`, `_start_async`, `register_channel`, `start`, `stop`, `_stop_async`) [evidence: 16-20].\n \n2. **ControlPlaneService** взаимодействует с другими компонентами через методы регистрации каналов и запуска:\n - Регистрация канала (`register_channel`) использует атрибут `_channels` для хранения списка зарегистрированных каналов [evidence: 22].\n - Запуск сервиса использует метод `start`, который также обращается к атрибуту `_channels` [evidence: 23].\n\n### Роли Компонентов\n\n1. **ControlPlaneService**:\n - Pipeline stage: отвечает за чтение и запись состояния атрибутов, участвует в данных срезах (dataflow slices).\n\n2. **ControlChannel**:\n - Model: выполняет функции модели управления каналами, включая запуск и остановку.\n\n3. **ControlActionSet**:\n - Default model role: обеспечивает стандартные действия для контроля.\n\n4. **UvicornThreadRunner**, **HttpControlChannel**, **HttpControlAppFactory**, **WorkflowPersistence**, **InMemoryTaskQueue**, **ConfigFileLoader**, **TraceContextStore**, **WorkerSupervisor**, **WorkflowEngine**:\n - Pipeline stages: отвечают за выполнение различных задач, связанных с обработкой данных и состоянием приложения.\n\n### Ограничения Контекста\n\nКонтекст ограничивается исключительно компонентами, связанными непосредственно с функциональностью ControlPlaneService и его методами. Другие компоненты и зависимости не рассматриваются в данном анализе.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"ControlPlaneService"
|
||||
],
|
||||
"layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,34 +0,0 @@
|
||||
# plba-v2-architecture-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Какие компоненты участвуют в RuntimeManager?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "ARCHITECTURE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "### Подтвержденные Связи\n\n1. **RuntimeManager**:\n - Является ключевым компонентом управления жизненным циклом приложения.\n - Инициализирует и управляет другими компонентами системы через метод `__init__`.\n \n2. **ControlPlaneService**:\n - Управляет каналами контроля.\n - Вызывается из метода инициализации `RuntimeManager` для регистрации каналов.\n\n3. **ControlChannel**:\n - Абстрактный класс для реализации конкретных каналов контроля.\n - Реализует методы `start` и `stop`, которые вызываются сервисами и менеджерами.\n\n4. **ConfigFileLoader**:\n - Загружает конфигурационные файлы и передает их в runtime-менеджер.\n\n5. **WorkflowPersistence**:\n - Обеспечивает сохранение информации о workflows.\n\n6. **InMemoryTaskQueue**:\n - Используется для хранения задач внутри памяти.\n\n7. **TraceContextStore**:\n - Хранит контекст трассировки.\n\n8. **WorkerSupervisor**:\n - Наблюдает за рабочими процессами и управляет ими.\n\n### Роли Компонентов\n\n1. **RuntimeManager**:\n - Координирует работу всех других компонентов.\n - Читает и записывает состояние атрибутов.\n - Участвует в управлении данными потока.\n\n2. **ControlPlaneService**:\n - Регистрирует каналы контроля.\n - Начинает и останавливает службы контроля.\n\n3. **ControlChannel**:\n - Осуществляет управление каналами взаимодействия между приложением и внешними системами.\n\n4. **ConfigFileLoader**:\n - Чтение конфигурации из файлов.\n\n5. **WorkflowPersistence**:\n - Сохраняет информацию о workflows.\n\n6. **InMemoryTaskQueue**:\n - Хранение данных задачи во временной памяти.\n\n7. **TraceContextStore**:\n - Управление контекстом трассировки.\n\n8. **WorkerSupervisor**:\n - Контроль рабочих процессов.\n\n### Ограничения Контекста\n\n1. **Dataflow Slices**:\n - Все перечисленные компоненты активно участвуют в обработке данных потоков.\n\n2. **State Attributes**:\n - Большинство компонентов читают или записывают состояние атрибутов системы.\n\nТаким образом, RuntimeManager является центральным управляющим элементом архитектуры, координирующим работу остальных компонентов.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C3_ENTRYPOINTS",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,34 +0,0 @@
|
||||
# plba-v2-explain-create-runtime
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Что делает функция create_runtime?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Функция `create_runtime` инициализирует и настраивает менеджер выполнения приложения.\n\n**Ключевые шаги:**\n1. Создает экземпляр менеджера выполнения (`RuntimeManager`).\n2. При наличии указанного пути к конфигурационному файлу добавляет его в менеджер.\n3. Если включена опция HTTP-контроля, регистрирует канал управления с указанными параметрами хоста, порта и тайм-аута.\n4. Регистрирует указанный модуль приложения в менеджере.\n5. Возвращает созданный менеджер выполнения.\n\n**Опорные файлы:**\n- `src/plba/bootstrap.py:8-29`",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"create_runtime"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,34 +0,0 @@
|
||||
# plba-v2-explain-local-http-channel
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN_LOCAL",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 13,
|
||||
"llm_answer": "Класс `HttpControlChannel` в файле `src/app_runtime/control/http_channel.py` реализует механизм управления HTTP-каналом для взаимодействия с внешними сервисами или компонентами.\n\n**Ключевые шаги его реализации:**\n1. Инициализация класса:\n - При создании экземпляра устанавливается таймаут (`_timeout`), запускается сервер через объект `UvicornThreadRunner`, создается фабрика приложений `HttpControlAppFactory`.\n \n2. Запуск канала:\n - Метод `start` инициализирует набор действий (`actions`) и создает приложение для работы с ними. Затем запускает сервер через ранее созданный объект `UvicornThreadRunner`.\n \n3. Остановка канала:\n - Метод `stop` останавливает запущенный сервер.\n\nОпорные файлы:\n- `src/app_runtime/control/http_channel.py`: определение и реализация класса `HttpControlChannel`.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/app_runtime/control/http_channel.py"
|
||||
],
|
||||
"symbol_candidates": [
|
||||
"HttpControlChannel"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C2_DEPENDENCY_GRAPH"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,36 +0,0 @@
|
||||
# plba-v2-explain-nonexistent-symbol
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: False
|
||||
|
||||
## Query
|
||||
Объясни класс RuntimeFactoryManager
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Класс `RuntimeFactoryManager` не найден в предоставленном коде или контекстной информации.\n\nКлючевые шаги и опорные файлы:\n1. Код и контекста относятся к управлению каналами управления («control channels») в приложении.\n2. Основные классы включают `ControlChannel`, `ControlActionSet`, и связанные с ними каналы и сервисы.\n3. Основной файл для рассмотрения — `base.py`.\n4. Ключевые обязанности и интерфейсы описаны через абстрактные методы (`start`, `stop`) в классе `ControlChannel`. \n\nПоскольку конкретный класс `RuntimeFactoryManager` отсутствует в данном контексте, невозможно предоставить его объяснение.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeFactoryManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- answer_mode: expected degraded, got answered
|
||||
- retrieval: expected empty rag, got 33 rows
|
||||
- llm: expected answer to contain 'не найдена'
|
||||
@@ -1,34 +0,0 @@
|
||||
# plba-v2-explain-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Объясни как работает класс RuntimeManager
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Класс `RuntimeManager` играет ключевую роль в управлении выполнением приложений и координации различных компонентов системы. Его основная функция заключается в оркестрации действий, связанных с жизненным циклом приложения, включая инициализацию, запуск и остановку сервисов и модулей.\n\n**Ключевые шаги работы класса:**\n1. Инициализация конфигурации и состояния (`__init__`).\n2. Добавление конфигурационных файлов и настроек (`add_config_file`).\n3. Управление состоянием выполнения через чтение и запись атрибутов состояния (`configuration`, `_state`).\n4. Оркестровка вызова методов запуска и остановки для различных компонентов (`start`, `stop`).\n5. Участие в обработке данных потока и управлении потоками задач (`participates in dataflow slices`).\n\n**Опорные файлы:**\n- `src/app_runtime/core/runtime.py:18-179`\n- `src/app_runtime/control/service.py:12-52`\n- `src/app_runtime/control/base.py:21-28`\n- `src/app_runtime/control/base.py:14-18`",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because one or more lines are too long
@@ -1,34 +0,0 @@
|
||||
# plba-v2-explain-trace-service
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Объясни как работает класс TraceService
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "EXPLAIN",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 33,
|
||||
"llm_answer": "Класс `TraceService` является основным компонентом системы отслеживания трассировок в приложении. Его основная функция заключается в управлении контекстом трассировки и записи событий в журнал.\n\n**Ключевые шаги работы класса:**\n1. Инициализация с передачей транспорта (`transport`) и хранилища контекста (`store`), которые могут быть опциональными.\n2. Создание нового контекста трассировки через метод `create_context`, который генерирует уникальный идентификатор трассы и сохраняет запись о контексте в хранилище.\n3. Управление текущим контекстом трассировки через методы:\n - `current_trace_id`: возвращает текущий идентификатор трассировки.\n - `open_context`: открывает новый контекст трассировки.\n - `close_context`: закрывает текущий контекст трассировки.\n \n**Опорные файлы:**\n- `src/app_runtime/tracing/service.py:39-166`\n- `src/app_runtime/tracing/service.py:66-78`\n- `src/app_runtime/tracing/service.py:45-63`",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"TraceService"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,33 +0,0 @@
|
||||
# plba-v2-find-entrypoints-control-plane
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Найди точки входа HTTP control plane
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 9,
|
||||
"llm_answer": "Confirmed Entrypoints:\n1. src/app_runtime/control/http_app.py:app.post (lines 38-42)\n2. src/app_runtime/control/http_app.py:app.get (lines 31-34)\n3. src/app_runtime/control/http_app.py:app.get (lines 38-42)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"HTTP",
|
||||
"control",
|
||||
"plane"
|
||||
],
|
||||
"layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-entrypoints-health-endpoint
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: False
|
||||
|
||||
## Query
|
||||
Где health endpoint?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_ENTRYPOINTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 9,
|
||||
"llm_answer": "health endpoint: \n- src/app_runtime/control/http_app.py:38-42 (app.post)\n- src/app_runtime/control/http_app.py:31-34 (app.get)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"health",
|
||||
"endpoint"
|
||||
],
|
||||
"layers": [
|
||||
"C3_ENTRYPOINTS",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- llm: expected answer to contain 'GET /health'
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-tests-create-runtime
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для create_runtime?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "- tests/test_runtime.py:342-405",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"create_runtime"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-tests-runtime-manager
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для RuntimeManager?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "- tests/test_runtime.py:12-12\n- tests/test_business_control_actions.py:14-14",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because one or more lines are too long
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-tests-trace-service
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для TraceService?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "- tests/test_runtime.py:test_trace_service_allows_messages_without_status (line range: 279-293)\n- tests/test_runtime.py:test_trace_service_writes_contexts_and_messages (line range: 246-259)\n- tests/test_runtime.py:test_trace_service_supports_debug_warning_and_error_levels (line range: 262-276)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"TraceService"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,32 +0,0 @@
|
||||
# plba-v2-find-tests-workflow-runtime-factory-negative
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Где тесты для WorkflowRuntimeFactory?
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "FIND_TESTS",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 24,
|
||||
"llm_answer": "Insufficient evidence for a confident answer. No test candidates found.",
|
||||
"answer_mode": "degraded",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"WorkflowRuntimeFactory"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,341 +0,0 @@
|
||||
{
|
||||
"case_id": "plba-v2-open-file-nonexistent",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"actual": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 0,
|
||||
"llm_answer": "Файл `src/app_runtime/core/missing_runtime.py` не найден.",
|
||||
"answer_mode": "not_found",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"passed": false,
|
||||
"mismatches": [
|
||||
"answer_mode: expected degraded, got not_found",
|
||||
"llm: expected answer to contain 'Файл src/app_runtime/core/missing_runtime.py не найден.'"
|
||||
],
|
||||
"details": {
|
||||
"query": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"router_result": {
|
||||
"schema_version": "1.1",
|
||||
"intent": "CODE_QA",
|
||||
"retrieval_profile": "code",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"query_plan": {
|
||||
"raw": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"normalized": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"negations": [],
|
||||
"expansions": [
|
||||
"file"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"path_hints": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"doc_scope_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"symbol_kind_hint": "unknown",
|
||||
"anchors": [
|
||||
{
|
||||
"type": "FILE_PATH",
|
||||
"value": "src/app_runtime/core/missing_runtime.py",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 12,
|
||||
"end": 51
|
||||
},
|
||||
"confidence": 0.95
|
||||
},
|
||||
{
|
||||
"type": "KEY_TERM",
|
||||
"value": "файл",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 7,
|
||||
"end": 11
|
||||
},
|
||||
"confidence": 0.9
|
||||
}
|
||||
]
|
||||
},
|
||||
"retrieval_spec": {
|
||||
"domains": [
|
||||
"CODE"
|
||||
],
|
||||
"layer_queries": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"top_k": 12
|
||||
}
|
||||
],
|
||||
"filters": {
|
||||
"test_policy": "EXCLUDE",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"language": [
|
||||
"python"
|
||||
]
|
||||
},
|
||||
"rerank_profile": "code"
|
||||
},
|
||||
"retrieval_constraints": {
|
||||
"include_globs": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"exclude_globs": [
|
||||
"tests/**",
|
||||
"**/test_*.py",
|
||||
"**/*_test.py"
|
||||
],
|
||||
"prefer_globs": [],
|
||||
"test_file_globs": [],
|
||||
"test_symbol_patterns": [],
|
||||
"max_candidates": 20,
|
||||
"fuzzy_symbol_search": {
|
||||
"enabled": false,
|
||||
"max_distance": 2,
|
||||
"top_k": 5
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "not_requested",
|
||||
"resolved_symbol": null,
|
||||
"alternatives": [],
|
||||
"confidence": 0.0
|
||||
},
|
||||
"evidence_policy": {
|
||||
"require_def": false,
|
||||
"require_flow": false,
|
||||
"require_spec": false,
|
||||
"allow_answer_without_evidence": false
|
||||
}
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"requested_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_spec": {
|
||||
"domains": [
|
||||
"CODE"
|
||||
],
|
||||
"layer_queries": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"top_k": 12
|
||||
}
|
||||
],
|
||||
"filters": {
|
||||
"test_policy": "EXCLUDE",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"language": [
|
||||
"python"
|
||||
]
|
||||
},
|
||||
"rerank_profile": "code"
|
||||
},
|
||||
"retrieval_constraints": {
|
||||
"include_globs": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"exclude_globs": [
|
||||
"tests/**",
|
||||
"**/test_*.py",
|
||||
"**/*_test.py"
|
||||
],
|
||||
"prefer_globs": [],
|
||||
"test_file_globs": [],
|
||||
"test_symbol_patterns": [],
|
||||
"max_candidates": 20,
|
||||
"fuzzy_symbol_search": {
|
||||
"enabled": false,
|
||||
"max_distance": 2,
|
||||
"top_k": 5
|
||||
}
|
||||
},
|
||||
"query_plan": {
|
||||
"raw": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"normalized": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"negations": [],
|
||||
"expansions": [
|
||||
"file"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"path_hints": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"doc_scope_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"symbol_kind_hint": "unknown",
|
||||
"anchors": [
|
||||
{
|
||||
"type": "FILE_PATH",
|
||||
"value": "src/app_runtime/core/missing_runtime.py",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 12,
|
||||
"end": 51
|
||||
},
|
||||
"confidence": 0.95
|
||||
},
|
||||
{
|
||||
"type": "KEY_TERM",
|
||||
"value": "файл",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 7,
|
||||
"end": 11
|
||||
},
|
||||
"confidence": 0.9
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"retrieval_result": {
|
||||
"target_symbol_candidates": [],
|
||||
"resolved_symbol": null,
|
||||
"symbol_resolution_status": "not_requested",
|
||||
"file_candidates": [],
|
||||
"code_chunks": [],
|
||||
"relations": [],
|
||||
"entrypoints": [],
|
||||
"test_candidates": [],
|
||||
"layer_outcomes": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 0,
|
||||
"empty": true,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"missing_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"raw_rows": [],
|
||||
"retrieval_report": {
|
||||
"executed_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": "exact_path_fetch"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": 200
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"requests": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"query": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"ranking_profile": "code"
|
||||
}
|
||||
],
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C0_SOURCE_CHUNKS": 18
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": {
|
||||
"intent_correct": null,
|
||||
"target_found": false,
|
||||
"layers_used": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_sufficient": false,
|
||||
"answer_mode": "insufficient",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "not_requested"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Открой файл src/app_runtime/core/missing_runtime.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"requested_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 0,
|
||||
"empty": true,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": false,
|
||||
"failure_reasons": [
|
||||
"path_scope_empty",
|
||||
"layer_c0_empty"
|
||||
],
|
||||
"evidence_count": 0
|
||||
},
|
||||
"failure_reasons": [
|
||||
"path_scope_empty",
|
||||
"layer_c0_empty"
|
||||
],
|
||||
"timings_ms": {}
|
||||
},
|
||||
"rag_rows": [],
|
||||
"validation": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
# plba-v2-open-file-nonexistent
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: False
|
||||
|
||||
## Query
|
||||
Открой файл src/app_runtime/core/missing_runtime.py
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 0,
|
||||
"llm_answer": "Файл `src/app_runtime/core/missing_runtime.py` не найден.",
|
||||
"answer_mode": "not_found",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/missing_runtime.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- answer_mode: expected degraded, got not_found
|
||||
- llm: expected answer to contain 'Файл src/app_runtime/core/missing_runtime.py не найден.'
|
||||
@@ -1,417 +0,0 @@
|
||||
{
|
||||
"case_id": "plba-v2-open-file-public-api",
|
||||
"source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml",
|
||||
"runner": "agent_runtime",
|
||||
"mode": "full_chain",
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"actual": {
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 1,
|
||||
"llm_answer": "Путь к файлу: src/plba/__init__.py\n\nВ этом файле находятся импорт различных модулей и классов из пакета plba. В частности, здесь можно найти:\n- Импорты для создания runtime с помощью `create_runtime`\n- Классы и интерфейсы конфигурации (`ConfigFileLoader`, `FileConfigProvider`)\n- Контроллеры и каналы управления (`ControlActionSet`, `ControlChannel`, `HttpControlChannel`)\n- Определения контрактов (`ApplicationModule`, `Worker`, etc.)\n- Менеджеры конфигурации и выполнения (`ConfigurationManager`, `RuntimeManager`, `ServiceContainer`)\n- Регистраторы здоровья и службы логирования\n- Обработчики очередей задач и транспортные средства трассировки (`InMemoryTaskQueue`, `MySqlTraceTransport`, `NoOpTraceTransport`)\n- Определение рабочего потока и контекста (`StepResult`, `WorkflowContext`, `WorkflowDefinition`)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"passed": true,
|
||||
"mismatches": [],
|
||||
"details": {
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"router_result": {
|
||||
"schema_version": "1.1",
|
||||
"intent": "CODE_QA",
|
||||
"retrieval_profile": "code",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"query_plan": {
|
||||
"raw": "Открой файл src/plba/__init__.py",
|
||||
"normalized": "Открой файл src/plba/__init__.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"negations": [],
|
||||
"expansions": [
|
||||
"file"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"path_hints": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"doc_scope_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"symbol_kind_hint": "unknown",
|
||||
"anchors": [
|
||||
{
|
||||
"type": "FILE_PATH",
|
||||
"value": "src/plba/__init__.py",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 12,
|
||||
"end": 32
|
||||
},
|
||||
"confidence": 0.95
|
||||
},
|
||||
{
|
||||
"type": "KEY_TERM",
|
||||
"value": "файл",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 7,
|
||||
"end": 11
|
||||
},
|
||||
"confidence": 0.9
|
||||
}
|
||||
]
|
||||
},
|
||||
"retrieval_spec": {
|
||||
"domains": [
|
||||
"CODE"
|
||||
],
|
||||
"layer_queries": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"top_k": 12
|
||||
}
|
||||
],
|
||||
"filters": {
|
||||
"test_policy": "EXCLUDE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"language": [
|
||||
"python"
|
||||
]
|
||||
},
|
||||
"rerank_profile": "code"
|
||||
},
|
||||
"retrieval_constraints": {
|
||||
"include_globs": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"exclude_globs": [
|
||||
"tests/**",
|
||||
"**/test_*.py",
|
||||
"**/*_test.py"
|
||||
],
|
||||
"prefer_globs": [],
|
||||
"test_file_globs": [],
|
||||
"test_symbol_patterns": [],
|
||||
"max_candidates": 20,
|
||||
"fuzzy_symbol_search": {
|
||||
"enabled": false,
|
||||
"max_distance": 2,
|
||||
"top_k": 5
|
||||
}
|
||||
},
|
||||
"symbol_resolution": {
|
||||
"status": "not_requested",
|
||||
"resolved_symbol": null,
|
||||
"alternatives": [],
|
||||
"confidence": 0.0
|
||||
},
|
||||
"evidence_policy": {
|
||||
"require_def": false,
|
||||
"require_flow": false,
|
||||
"require_spec": false,
|
||||
"allow_answer_without_evidence": false
|
||||
}
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"requested_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_spec": {
|
||||
"domains": [
|
||||
"CODE"
|
||||
],
|
||||
"layer_queries": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"top_k": 12
|
||||
}
|
||||
],
|
||||
"filters": {
|
||||
"test_policy": "EXCLUDE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"language": [
|
||||
"python"
|
||||
]
|
||||
},
|
||||
"rerank_profile": "code"
|
||||
},
|
||||
"retrieval_constraints": {
|
||||
"include_globs": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"exclude_globs": [
|
||||
"tests/**",
|
||||
"**/test_*.py",
|
||||
"**/*_test.py"
|
||||
],
|
||||
"prefer_globs": [],
|
||||
"test_file_globs": [],
|
||||
"test_symbol_patterns": [],
|
||||
"max_candidates": 20,
|
||||
"fuzzy_symbol_search": {
|
||||
"enabled": false,
|
||||
"max_distance": 2,
|
||||
"top_k": 5
|
||||
}
|
||||
},
|
||||
"query_plan": {
|
||||
"raw": "Открой файл src/plba/__init__.py",
|
||||
"normalized": "Открой файл src/plba/__init__.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"negations": [],
|
||||
"expansions": [
|
||||
"file"
|
||||
],
|
||||
"keyword_hints": [],
|
||||
"path_hints": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"doc_scope_hints": [],
|
||||
"symbol_candidates": [],
|
||||
"symbol_kind_hint": "unknown",
|
||||
"anchors": [
|
||||
{
|
||||
"type": "FILE_PATH",
|
||||
"value": "src/plba/__init__.py",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 12,
|
||||
"end": 32
|
||||
},
|
||||
"confidence": 0.95
|
||||
},
|
||||
{
|
||||
"type": "KEY_TERM",
|
||||
"value": "файл",
|
||||
"source": "user_text",
|
||||
"subtype": null,
|
||||
"span": {
|
||||
"start": 7,
|
||||
"end": 11
|
||||
},
|
||||
"confidence": 0.9
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"retrieval_result": {
|
||||
"target_symbol_candidates": [],
|
||||
"resolved_symbol": null,
|
||||
"symbol_resolution_status": "not_requested",
|
||||
"file_candidates": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"code_chunks": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"path": "src/plba/__init__.py",
|
||||
"title": "src/plba/__init__.py:1-69",
|
||||
"content": "from plba.bootstrap import create_runtime\nfrom plba.config import ConfigFileLoader, FileConfigProvider\nfrom plba.control import ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel\nfrom plba.contracts import (\n ApplicationModule,\n ConfigProvider,\n HealthContributor,\n TraceContext,\n TraceContextRecord,\n TraceLogMessage,\n TraceTransport,\n Worker,\n WorkerHealth,\n WorkerStatus,\n)\nfrom plba.core import ConfigurationManager, RuntimeManager, ServiceContainer\nfrom plba.health import HealthRegistry\nfrom plba.logging import LogManager\nfrom plba.queue import InMemoryTaskQueue\nfrom plba.tracing import MySqlTraceTransport, NoOpTraceTransport, TraceService\nfrom plba.workflow import (\n StepResult,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowEngine,\n WorkflowEngineHooks,\n WorkflowNode,\n WorkflowRuntimeFactory,\n WorkflowStep,\n)\nfrom plba.workers import WorkerSupervisor\n\n__all__ = [\n \"ApplicationModule\",\n \"ConfigFileLoader\",\n \"ConfigProvider\",\n \"ConfigurationManager\",\n \"ControlActionSet\",\n \"ControlChannel\",\n \"ControlPlaneService\",\n \"create_runtime\",\n \"FileConfigProvider\",\n \"HealthContributor\",\n \"HealthRegistry\",\n \"HttpControlChannel\",\n \"InMemoryTaskQueue\",\n \"LogManager\",\n \"MySqlTraceTransport\",\n \"NoOpTraceTransport\",\n \"RuntimeManager\",\n \"ServiceContainer\",\n \"TraceContext\",\n \"TraceContextRecord\",\n \"TraceLogMessage\",\n \"TraceService\",\n \"TraceTransport\",\n \"StepResult\",\n \"Worker\",\n \"WorkerHealth\",\n \"WorkerStatus\",\n \"WorkflowContext\",\n \"WorkflowDefinition\",\n \"WorkflowEngine\",\n \"WorkflowEngineHooks\",\n \"WorkflowNode\",\n \"WorkflowRuntimeFactory\",\n \"WorkflowStep\",\n \"WorkerSupervisor\",\n]",
|
||||
"start_line": 1,
|
||||
"end_line": 69,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "window",
|
||||
"module_or_unit": "src.plba.__init__",
|
||||
"is_test": false,
|
||||
"blob_sha": "24e755ec8c249d14fb0e675b5dbf2b71ab91afb9c849897eebfa9feb2499e19d",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"relations": [],
|
||||
"entrypoints": [],
|
||||
"test_candidates": [],
|
||||
"layer_outcomes": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 1,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"missing_layers": [],
|
||||
"raw_rows": [
|
||||
{
|
||||
"path": "src/plba/__init__.py",
|
||||
"content": "from plba.bootstrap import create_runtime\nfrom plba.config import ConfigFileLoader, FileConfigProvider\nfrom plba.control import ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel\nfrom plba.contracts import (\n ApplicationModule,\n ConfigProvider,\n HealthContributor,\n TraceContext,\n TraceContextRecord,\n TraceLogMessage,\n TraceTransport,\n Worker,\n WorkerHealth,\n WorkerStatus,\n)\nfrom plba.core import ConfigurationManager, RuntimeManager, ServiceContainer\nfrom plba.health import HealthRegistry\nfrom plba.logging import LogManager\nfrom plba.queue import InMemoryTaskQueue\nfrom plba.tracing import MySqlTraceTransport, NoOpTraceTransport, TraceService\nfrom plba.workflow import (\n StepResult,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowEngine,\n WorkflowEngineHooks,\n WorkflowNode,\n WorkflowRuntimeFactory,\n WorkflowStep,\n)\nfrom plba.workers import WorkerSupervisor\n\n__all__ = [\n \"ApplicationModule\",\n \"ConfigFileLoader\",\n \"ConfigProvider\",\n \"ConfigurationManager\",\n \"ControlActionSet\",\n \"ControlChannel\",\n \"ControlPlaneService\",\n \"create_runtime\",\n \"FileConfigProvider\",\n \"HealthContributor\",\n \"HealthRegistry\",\n \"HttpControlChannel\",\n \"InMemoryTaskQueue\",\n \"LogManager\",\n \"MySqlTraceTransport\",\n \"NoOpTraceTransport\",\n \"RuntimeManager\",\n \"ServiceContainer\",\n \"TraceContext\",\n \"TraceContextRecord\",\n \"TraceLogMessage\",\n \"TraceService\",\n \"TraceTransport\",\n \"StepResult\",\n \"Worker\",\n \"WorkerHealth\",\n \"WorkerStatus\",\n \"WorkflowContext\",\n \"WorkflowDefinition\",\n \"WorkflowEngine\",\n \"WorkflowEngineHooks\",\n \"WorkflowNode\",\n \"WorkflowRuntimeFactory\",\n \"WorkflowStep\",\n \"WorkerSupervisor\",\n]",
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"title": "src/plba/__init__.py:1-69",
|
||||
"span_start": 1,
|
||||
"span_end": 69,
|
||||
"lexical_rank": 0,
|
||||
"prefer_bonus": 0,
|
||||
"test_penalty": 0,
|
||||
"structural_rank": 0,
|
||||
"layer_rank": 0,
|
||||
"distance": 0,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "window",
|
||||
"module_or_unit": "src.plba.__init__",
|
||||
"is_test": false,
|
||||
"blob_sha": "24e755ec8c249d14fb0e675b5dbf2b71ab91afb9c849897eebfa9feb2499e19d",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"retrieval_report": {
|
||||
"executed_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_mode_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": "exact_path_fetch"
|
||||
},
|
||||
"top_k_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": 200
|
||||
},
|
||||
"filters_by_layer": {
|
||||
"C0_SOURCE_CHUNKS": {
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
]
|
||||
}
|
||||
},
|
||||
"requests": [
|
||||
{
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"ranking_profile": "code"
|
||||
}
|
||||
],
|
||||
"fallback": {
|
||||
"used": false,
|
||||
"reason": null
|
||||
},
|
||||
"retrieval_by_layer_ms": {
|
||||
"C0_SOURCE_CHUNKS": 21
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": {
|
||||
"intent_correct": null,
|
||||
"target_found": true,
|
||||
"layers_used": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"retrieval_sufficient": true,
|
||||
"answer_mode": "normal",
|
||||
"router_result": {
|
||||
"intent": "CODE_QA",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"retrieval_profile": "code",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
],
|
||||
"symbol_resolution_status": "not_requested"
|
||||
},
|
||||
"retrieval_request": {
|
||||
"rag_session_id": "7d11da21-faa0-4cea-aede-aeabe069164c",
|
||||
"query": "Открой файл src/plba/__init__.py",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"requested_layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
},
|
||||
"per_layer_outcome": [
|
||||
{
|
||||
"layer_id": "C0_SOURCE_CHUNKS",
|
||||
"hit_count": 1,
|
||||
"empty": false,
|
||||
"fallback_used": false
|
||||
}
|
||||
],
|
||||
"empty_layers": [],
|
||||
"evidence_gate_decision": {
|
||||
"sufficient": true,
|
||||
"failure_reasons": [],
|
||||
"evidence_count": 1
|
||||
},
|
||||
"failure_reasons": [],
|
||||
"timings_ms": {}
|
||||
},
|
||||
"rag_rows": [
|
||||
{
|
||||
"path": "src/plba/__init__.py",
|
||||
"content": "from plba.bootstrap import create_runtime\nfrom plba.config import ConfigFileLoader, FileConfigProvider\nfrom plba.control import ControlActionSet, ControlChannel, ControlPlaneService, HttpControlChannel\nfrom plba.contracts import (\n ApplicationModule,\n ConfigProvider,\n HealthContributor,\n TraceContext,\n TraceContextRecord,\n TraceLogMessage,\n TraceTransport,\n Worker,\n WorkerHealth,\n WorkerStatus,\n)\nfrom plba.core import ConfigurationManager, RuntimeManager, ServiceContainer\nfrom plba.health import HealthRegistry\nfrom plba.logging import LogManager\nfrom plba.queue import InMemoryTaskQueue\nfrom plba.tracing import MySqlTraceTransport, NoOpTraceTransport, TraceService\nfrom plba.workflow import (\n StepResult,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowEngine,\n WorkflowEngineHooks,\n WorkflowNode,\n WorkflowRuntimeFactory,\n WorkflowStep,\n)\nfrom plba.workers import WorkerSupervisor\n\n__all__ = [\n \"ApplicationModule\",\n \"ConfigFileLoader\",\n \"ConfigProvider\",\n \"ConfigurationManager\",\n \"ControlActionSet\",\n \"ControlChannel\",\n \"ControlPlaneService\",\n \"create_runtime\",\n \"FileConfigProvider\",\n \"HealthContributor\",\n \"HealthRegistry\",\n \"HttpControlChannel\",\n \"InMemoryTaskQueue\",\n \"LogManager\",\n \"MySqlTraceTransport\",\n \"NoOpTraceTransport\",\n \"RuntimeManager\",\n \"ServiceContainer\",\n \"TraceContext\",\n \"TraceContextRecord\",\n \"TraceLogMessage\",\n \"TraceService\",\n \"TraceTransport\",\n \"StepResult\",\n \"Worker\",\n \"WorkerHealth\",\n \"WorkerStatus\",\n \"WorkflowContext\",\n \"WorkflowDefinition\",\n \"WorkflowEngine\",\n \"WorkflowEngineHooks\",\n \"WorkflowNode\",\n \"WorkflowRuntimeFactory\",\n \"WorkflowStep\",\n \"WorkerSupervisor\",\n]",
|
||||
"layer": "C0_SOURCE_CHUNKS",
|
||||
"title": "src/plba/__init__.py:1-69",
|
||||
"span_start": 1,
|
||||
"span_end": 69,
|
||||
"lexical_rank": 0,
|
||||
"prefer_bonus": 0,
|
||||
"test_penalty": 0,
|
||||
"structural_rank": 0,
|
||||
"layer_rank": 0,
|
||||
"distance": 0,
|
||||
"metadata": {
|
||||
"chunk_index": 0,
|
||||
"chunk_type": "window",
|
||||
"module_or_unit": "src.plba.__init__",
|
||||
"is_test": false,
|
||||
"blob_sha": "24e755ec8c249d14fb0e675b5dbf2b71ab91afb9c849897eebfa9feb2499e19d",
|
||||
"repo_id": "plba",
|
||||
"artifact_type": null,
|
||||
"section": null,
|
||||
"doc_id": null,
|
||||
"doc_version": null,
|
||||
"owner": null,
|
||||
"system_component": null,
|
||||
"last_modified": null,
|
||||
"staleness_score": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"validation": {
|
||||
"passed": true,
|
||||
"action": "return",
|
||||
"reasons": []
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
# plba-v2-open-file-public-api
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Открой файл src/plba/__init__.py
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 1,
|
||||
"llm_answer": "Путь к файлу: src/plba/__init__.py\n\nВ этом файле находятся импорт различных модулей и классов из пакета plba. В частности, здесь можно найти:\n- Импорты для создания runtime с помощью `create_runtime`\n- Классы и интерфейсы конфигурации (`ConfigFileLoader`, `FileConfigProvider`)\n- Контроллеры и каналы управления (`ControlActionSet`, `ControlChannel`, `HttpControlChannel`)\n- Определения контрактов (`ApplicationModule`, `Worker`, etc.)\n- Менеджеры конфигурации и выполнения (`ConfigurationManager`, `RuntimeManager`, `ServiceContainer`)\n- Регистраторы здоровья и службы логирования\n- Обработчики очередей задач и транспортные средства трассировки (`InMemoryTaskQueue`, `MySqlTraceTransport`, `NoOpTraceTransport`)\n- Определение рабочего потока и контекста (`StepResult`, `WorkflowContext`, `WorkflowDefinition`)",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/plba/__init__.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because one or more lines are too long
@@ -1,30 +0,0 @@
|
||||
# plba-v2-open-file-runtime
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Открой файл src/app_runtime/core/runtime.py
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "OPEN_FILE",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 1,
|
||||
"llm_answer": "Путь: src/app_runtime/core/runtime.py\n\nВ этом файле содержится определение класса `RuntimeManager`. В классе инициализируются различные компоненты системы, такие как конфигурация, службы, трассировка, здоровье, журналы, рабочие процессы и контрольная плоскость. Класс предназначен для управления выполнением действий в системе с заданными тайм-аутами и интервалами опроса.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [
|
||||
"src/app_runtime/core/runtime.py"
|
||||
],
|
||||
"symbol_candidates": [],
|
||||
"layers": [
|
||||
"C0_SOURCE_CHUNKS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,35 +0,0 @@
|
||||
# plba-v2-trace-flow-health-endpoint
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Покажи как проходит запрос /health в HttpControlAppFactory
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 37,
|
||||
"llm_answer": "1. HttpControlAppFactory.create(health_provider, action_provider)\n - Создает FastAPI приложение.\n - Добавляет middleware для логирования времени ответа.\n - Обрабатывает GET запрос к \"/health\".\n\n2. HttpControlAppFactory.create.health()\n - Вызывается при обработке запроса \"/health\".\n - Возвращает Awaitable объект типа HealthPayload.\n\n3. HttpControlAppFactory.create.action_provider()\n - Определяет поведение при запросе действий.\n\nПолный поток вызова от обработки запроса \"/health\" до получения HealthPayload отсутствует в предоставленных доказательствах.",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"health",
|
||||
"HttpControlAppFactory"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,34 +0,0 @@
|
||||
# plba-v2-trace-flow-runtime-start
|
||||
|
||||
- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v2/cases/suite_02_pipeline/full_chain_plba_code_subintents_v2.yaml
|
||||
- runner: agent_runtime
|
||||
- mode: full_chain
|
||||
- passed: True
|
||||
|
||||
## Query
|
||||
Покажи поток выполнения при запуске RuntimeManager
|
||||
|
||||
## Actual
|
||||
{
|
||||
"intent": "CODE_QA",
|
||||
"sub_intent": "TRACE_FLOW",
|
||||
"graph_id": "CodeQAGraph",
|
||||
"conversation_mode": "START",
|
||||
"rag_count": 37,
|
||||
"llm_answer": "1. Запускается `RuntimeManager` через импорт в `bootstrap.py` (`src/plba/bootstrap.py:4`).\n2. Далее, в `control/service.py`, происходит повторный импорт и переопределение переменной `RuntimeManager` как `app_runtime.core.runtime.RuntimeManager` (`src/app_runtime/control/service.py:9`).\n3. В файле `core/runtime.py` начинается определение класса `RuntimeManager`. Этот класс управляет состоянием приложения и участвует в управлении жизненным циклом различных сервисов и модулей (`src/app_runtime/core/runtime.py:18-179`).\n4. Из `__init__.py` модуля `plba` (`src/plba/__init__.py:16`) импортируется другой экземпляр `RuntimeManager`.\n5. Затем идет обращение к инициализации объекта `ControlPlaneService` в модуле `control/service.py` (`src/app_runtime/control/service.py:12-52`), который регистрирует каналы управления.\n6. Контроллер канала управления определяется в `base.py` файла `control` и имеет методы для запуска и остановки каналов (`src/app_runtime/control/base.py:21-28`).\n7. В `control/http_channel.py` создается объект `HttpControlChannel`, управляющий HTTP-запросами с использованием библиотеки uvicorn (`src/app_runtime/control/http_channel.py:12-57`).\n8. Модуль `control/http_app.py` создает фабрику приложений для обработки HTTP-запросов, связанных с управлением состоянием системы (`src/app_runtime/control/http_app.py:15-53`).\n9. Инициализация конфигурации и параметров происходит в методах `_register_core_services` и `_start_async` внутри класса `RuntimeManager` (`src/app_runtime/core/runtime.py:32-127`).\n\nПолный путь вызова:\n\n1. `src/plba/bootstrap.py`\n2. `src/app_runtime/control/service.py`\n3. `src/app_runtime/core/runtime.py`\n4. `src/plba/__init__.py`\n5. `src/app_runtime/control/service.py`\n6. `src/app_runtime/control/base.py`\n7. `src/app_runtime/control/http_channel.py`\n8. `src/app_runtime/control/http_app.py`\n9. `src/app_runtime/core/runtime.py`",
|
||||
"answer_mode": "answered",
|
||||
"path_scope": [],
|
||||
"symbol_candidates": [
|
||||
"RuntimeManager"
|
||||
],
|
||||
"layers": [
|
||||
"C1_SYMBOL_CATALOG",
|
||||
"C0_SOURCE_CHUNKS",
|
||||
"C4_SEMANTIC_ROLES",
|
||||
"C2_DEPENDENCY_GRAPH",
|
||||
"C3_ENTRYPOINTS"
|
||||
]
|
||||
}
|
||||
|
||||
## Mismatches
|
||||
- none
|
||||
@@ -1,85 +0,0 @@
|
||||
# pipeline_setup_v3 summary
|
||||
|
||||
Passed: 15/18
|
||||
|
||||
| File | Case | Mode | Query | Actual sub-intent | RAG layers | Pass |
|
||||
|------|------|------|-------|-------------------|------------|------|
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-open-file-runtime | full_chain | Открой файл src/app_runtime/core/runtime.py | OPEN_FILE | C0_SOURCE_CHUNKS:1 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-open-file-public-api | full_chain | Открой файл src/plba/__init__.py | OPEN_FILE | C0_SOURCE_CHUNKS:1 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-runtime-manager | full_chain | Объясни как работает класс RuntimeManager | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-trace-service | full_chain | Объясни как работает класс TraceService | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-create-runtime | full_chain | Что делает функция create_runtime? | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-local-http-channel | full_chain | Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так? | EXPLAIN_LOCAL | C0_SOURCE_CHUNKS:1, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:4 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-tests-runtime-manager | full_chain | Где тесты для RuntimeManager? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-tests-trace-service | full_chain | Где тесты для TraceService? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-tests-create-runtime | full_chain | Где тесты для create_runtime? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-tests-workflow-runtime-factory-negative | full_chain | Где тесты для WorkflowRuntimeFactory? | FIND_TESTS | C0_SOURCE_CHUNKS:10, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-entrypoints-control-plane | full_chain | Найди точки входа HTTP control plane | FIND_ENTRYPOINTS | C0_SOURCE_CHUNKS:6, C3_ENTRYPOINTS:3 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-find-entrypoints-health-endpoint | full_chain | Где health endpoint? | FIND_ENTRYPOINTS | C0_SOURCE_CHUNKS:6, C3_ENTRYPOINTS:3 | ✗ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-trace-flow-runtime-start | full_chain | Покажи поток выполнения при запуске RuntimeManager | TRACE_FLOW | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:10, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-trace-flow-health-endpoint | full_chain | Покажи как проходит запрос /health в HttpControlAppFactory | TRACE_FLOW | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:10, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-architecture-runtime-manager | full_chain | Какие компоненты участвуют в RuntimeManager? | ARCHITECTURE | C0_SOURCE_CHUNKS:4, C1_SYMBOL_CATALOG:6, C2_DEPENDENCY_GRAPH:8, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:12 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-architecture-control-plane | full_chain | Какие компоненты участвуют в ControlPlaneService? | ARCHITECTURE | C0_SOURCE_CHUNKS:4, C1_SYMBOL_CATALOG:6, C2_DEPENDENCY_GRAPH:8, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:12 | ✓ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-explain-nonexistent-symbol | full_chain | Объясни класс RuntimeFactoryManager | EXPLAIN | C0_SOURCE_CHUNKS:8, C1_SYMBOL_CATALOG:8, C2_DEPENDENCY_GRAPH:6, C3_ENTRYPOINTS:3, C4_SEMANTIC_ROLES:8 | ✗ |
|
||||
| full_chain_plba_code_subintents_v2.yaml | plba-v2-open-file-nonexistent | full_chain | Открой файл src/app_runtime/core/missing_runtime.py | OPEN_FILE | — | ✗ |
|
||||
|
||||
## Failures
|
||||
- **plba-v2-find-entrypoints-health-endpoint**: llm: expected answer to contain 'GET /health'
|
||||
- **plba-v2-explain-nonexistent-symbol**: answer_mode: expected degraded, got answered; retrieval: expected empty rag, got 33 rows; llm: expected answer to contain 'не найдена'
|
||||
- **plba-v2-open-file-nonexistent**: answer_mode: expected degraded, got not_found; llm: expected answer to contain 'Файл src/app_runtime/core/missing_runtime.py не найден.'
|
||||
|
||||
## LLM Answers
|
||||
- **plba-v2-open-file-runtime**
|
||||
Query: Открой файл src/app_runtime/core/runtime.py
|
||||
> Путь: src/app\_runtime/core/runtime.py В этом файле содержится определение класса \`RuntimeManager\`. В классе инициализируются различные компоненты системы, такие как конфигурация, службы, трассировка, здоровье, журналы, рабочие процессы и контрольная плоскость. Класс предназначен для управления выполнением действий в системе с заданными тайм\-аутами и интервалами опроса.
|
||||
- **plba-v2-open-file-public-api**
|
||||
Query: Открой файл src/plba/__init__.py
|
||||
> Путь к файлу: src/plba/\_\_init\_\_.py В этом файле находятся импорт различных модулей и классов из пакета plba. В частности, здесь можно найти: \- Импорты для создания runtime с помощью \`create\_runtime\` \- Классы и интерфейсы конфигурации \(\`ConfigFileLoader\`, \`FileConfigProvider\`\) \- Контроллеры и каналы управления \(\`ControlActionSet\`, \`ControlChannel\`, \`HttpControlChannel\`\) \- Определения контрактов \(\`ApplicationModule\`, \`Worker\`, etc.\) \- Менеджеры конфигурации и выполнения \(\`ConfigurationManager\`, \`RuntimeManager\`, \`ServiceContainer\`\) \- Регистраторы здоровья и службы логирования \- Обработчики очередей задач и транспортные средства трассировки \(\`InMemoryTaskQueue\`, \`MySqlTraceTransport\`, \`NoOpTraceTransport\`\) \- Определение рабочего потока и контекста \(\`StepResult\`, \`WorkflowContext\`, \`WorkflowDefinition\`\)
|
||||
- **plba-v2-explain-runtime-manager**
|
||||
Query: Объясни как работает класс RuntimeManager
|
||||
> Класс \`RuntimeManager\` играет ключевую роль в управлении выполнением приложений и координации различных компонентов системы. Его основная функция заключается в оркестрации действий, связанных с жизненным циклом приложения, включая инициализацию, запуск и остановку сервисов и модулей. \*\*Ключевые шаги работы класса:\*\* 1. Инициализация конфигурации и состояния \(\`\_\_init\_\_\`\). 2. Добавление конфигурационных файлов и настроек \(\`add\_config\_file\`\). 3. Управление состоянием выполнения через чтение и запись атрибутов состояния \(\`configuration\`, \`\_state\`\). 4. Оркестровка вызова методов запуска и остановки для различных компонентов \(\`start\`, \`stop\`\). 5. Участие в обработке данных потока и управлении потоками задач \(\`participates in dataflow slices\`\). \*\*Опорные файлы:\*\* \- \`src/app\_runtime/core/runtime.py:18\-179\` \- \`src/app\_runtime/control/service.py:12\-52\` \- \`src/app\_runtime/contr…
|
||||
- **plba-v2-explain-trace-service**
|
||||
Query: Объясни как работает класс TraceService
|
||||
> Класс \`TraceService\` является основным компонентом системы отслеживания трассировок в приложении. Его основная функция заключается в управлении контекстом трассировки и записи событий в журнал. \*\*Ключевые шаги работы класса:\*\* 1. Инициализация с передачей транспорта \(\`transport\`\) и хранилища контекста \(\`store\`\), которые могут быть опциональными. 2. Создание нового контекста трассировки через метод \`create\_context\`, который генерирует уникальный идентификатор трассы и сохраняет запись о контексте в хранилище. 3. Управление текущим контекстом трассировки через методы: \- \`current\_trace\_id\`: возвращает текущий идентификатор трассировки. \- \`open\_context\`: открывает новый контекст трассировки. \- \`close\_context\`: закрывает текущий контекст трассировки. \*\*Опорные файлы:\*\* \- \`src/app\_runtime/tracing/service.py:39\-166\` \- \`src/app\_runtime/tracing/service.py:66\-78\` \- \`src/app\_ru…
|
||||
- **plba-v2-explain-create-runtime**
|
||||
Query: Что делает функция create_runtime?
|
||||
> Функция \`create\_runtime\` инициализирует и настраивает менеджер выполнения приложения. \*\*Ключевые шаги:\*\* 1. Создает экземпляр менеджера выполнения \(\`RuntimeManager\`\). 2. При наличии указанного пути к конфигурационному файлу добавляет его в менеджер. 3. Если включена опция HTTP\-контроля, регистрирует канал управления с указанными параметрами хоста, порта и тайм\-аута. 4. Регистрирует указанный модуль приложения в менеджере. 5. Возвращает созданный менеджер выполнения. \*\*Опорные файлы:\*\* \- \`src/plba/bootstrap.py:8\-29\`
|
||||
- **plba-v2-explain-local-http-channel**
|
||||
Query: Почему в файле src/app_runtime/control/http_channel.py класс HttpControlChannel устроен так?
|
||||
> Класс \`HttpControlChannel\` в файле \`src/app\_runtime/control/http\_channel.py\` реализует механизм управления HTTP\-каналом для взаимодействия с внешними сервисами или компонентами. \*\*Ключевые шаги его реализации:\*\* 1. Инициализация класса: \- При создании экземпляра устанавливается таймаут \(\`\_timeout\`\), запускается сервер через объект \`UvicornThreadRunner\`, создается фабрика приложений \`HttpControlAppFactory\`. 2. Запуск канала: \- Метод \`start\` инициализирует набор действий \(\`actions\`\) и создает приложение для работы с ними. Затем запускает сервер через ранее созданный объект \`UvicornThreadRunner\`. 3. Остановка канала: \- Метод \`stop\` останавливает запущенный сервер. Опорные файлы: \- \`src/app\_runtime/control/http\_channel.py\`: определение и реализация класса \`HttpControlChannel\`.
|
||||
- **plba-v2-find-tests-runtime-manager**
|
||||
Query: Где тесты для RuntimeManager?
|
||||
> \- tests/test\_runtime.py:12\-12 \- tests/test\_business\_control\_actions.py:14\-14
|
||||
- **plba-v2-find-tests-trace-service**
|
||||
Query: Где тесты для TraceService?
|
||||
> \- tests/test\_runtime.py:test\_trace\_service\_allows\_messages\_without\_status \(line range: 279\-293\) \- tests/test\_runtime.py:test\_trace\_service\_writes\_contexts\_and\_messages \(line range: 246\-259\) \- tests/test\_runtime.py:test\_trace\_service\_supports\_debug\_warning\_and\_error\_levels \(line range: 262\-276\)
|
||||
- **plba-v2-find-tests-create-runtime**
|
||||
Query: Где тесты для create_runtime?
|
||||
> \- tests/test\_runtime.py:342\-405
|
||||
- **plba-v2-find-tests-workflow-runtime-factory-negative**
|
||||
Query: Где тесты для WorkflowRuntimeFactory?
|
||||
> Insufficient evidence for a confident answer. No test candidates found.
|
||||
- **plba-v2-find-entrypoints-control-plane**
|
||||
Query: Найди точки входа HTTP control plane
|
||||
> Confirmed Entrypoints: 1. src/app\_runtime/control/http\_app.py:app.post \(lines 38\-42\) 2. src/app\_runtime/control/http\_app.py:app.get \(lines 31\-34\) 3. src/app\_runtime/control/http\_app.py:app.get \(lines 38\-42\)
|
||||
- **plba-v2-find-entrypoints-health-endpoint**
|
||||
Query: Где health endpoint?
|
||||
> health endpoint: \- src/app\_runtime/control/http\_app.py:38\-42 \(app.post\) \- src/app\_runtime/control/http\_app.py:31\-34 \(app.get\)
|
||||
- **plba-v2-trace-flow-runtime-start**
|
||||
Query: Покажи поток выполнения при запуске RuntimeManager
|
||||
> 1. Запускается \`RuntimeManager\` через импорт в \`bootstrap.py\` \(\`src/plba/bootstrap.py:4\`\). 2. Далее, в \`control/service.py\`, происходит повторный импорт и переопределение переменной \`RuntimeManager\` как \`app\_runtime.core.runtime.RuntimeManager\` \(\`src/app\_runtime/control/service.py:9\`\). 3. В файле \`core/runtime.py\` начинается определение класса \`RuntimeManager\`. Этот класс управляет состоянием приложения и участвует в управлении жизненным циклом различных сервисов и модулей \(\`src/app\_runtime/core/runtime.py:18\-179\`\). 4. Из \`\_\_init\_\_.py\` модуля \`plba\` \(\`src/plba/\_\_init\_\_.py:16\`\) импортируется другой экземпляр \`RuntimeManager\`. 5. Затем идет обращение к инициализации объекта \`ControlPlaneService\` в модуле \`control/service.py\` \(\`src/app\_runtime/control/service.py:12\-52\`\), который регистрирует каналы управления. 6. Контроллер канала управления определяется в \`base.py\` фай…
|
||||
- **plba-v2-trace-flow-health-endpoint**
|
||||
Query: Покажи как проходит запрос /health в HttpControlAppFactory
|
||||
> 1. HttpControlAppFactory.create\(health\_provider, action\_provider\) \- Создает FastAPI приложение. \- Добавляет middleware для логирования времени ответа. \- Обрабатывает GET запрос к "/health". 2. HttpControlAppFactory.create.health\(\) \- Вызывается при обработке запроса "/health". \- Возвращает Awaitable объект типа HealthPayload. 3. HttpControlAppFactory.create.action\_provider\(\) \- Определяет поведение при запросе действий. Полный поток вызова от обработки запроса "/health" до получения HealthPayload отсутствует в предоставленных доказательствах.
|
||||
- **plba-v2-architecture-runtime-manager**
|
||||
Query: Какие компоненты участвуют в RuntimeManager?
|
||||
> \#\#\# Подтвержденные Связи 1. \*\*RuntimeManager\*\*: \- Является ключевым компонентом управления жизненным циклом приложения. \- Инициализирует и управляет другими компонентами системы через метод \`\_\_init\_\_\`. 2. \*\*ControlPlaneService\*\*: \- Управляет каналами контроля. \- Вызывается из метода инициализации \`RuntimeManager\` для регистрации каналов. 3. \*\*ControlChannel\*\*: \- Абстрактный класс для реализации конкретных каналов контроля. \- Реализует методы \`start\` и \`stop\`, которые вызываются сервисами и менеджерами. 4. \*\*ConfigFileLoader\*\*: \- Загружает конфигурационные файлы и передает их в runtime\-менеджер. 5. \*\*WorkflowPersistence\*\*: \- Обеспечивает сохранение информации о workflows. 6. \*\*InMemoryTaskQueue\*\*: \- Используется для хранения задач внутри памяти. 7. \*\*TraceContextStore\*\*: \- Хранит контекст трассировки. 8. \*\*WorkerSupervisor\*\*: \- Наблюдает за рабочими процессами и управ…
|
||||
- **plba-v2-architecture-control-plane**
|
||||
Query: Какие компоненты участвуют в ControlPlaneService?
|
||||
> \#\#\# Подтвержденные Связи 1. \*\*ControlPlaneService\*\*: \- Вызывает методы инициализации \(\`\_channels\`, \`\_start\_async\`, \`register\_channel\`, \`start\`, \`stop\`, \`\_stop\_async\`\) \[evidence: 16\-20\]. 2. \*\*ControlPlaneService\*\* взаимодействует с другими компонентами через методы регистрации каналов и запуска: \- Регистрация канала \(\`register\_channel\`\) использует атрибут \`\_channels\` для хранения списка зарегистрированных каналов \[evidence: 22\]. \- Запуск сервиса использует метод \`start\`, который также обращается к атрибуту \`\_channels\` \[evidence: 23\]. \#\#\# Роли Компонентов 1. \*\*ControlPlaneService\*\*: \- Pipeline stage: отвечает за чтение и запись состояния атрибутов, участвует в данных срезах \(dataflow slices\). 2. \*\*ControlChannel\*\*: \- Model: выполняет функции модели управления каналами, включая запуск и остановку. 3. \*\*ControlActionSet\*\*: \- Default model role: обеспечивает стандартные д…
|
||||
- **plba-v2-explain-nonexistent-symbol**
|
||||
Query: Объясни класс RuntimeFactoryManager
|
||||
> Класс \`RuntimeFactoryManager\` не найден в предоставленном коде или контекстной информации. Ключевые шаги и опорные файлы: 1. Код и контекста относятся к управлению каналами управления \(«control channels»\) в приложении. 2. Основные классы включают \`ControlChannel\`, \`ControlActionSet\`, и связанные с ними каналы и сервисы. 3. Основной файл для рассмотрения — \`base.py\`. 4. Ключевые обязанности и интерфейсы описаны через абстрактные методы \(\`start\`, \`stop\`\) в классе \`ControlChannel\`. Поскольку конкретный класс \`RuntimeFactoryManager\` отсутствует в данном контексте, невозможно предоставить его объяснение.
|
||||
- **plba-v2-open-file-nonexistent**
|
||||
Query: Открой файл src/app_runtime/core/missing_runtime.py
|
||||
> Файл \`src/app\_runtime/core/missing\_runtime.py\` не найден.
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user