cli+dashboard: --panel flag, panel dict keys, TF-dialog panel section
main.py: --panel runs the agent panel on demand (force bypasses enabled/surface/quality toggles; daily budget + LLM cap still apply), prints the verdict + persona takes, and report_to_dict carries the four panel keys — which auto-propagates them into the dashboard's snapshot.json via report_to_webapp_dict. dashboard_publisher attaches in scan_tf gated by agent_panel.dashboard (default off); dashboard.html renders an "AI panel (advisory)" section in the TF detail dialog. Claude-Session: https://claude.ai/code/session_01SisdfkxnXNL9iZsXxN3T15
This commit is contained in:
@@ -20,6 +20,7 @@ if hasattr(sys.stdout, "reconfigure"):
|
||||
if hasattr(sys.stderr, "reconfigure"):
|
||||
sys.stderr.reconfigure(encoding="utf-8")
|
||||
|
||||
from agent_panel import attach_panel
|
||||
from config import PlatformConfig, Timeframe, SignalStrength, XAUUSD
|
||||
from pair_signals import PAIR_PRODUCERS
|
||||
from signal_aggregator import SignalAggregator, SignalReport
|
||||
@@ -163,6 +164,13 @@ def print_signal_report(report: SignalReport, detail: bool = False):
|
||||
print(f" {Colors.MAGENTA}📰{Colors.RESET} {report.news_description}")
|
||||
if report.news_summary:
|
||||
print(f" {Colors.MAGENTA}🧠{Colors.RESET} {report.news_summary}")
|
||||
if report.panel_verdict:
|
||||
print(f" {Colors.CYAN}🤖{Colors.RESET} AI Panel: "
|
||||
f"{Colors.BOLD}{report.panel_verdict}{Colors.RESET} "
|
||||
f"({report.panel_confidence:.0f}%) — {report.panel_rationale}")
|
||||
for t in report.panel_takes:
|
||||
print(f" {Colors.GRAY}{t['persona']:<11} {t['stance']:<8} "
|
||||
f"{t['note']}{Colors.RESET}")
|
||||
|
||||
# ── 6. DETAIL (only with --detail) ─────────────────────────────
|
||||
if detail and report.primary_analysis:
|
||||
@@ -209,6 +217,10 @@ def report_to_dict(report: SignalReport) -> dict:
|
||||
"news_sentiment": round(report.news_sentiment, 3),
|
||||
"news_description": report.news_description,
|
||||
"news_summary": report.news_summary,
|
||||
"panel_verdict": report.panel_verdict,
|
||||
"panel_confidence": round(report.panel_confidence, 1),
|
||||
"panel_rationale": report.panel_rationale,
|
||||
"panel_takes": report.panel_takes,
|
||||
"bullish_reasons": report.bullish_reasons,
|
||||
"bearish_reasons": report.bearish_reasons,
|
||||
"warnings": report.warnings,
|
||||
@@ -268,6 +280,9 @@ Examples:
|
||||
help="Primary analysis timeframe (default: H1)")
|
||||
parser.add_argument("--detail", action="store_true",
|
||||
help="Show full indicator breakdown")
|
||||
parser.add_argument("--panel", action="store_true",
|
||||
help="Run the LLM agent panel on the result "
|
||||
"(advisory only; needs a DeepSeek key)")
|
||||
parser.add_argument("--json", action="store_true",
|
||||
help="Output as JSON")
|
||||
parser.add_argument("--verbose", "-v", action="store_true",
|
||||
@@ -323,6 +338,11 @@ def run_live(args, config: PlatformConfig):
|
||||
aggregator = SignalAggregator(config)
|
||||
report = aggregator.analyze_pair(symbol=config.symbol)
|
||||
|
||||
# Explicit user intent: force bypasses the enabled/surface/quality
|
||||
# toggles, but the daily panel budget and LLM cap still apply.
|
||||
if getattr(args, "panel", False):
|
||||
attach_panel(report, surface="cli", force=True)
|
||||
|
||||
if args.json:
|
||||
print(json.dumps(report_to_dict(report), indent=2))
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user