# भूमिकाएँ, System Prompts और बातचीत का इतिहास — Claude API / OpenAI API की बुनियाद

Source: https://www.geekswithgeeks.com/hi/llm-apis/m-roles

> बहु-turn बातचीत सही बनाएँ।

## हर बार पूरा इतिहास भेजें

Messages **user** और **assistant** के बीच बारी-बारी आते हैं; **system prompt** स्थायी निर्देश (भूमिका, नियम, format) तय करता है। बातचीत जारी रखने के लिए assistant का उत्तर और अगला user संदेश अपनी सूची में जोड़ें और **पूरी सूची** फिर भेजें। इसका अर्थ है कि लागत और latency लंबाई के साथ बढ़ती है, और सूची **context window** पार कर सकती है। उसे सोच-समझकर सँभालें: system prompt रखें, नवीनतम turns रखें, पुराने का **सार करें** या हटाएँ, और audit के लिए पूरा log अलग रखें। जहाँ संभव हो user-दिया पाठ system prompt से बाहर रखें, और किसी भी prompt में secrets कभी न रखें।

## System prompt कहाँ जाता है, चलाकर

मैंने यह Python virtual environment में anthropic 1.11.0 और openai 3.22.1 SDKs के साथ छोटे स्थानीय stand-in server (testing विषय में दिखाया, `mock.py` नाम से सहेजा) के विरुद्ध चलाया। Server तैयार उत्तर लौटाता है, इसलिए कोई key, network या असली मॉडल शामिल नहीं: यह साबित करता है कि SDK requests कैसे बनाता और उत्तर कैसे सँभालता है, यह नहीं कि असली मॉडल क्या कहता। वही निर्देश दो तरह से भेजा गया। Anthropic उसे शीर्ष-स्तर `system` field में पाता है; OpenAI उसे `system` भूमिका वाले पहले message के रूप में।

```python
import mock, anthropic, openai
srv = mock.start(); base = f"http://127.0.0.1:{srv.server_address[1]}"      # local stand-in server, not a real API

a = anthropic.Anthropic(api_key="k", base_url=base)
a.messages.create(model="demo-model", max_tokens=50, system="You are a terse assistant.",
                  messages=[{"role": "user", "content": "Hi"}])
print("anthropic body:", mock.STATE["log"][-1]["body"])

o = openai.OpenAI(api_key="k", base_url=base + "/v1")
o.chat.completions.create(model="demo-model", messages=[
    {"role": "system", "content": "You are a terse assistant."}, {"role": "user", "content": "Hi"}])
print("openai body:   ", mock.STATE["log"][-1]["body"])

```

Output:

```
anthropic body: {'max_tokens': 50, 'messages': [{'role': 'user', 'content': 'Hi'}], 'model': 'demo-model', 'system': 'You are a terse assistant.'}
openai body:    {'messages': [{'role': 'system', 'content': 'You are a terse assistant.'}, {'role': 'user', 'content': 'Hi'}], 'model': 'demo-model'}
```

## बजट में इतिहास trim करना, चलाकर

मैंने यह सादा-Python (सिर्फ़ standard library) उदाहरण चलाया। Function system message और 130 अक्षरों में समाने वाले नवीनतम turns रखता है: 9 messages 4 बन जाते हैं (system message और turns 6, 7, 8)। असली कोड अक्षरों की जगह provider के tokenizer से tokens गिनता।

```python
def trim(messages, max_chars):
    """Keep the system message, then the newest turns that fit."""
    system, rest = messages[0], messages[1:]
    kept, used = [], len(system["content"])
    for m in reversed(rest):
        used += len(m["content"])
        if used > max_chars: break
        kept.append(m)
    return [system] + list(reversed(kept))

chat = [{"role": "system", "content": "Be brief."}]
for i in range(1, 9):
    chat.append({"role": "user" if i % 2 else "assistant", "content": f"turn {i} " + "x" * 30})
short = trim(chat, 130)
print(len(chat), "messages ->", len(short))
print([" ".join(m["content"].split()[:2]) for m in short])

```

Output:

```
9 messages -> 4
['Be brief.', 'turn 6', 'turn 7', 'turn 8']
```

## पूरा log कहीं और रखें

मॉडल को trim इतिहास भेजें पर support और audits के लिए पूरी बातचीत अपने database में रखें।

**Quiz:** बातचीत जारी रखने के लिए क्या भेजना होगा?

- [ ] कुछ नहीं; server याद रखता है
- [ ] सिर्फ़ नवीनतम संदेश
- [ ] सिर्फ़ API key
- [x] प्रासंगिक इतिहास और नया संदेश

*Answer:* प्रासंगिक इतिहास और नया संदेश. API stateless है; संदर्भ वही है जो आप भेजें।
