मुख्य सामग्री पर जाएं
ऐसे संवादी एजेंट बनाएँ जो संदेशों के बीच संदर्भ को याद रखें। यह पैटर्न वार्तालाप इतिहास को JSON में सहेजता है, जिससे चैटबॉट्स, असिस्टेंट्स और किसी भी मल्टी‑टर्न इंटरैक्शन के लिए संदर्भ‑सचेत बातचीत संभव हो जाती है।

यह कैसे काम करता है

Dedalus SDK का runner.run() एक सिंगल input स्ट्रिंग के बजाय messages ऐरे लेता है। हर कॉल से पहले इतिहास लोड करके और बाद में सेव करके, आपको स्थायी (persistent) बातचीत मिलती है:
  1. स्टोरेज से बातचीत का इतिहास लोड करें
  2. नया उपयोगकर्ता संदेश जोड़ें
  3. पूरी हिस्ट्री के साथ model को रन करें
  4. result.to_input_list() का उपयोग करके अपडेटेड इतिहास को सेव करें

मुख्य अवधारणाएँ

संदेश प्रारूप

Dedalus SDK OpenAI के संदेश प्रारूप का उपयोग करता है:
[
    {"role": "user", "content": "Hello"},
    {"role": "assistant", "content": "Hi! How can I help?"},
    {"role": "user", "content": "What did I just say?"},
]

to_input_list() के साथ स्थायित्व

हर runner.run() के बाद, पूरी conversation history (जिसमें tool calls और assistant responses शामिल हों) प्राप्त करने के लिए result.to_input_list() कॉल करें। इससे अगले turn के लिए पूरा context सुरक्षित रहता है।

सत्र पृथक्करण

प्रत्येक session ID एक अलग बातचीत से संबद्ध होता है। उपयोगकर्ता प्रसंग खोए बिना सत्रों के बीच स्विच कर सकते हैं।

पूर्ण उदाहरण

एक इंटरैक्टिव CLI जो मॉडल स्विचिंग और MCP सर्वर समर्थन के साथ सत्र प्रबंधन को प्रदर्शित करता है:
import asyncio
import json
from pathlib import Path

from dotenv import load_dotenv
from dedalus_labs import AsyncDedalus, DedalusRunner

load_dotenv()

SESSIONS_FILE = Path(__file__).parent / "sessions.json"

MODELS = [
    "openai/gpt-5.1",
    "anthropic/claude-opus-4-5-20251101",
    "google/gemini-3-pro-preview",
]


def load_sessions() -> dict:
    if SESSIONS_FILE.exists():
        return json.loads(SESSIONS_FILE.read_text())
    return {}


def save_sessions(sessions: dict):
    SESSIONS_FILE.write_text(json.dumps(sessions, indent=2))


def get_session(session_id: str) -> list[dict]:
    sessions = load_sessions()
    return sessions.get(session_id, [])


def save_session(session_id: str, messages: list[dict]):
    sessions = load_sessions()
    sessions[session_id] = messages
    save_sessions(sessions)


async def chat(
    session_id: str,
    user_input: str,
    model: str,
    mcp_servers: list[str] | None = None,
) -> str:
    client = AsyncDedalus()
    runner = DedalusRunner(client)

    history = get_session(session_id)

    # Append user message to history (runner ignores `input` when `messages` is passed)
    history.append({"role": "user", "content": user_input})

    kwargs = {
        "messages": history,
        "model": model,
    }
    if mcp_servers:
        kwargs["mcp_servers"] = mcp_servers

    result = await runner.run(**kwargs)
    save_session(session_id, result.to_input_list())

    return result.final_output


async def demo():
    print("=" * 60)
    print("  Dedalus Session Management Demo")
    print("=" * 60)
    print("\nकमांड:")
    print("  /new <name>   - नया सेशन शुरू करें")
    print("  /list         - सेशन की सूची देखें")
    print("  /load <name>  - सेशन लोड करें")
    print("  /clear        - मौजूदा सेशन साफ़ करें")
    print("  /model        - उपलब्ध मॉडल की सूची देखें")
    print("  /model <num>  - मॉडल स्विच करें")
    print("  /mcp <url>    - MCP सर्वर जोड़ें")
    print("  /mcp clear    - MCP सर्वर साफ़ करें")
    print("  /mcp          - सक्रिय MCP सर्वर की सूची देखें")
    print("  /status       - मौजूदा कॉन्फ़िगरेशन दिखाएं")
    print("  /quit         - बाहर निकलें")
    print()

    current_session = "default"
    current_model = MODELS[0]
    mcp_servers: list[str] = []

    print(f"Session: {current_session}")
    print(f"Model: {current_model}")
    print()

    while True:
        try:
            user_input = input(f"[{current_session}] You: ").strip()
        except (EOFError, KeyboardInterrupt):
            print("\nGoodbye!")
            break

        if not user_input:
            continue

        if user_input.startswith("/"):
            parts = user_input.split(maxsplit=1)
            cmd = parts[0].lower()
            arg = parts[1].strip() if len(parts) > 1 else ""

            if cmd == "/quit":
                print("Goodbye!")
                break

            elif cmd == "/new":
                current_session = arg or "default"
                save_session(current_session, [])
                print(f"Started new session: {current_session}")

            elif cmd == "/list":
                sessions = load_sessions()
                print(f"Sessions: {list(sessions.keys()) or ['(none)']}")

            elif cmd == "/load":
                current_session = arg or "default"
                history = get_session(current_session)
                print(f"Loaded session: {current_session} ({len(history)} messages)")

            elif cmd == "/clear":
                save_session(current_session, [])
                print(f"Cleared session: {current_session}")

            elif cmd == "/model":
                if not arg:
                    print("Available models:")
                    for i, m in enumerate(MODELS, 1):
                        marker = "*" if m == current_model else " "
                        print(f"  {marker} {i}. {m}")
                elif arg.isdigit() and 1 <= int(arg) <= len(MODELS):
                    current_model = MODELS[int(arg) - 1]
                    print(f"Switched to: {current_model}")
                else:
                    current_model = arg
                    print(f"Switched to: {current_model}")

            elif cmd == "/mcp":
                if not arg:
                    print(f"Active MCP servers: {mcp_servers or 'None'}")
                elif arg == "clear":
                    mcp_servers = []
                    print("Cleared MCP servers")
                else:
                    mcp_servers.append(arg)
                    print(f"Added MCP server: {arg}")

            elif cmd == "/status":
                print(f"Session: {current_session}")
                print(f"Model: {current_model}")
                print(f"MCP Servers: {mcp_servers or 'None'}")
                history = get_session(current_session)
                print(f"Messages: {len(history)}")

            else:
                print(f"Unknown command: {cmd}")

            continue

        print("Assistant: ", end="", flush=True)
        response = await chat(
            current_session,
            user_input,
            model=current_model,
            mcp_servers=mcp_servers if mcp_servers else None,
        )
        print(response)
        print()


if __name__ == "__main__":
    asyncio.run(demo())

स्टोरेज विकल्प

JSON फ़ाइल वाला तरीका प्रोटोटाइपिंग के लिए ठीक है। प्रोडक्शन के लिए:
स्टोरेजउपयोग परिदृश्य
JSON fileलोकल विकास, एकल उपयोगकर्ता
SQLiteलोकल ऐप्स, मध्यम स्केल
Redisउच्च प्रदर्शन, वितरित
PostgreSQLप्रोडक्शन, JSONB कॉलम के साथ

यह क्यों काम करता है

Dedalus SDK टूल कॉल्स, model रिस्पॉन्सेज़ और संदेश फ़ॉर्मैटिंग की जटिलता को संभालता है। आपका काम सिर्फ़ मैसेज ऐरे को स्टोर और लोड करना है। यह पैटर्न CLI टूल्स से लेकर प्रोडक्शन चैटबॉट्स तक आसानी से स्केल हो जाता है।
इन डॉक्यूमेंट्स को प्रोग्रामैटिक रूप से कनेक्ट करें Claude, VSCode और अन्य से मॉडल कॉन्टेक्स्ट प्रोटोकॉल (MCP) के ज़रिए रियल‑टाइम जवाबों के लिए।