"""有限修复的控制流程：响应来自固定列表，不发网络请求。"""
from validation_demo import validate

class NeedsReview(Exception):
    """表达失败已达上限，应交给调用方处理，而不是无限生成。"""

def receive_ticket(generate, customer_text, max_repairs=1):
    # max_repairs=1 表示首次生成之后最多再修一次，总调用次数为 2。
    if max_repairs < 0:
        raise ValueError("修复次数不能为负")
    errors = []
    for attempt in range(max_repairs + 1):
        # 回调同时收到原始输入和有界错误信息，不会丢掉原始任务依据。
        # 在线实现还必须保留可信任务规则，并限制总时长和输出长度。
        raw = generate(customer_text, tuple(errors))
        try:
            return validate(raw)
        except ValueError as exc:
            # 这里只捕获解析/结构层错误；业务查库应在循环结束以后执行。
            # 避免把数据库异常、权限错误包装成“请换一个值”。
            errors.append(str(exc)[:200])
    raise NeedsReview("表达校验未通过，停止自动修复")

if __name__ == "__main__":
    # 第一个对象缺字段，第二个对象完整；二者都是教学预置数据。
    responses = iter([
        '{"category":"billing"}',
        '{"category":"billing","urgency":"medium","order_id":null,"requested_amount":null,"summary":"申请退款"}',
    ])
    def fake_generate(customer_text, errors):
        # 打印错误能看到第二次生成获得了什么反馈；这里并没有模型理解反馈。
        print("本次反馈：", errors)
        return next(responses)
    print(receive_ticket(fake_generate, "我想退款"))
