"""沙箱幂等重试：python 09_tool_reliability.py。无外部网络调用。"""
class Sandbox:
    def __init__(self):
        self.results = {}
        self.writes = 0

    def read(self, key):
        return self.results.get(key)

    def refund(self, key, confirmed, lose_reply=False):
        if not confirmed:
            raise PermissionError("confirmation required")
        if key not in self.results:
            self.writes += 1
            self.results[key] = f"receipt-{self.writes}"
        if lose_reply:
            raise TimeoutError("response lost after commit")
        return self.results[key]

def replay(keep_key, confirmed=True):
    service = Sandbox()
    key = "task41/refund-o1-4200"
    try:
        service.refund(key, confirmed=confirmed, lose_reply=True)
    except PermissionError:
        return service.writes, None
    except TimeoutError:
        if keep_key:
            receipt = service.read(key) or service.refund(key, confirmed=confirmed)
        else:
            receipt = service.refund(key+"/random-retry", confirmed=confirmed)
        return service.writes, receipt

for name, result in (("stable key", replay(True)), ("new key", replay(False)),
                     ("no confirmation", replay(True,False))):
    print(name, result)
assert replay(True)[0] == 1 and replay(False)[0] == 2 and replay(True,False)[0] == 0

