feat(fase2): wire BudgetMiddleware + retrieval tool onto the debate in run_project

This commit is contained in:
Kjell Tore Guttormsen 2026-06-26 00:37:45 +02:00
commit 7573c4439f
2 changed files with 92 additions and 19 deletions

View file

@ -31,9 +31,13 @@ from dataclasses import dataclass
from agent_framework import BaseChatClient, SessionContext
from portfolio_optimiser.backends import Profile, get_backend, resolve_model
from portfolio_optimiser.budget import Budget, TokenMeter
from portfolio_optimiser.budget import Budget, BudgetMiddleware, TokenMeter
from portfolio_optimiser.contracts import load_contracts
from portfolio_optimiser.datasource import chunk_dict_to_citation, retrieve_chunks
from portfolio_optimiser.datasource import (
chunk_dict_to_citation,
make_retrieval_tool,
retrieve_chunks,
)
from portfolio_optimiser.generate import generate_via_llm
from portfolio_optimiser.ir import SavingsProposal
from portfolio_optimiser.provenance import ProvenanceStamp
@ -118,9 +122,20 @@ async def run_project(
context = "\n".join(c["snippet"] for c in chunks)
# 4. Budget + maker-checker debate (round-capped; Layer-1 HITL optional).
# The shared meter is driven on the debate's chat calls by the BudgetMiddleware
# (the brief's named short-circuit mechanism); the retrieval tool exposes the
# citation-bearing data source to the agents (no longer string-stuffed out-of-band).
meter = TokenMeter(Budget(max_tokens=max_tokens, max_rounds=max(max_rounds * 4, 4)))
factory = client_factory if client_factory is not None else _default_factory(profile)
debate = fresh_workflow(factory, max_rounds=max_rounds, enable_layer1_hitl=enable_layer1_hitl)
budget_mw = BudgetMiddleware(meter)
retrieval_tool = make_retrieval_tool(docs_dir, top_k=top_k)
debate = fresh_workflow(
factory,
max_rounds=max_rounds,
enable_layer1_hitl=enable_layer1_hitl,
tools=[retrieval_tool],
middleware=[budget_mw],
)
await debate.run(f"Find a cost-saving measure for {project.id}.\nContext:\n{context}")
# 5. Structured candidate -> blocking validation; token bound = the meter in this loop.