| from __future__ import annotations |
|
|
| from dataclasses import dataclass |
| from typing import Protocol |
|
|
| from .schema import SemanticPlan |
| from .merge_logic import merge_council_plans, MergeReport |
| from .unified_planner import UnifiedPlannerLLM |
|
|
|
|
| class Planner(Protocol): |
| name: str |
|
|
| def plan(self, user_prompt: str) -> SemanticPlan: |
| ... |
|
|
|
|
| @dataclass(frozen=True) |
| class CouncilResult: |
| plan_a: SemanticPlan |
| plan_b: SemanticPlan |
| plan_c: SemanticPlan |
| merged_plan: SemanticPlan |
| merge_report: MergeReport |
|
|
|
|
| class SemanticPlanningCouncil: |
| """ |
| Council-lite (3 planners): |
| - A: Core semantics & constraints |
| - B: Mood/style emphasis |
| - C: Soundscape/audio emphasis |
| """ |
|
|
| def __init__(self, planner_a: Planner, planner_b: Planner, planner_c: Planner): |
| self.planner_a = planner_a |
| self.planner_b = planner_b |
| self.planner_c = planner_c |
|
|
| def run(self, user_prompt: str) -> CouncilResult: |
| plan_a = self.planner_a.plan(user_prompt) |
| plan_b = self.planner_b.plan(user_prompt) |
| plan_c = self.planner_c.plan(user_prompt) |
|
|
| merged, report = merge_council_plans(plan_a, plan_b, plan_c) |
| return CouncilResult( |
| plan_a=plan_a, |
| plan_b=plan_b, |
| plan_c=plan_c, |
| merged_plan=merged, |
| merge_report=report, |
| ) |
|
|
|
|
| class PlannerCouncil: |
| def __init__(self): |
| self.planner = UnifiedPlannerLLM() |
|
|
| def run(self, user_prompt: str) -> SemanticPlan: |
| return self.planner.plan(user_prompt) |
|
|