# हर Guard वाला Loop — Agent Loops, Stop Conditions और Token Budgets

Source: https://www.geekswithgeeks.com/hi/agent-loops/loop-guarded-skeleton

> Step, token और समय की सीमाएँ एक दोबारा उपयोग होने वाले budget object में जोड़ें।

## सीमाएँ एक object के पास

Loop में जगह-जगह `if` जाँचें बिखेरने से सीमाएँ भूलना आसान हो जाता है। छोटा **Budget** object steps, tokens और बीता समय गिनता है, और एक सवाल का उत्तर देता है: "क्या हम जारी रख सकते हैं, और नहीं तो क्यों?" Loop हर बारी उससे एक बार पूछता है।

## Budget class

यह जैसा दिखाया गया वैसा ही चला। 3,000, 4,000 और 4,000 tokens जोड़ने पर तीसरे step पर 10,000-token सीमा टूटती है, और `reason()` कारण बताता है।

```python
class Budget:
    def __init__(self, max_steps, max_tokens):
        self.max_steps, self.max_tokens = max_steps, max_tokens
        self.steps = self.tokens = 0

    def charge(self, tokens):
        self.steps += 1
        self.tokens += tokens

    def reason(self):
        if self.steps >= self.max_steps: return "step limit"
        if self.tokens >= self.max_tokens: return "token budget"
        return None

b = Budget(5, 10_000)
for used in (3000, 4000, 4000):
    b.charge(used)
    print(b.steps, b.tokens, b.reason())
```

Output:

```
1 3000 None
2 7000 None
3 11000 token budget
```

## सिर्फ़ boolean नहीं, कारण लौटाएँ

Log में "रुका" बेकार है। "रुका: step 3 पर token budget" बताता है कि क्या ठीक करना है। हर stop के साथ कारण का string रखें।

**Quiz:** सीमाएँ एक Budget object में क्यों रखें?

- [x] बिखरी जाँचें भूलना या असंगत लगाना आसान है
- [ ] Python में classes ज़रूरी हैं
- [ ] यह model को ज़्यादा बुद्धिमान बनाता है
- [ ] यह tests की ज़रूरत ख़त्म करता है

*Answer:* बिखरी जाँचें भूलना या असंगत लगाना आसान है. सीमाओं का एक मालिक जाँचों को एक-सा रखता है और रुकने का कारण बताना आसान करता है।
