मुख्य सामग्री पर जाएं
LLM टेक्स्ट जनरेट करते हैं। एप्लिकेशन को डेटा स्ट्रक्चर चाहिए। संरचित आउटपुट इस अंतर को पाटते हैं—आप एक स्कीमा परिभाषित करते हैं (Python में Pydantic, TypeScript में Zod या Effect Schema), और Dedalus SDK यह सुनिश्चित करता है कि प्रतिक्रियाएँ पूर्ण टाइप सेफ्टी के साथ उस स्कीमा के अनुरूप हों। विश्वसनीय एप्लिकेशन बनाने के लिए यह अत्यंत महत्वपूर्ण है। फ्री-फॉर्म टेक्स्ट को पार्स करके सब ठीक रहने की उम्मीद करने के बजाय, आपको वैलिडेटेड ऑब्जेक्ट्स मिलते हैं जिन पर आपका कोड भरोसा कर सकता है।

टाइप किए गए डेटा को निकालें

एक स्कीमा परिभाषित करें। .parse() कॉल करें। वैलिडेटेड ऑब्जेक्ट्स प्राप्त करें।
import asyncio
from dedalus_labs import AsyncDedalus
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class Event(BaseModel):
    name: str
    city: str
    date: str

class EventsResponse(BaseModel):
    query: str
    events: list[Event]

async def main():
    client = AsyncDedalus()

    completion = await client.chat.completions.parse(
        model="openai/gpt-5.2",
        messages=[{
            "role": "user",
            "content": "Return 3 upcoming basketball events near San Francisco as JSON.",
        }],
        response_format=EventsResponse,
    )

    parsed: EventsResponse = completion.choices[0].message.parsed
    print(parsed)

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

उन्नत

यह सेक्शन एक संदर्भ है जिसे आप सरसरी तौर पर पढ़ सकते हैं और ज़रूरत पड़ने पर वापस आ सकते हैं। इसे क्रमिक प्रगति के रूप में व्यवस्थित किया गया है:
  1. Client .parse() (नॉन-स्ट्रीमिंग, टाइप्ड आउटपुट)
  2. Client .stream() (स्ट्रीमिंग, टाइप्ड आउटपुट)
  3. Runner response_format (एजेंट/tool लूप के अंदर टाइप्ड आउटपुट)
  4. Schemas और patterns (ऑप्शनल फ़ील्ड्स, नेस्टेड मॉडल्स, enums/unions)
  5. Structured tool calls (जब आपको डिटरमिनिस्टिक टूल कॉलिंग की आवश्यकता हो)

Client API (संदर्भ)

Client संरचित आउटपुट के लिए तीन मेथड प्रदान करता है:
  • .parse() - टाइप‑सेफ स्कीमा के साथ नॉन‑स्ट्रीमिंग
  • .stream() - टाइप‑सेफ स्कीमा के साथ स्ट्रीमिंग (context manager)
  • .create() - केवल dict‑आधारित स्कीमा

TypeScript सेटअप

TypeScript schema helpers वैकल्पिक peer dependencies के रूप में उपलब्ध हैं। जिस validator का आप उपयोग करना चाहते हैं, उसे इंस्टॉल करें:
bun install zod
# या
bun install effect

.parse() (नॉन‑स्ट्रीमिंग)

यह ऊपर दिए गए क्रमिक उदाहरण के समान ही पैटर्न है; यहाँ इसे सिर्फ अधिक “API (एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस) संदर्भ” शैली में दोबारा दिखाया गया है।
import asyncio
from dedalus_labs import AsyncDedalus
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class Event(BaseModel):
    name: str
    city: str
    date: str

class EventsResponse(BaseModel):
    query: str
    events: list[Event]

async def main():
    client = AsyncDedalus()

    completion = await client.chat.completions.parse(
        model="openai/gpt-5.2",
        messages=[
            {
                "role": "user",
                "content": (
                    "Return 3 upcoming basketball events near San Francisco as JSON. "
                    "Use ISO dates (YYYY-MM-DD)."
                ),
            }
        ],
        response_format=EventsResponse,
        mcp_servers=["windsor/ticketmaster-mcp"],  # Ticketmaster के माध्यम से इवेंट खोजें
    )

    parsed = completion.choices[0].message.parsed
    print(parsed)

if __name__ == "__main__":
    asyncio.run(main())
import Dedalus from 'dedalus-labs';
import { effectResponseFormat } from 'dedalus-labs/helpers/effect';
import * as Schema from 'effect/Schema';

const client = new Dedalus();

const Event = Schema.Struct({
  name: Schema.String,
  city: Schema.String,
  date: Schema.String,
});

async function main() {
  const completion = await client.chat.completions.parse({
    model: 'openai/gpt-5.2',
    messages: [
      {
        role: 'user',
        content:
          'Return 3 upcoming basketball events near San Francisco as JSON. Use ISO dates (YYYY-MM-DD).',
      },
    ],
    response_format: effectResponseFormat(
      Schema.Struct({ query: Schema.String, events: Schema.Array(Event) }),
      'events_response',
    ),
    mcpServers: ['windsor/ticketmaster-mcp'],
  });

  console.log(completion.choices[0]?.message.parsed);
}

main();

.stream() (स्ट्रीमिंग)

इसे तब उपयोग करें जब आपको स्ट्रीमिंग UX और एक टाइप‑सेफ अंतिम परिणाम चाहिए।
स्ट्रीमिंग हेल्पर्स भाषा के अनुसार अलग होते हैं:
  • Python: .stream(...) को context manager के रूप में उपयोग करें और टाइप‑सेफ स्ट्रीम इवेंट पढ़ें।
  • TypeScript: create({ stream: true, ... }) से tokens स्ट्रीम करें, फिर अंतिम JSON को Zod/Effect से validate करें।
import asyncio
from dedalus_labs import AsyncDedalus
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class Event(BaseModel):
    name: str
    city: str
    date: str

class EventsResponse(BaseModel):
    query: str
    events: list[Event]

async def main():
    client = AsyncDedalus()

    # स्ट्रीमिंग के लिए context manager का उपयोग करें
    async with client.chat.completions.stream(
        model="openai/gpt-5.2",
        messages=[{
            "role": "user",
            "content": (
                "Return 3 upcoming basketball events near San Francisco as JSON. "
                "Use ISO dates (YYYY-MM-DD)."
            ),
        }],
        response_format=EventsResponse,
        mcp_servers=["windsor/ticketmaster-mcp"],
    ) as stream:
        # इवेंट्स को आते ही प्रोसेस करें
        async for event in stream:
            if event.type == "content.delta":
                print(event.delta, end="", flush=True)
            elif event.type == "content.done":
                # content.done पर स्नैपशॉट उपलब्ध होता है (typed)
                print(f"\nParsed events: {len(event.parsed.events)}")

        # अंतिम पार्स किया हुआ परिणाम प्राप्त करें
        final = await stream.get_final_completion()
        parsed = final.choices[0].message.parsed
        print(f"\nFinal events: {len(parsed.events)}")

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

वैकल्पिक फ़ील्ड

Python में Optional[T], Zod में .nullable(), या Effect में nullable फ़ील्ड के लिए Schema.NullOr(...) का उपयोग करें:
OpenAI strict मोड में हर फ़ील्ड अनिवार्य (required) होना चाहिए। model के “optional” मानों को nullable के रूप में मॉडल करें।
import asyncio
from dedalus_labs import AsyncDedalus
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class Event(BaseModel):
    name: str
    city: str
    date: str
    price_usd: int | None = None  # model unknown as null

class EventsResponse(BaseModel):
    query: str
    events: list[Event]

async def main():
    client = AsyncDedalus()

    completion = await client.chat.completions.parse(
        model="openai/gpt-5.2",
        messages=[{
            "role": "user",
            "content": (
                "Return 3 upcoming basketball events near San Francisco as JSON. "
                "Include price_usd if known; otherwise null. Use ISO dates (YYYY-MM-DD)."
            ),
        }],
        response_format=EventsResponse,
        mcp_servers=["windsor/ticketmaster-mcp"],
    )

    parsed = completion.choices[0].message.parsed
    for e in parsed.events:
        print(e.name, e.price_usd)

if __name__ == "__main__":
    asyncio.run(main())
import * as Schema from 'effect/Schema';

const Event = Schema.Struct({
  name: Schema.String,
  city: Schema.String,
  date: Schema.String,
  price_usd: Schema.NullOr(Schema.Number),
});

const EventsResponse = Schema.Struct({
  query: Schema.String,
  events: Schema.Array(Event),
});
संरचित आउटपुट के लिए Schema.optional(...) से बचें — इसके बजाय Schema.NullOr(...) का उपयोग करें।

स्कीमा और पैटर्न

नेस्टेड मॉडल्स

import asyncio
from dedalus_labs import AsyncDedalus
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class Venue(BaseModel):
    name: str
    address: str | None = None
    city: str

class Event(BaseModel):
    name: str
    date: str
    venue: Venue

class EventsResponse(BaseModel):
    query: str
    events: list[Event]

async def main():
    client = AsyncDedalus()

    completion = await client.chat.completions.parse(
        model="openai/gpt-5.2",
        messages=[{
            "role": "user",
            "content": (
                "सैन फ्रांसिस्को के पास होने वाले 3 आगामी बास्केटबॉल इवेंट्स को JSON के रूप में लौटाएँ। "
                "हर इवेंट में name, city और address (अज्ञात होने पर null) फ़ील्ड्स वाला एक nested venue object ज़रूर शामिल हो। "
                "तारीखों के लिए ISO फ़ॉर्मेट (YYYY-MM-DD) का उपयोग करें।"
            )
        }],
        response_format=EventsResponse,
        mcp_servers=["windsor/ticketmaster-mcp"],
    )

    parsed = completion.choices[0].message.parsed
    for e in parsed.events:
        print(e.name, "→", e.venue.name)

Structured Tool Calls (उन्नत)

स्वचालित आर्ग्युमेंट पार्सिंग के साथ प्रकार‑सुरक्षित टूल्स परिभाषित करें:
import asyncio
from dedalus_labs import AsyncDedalus
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class SearchEventsArgs(BaseModel):
    city: str
    month: str
    max_results: int = 5

async def main():
    client = AsyncDedalus()

    tools = [
        {
            "type": "function",
            "function": {
                "name": "search_events",
                "description": "Search for events in a city during a month.",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "city": {"type": "string"},
                        "month": {"type": "string", "description": "YYYY-MM"},
                        "max_results": {"type": "integer", "default": 5},
                    },
                    "required": ["city", "month"],
                    "additionalProperties": False,
                },
                "strict": True,
            }
        }
    ]

    completion = await client.chat.completions.parse(
        model="openai/gpt-5.2",
        messages=[{
            "role": "user",
            "content": "Call search_events for San Francisco in 2026-01.",
        }],
        tools=tools,
        tool_choice={"type": "tool", "name": "search_events"},
    )

    message = completion.choices[0].message
    if message.tool_calls:
        tool_call = message.tool_calls[0]
        print(f"Tool called: {tool_call.function.name}")
        print(f"Parsed args: {tool_call.function.parsed_arguments}")

if __name__ == "__main__":
    asyncio.run(main())
यदि आपको नियत (deterministic) टूल कॉलिंग की आवश्यकता हो, तो tool_choice को निम्न में से किसी एक ऑब्जेक्ट वैरिएंट पर सेट करें: { type: 'auto' } (model तय करेगा), { type: 'any' } (tool call अनिवार्य), { type: 'tool', name: 'search_events' } (किसी विशिष्ट tool की आवश्यकता), { type: 'none' } (टूल्स निष्क्रिय)। OpenAI string रूप (जैसे tool_choice: 'required') पास करने पर 422 के साथ schema validation विफल हो जाएगा।
import { effectFunction } from 'dedalus-labs/helpers/effect';
import * as Schema from 'effect/Schema';

const SearchEventsTool = effectFunction({
  name: 'search_events',
  parameters: Schema.Struct({
    city: Schema.String,
    month: Schema.String, // YYYY-MM
    max_results: Schema.NullOr(Schema.Number),
  }),
  description: 'Search for events in a city during a month.',
});
Tool parameters एक object schema होना चाहिए (इसके लिए Schema.Struct({ ... }) का उपयोग करें)।

Enums और Unions

import asyncio
from typing import Literal
from dedalus_labs import AsyncDedalus
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class Event(BaseModel):
    name: str
    city: str
    date: str
    category: Literal["sports", "music", "theater", "other"]
    ticket_status: Literal["available", "sold_out", "unknown"]

class EventsResponse(BaseModel):
    query: str
    events: list[Event]

async def main():
    client = AsyncDedalus()

    completion = await client.chat.completions.parse(
        model="openai/gpt-5.2",
        messages=[{
            "role": "user",
            "content": (
                "San Francisco के पास होने वाले 3 आगामी इवेंट्स को JSON के रूप में लौटाएँ। "
                "प्रत्येक इवेंट में category (sports/music/theater/other) और ticket_status (available/sold_out/unknown) शामिल होना चाहिए। "
                "ISO तारीख़ फ़ॉर्मेट (YYYY-MM-DD) का उपयोग करें।"
            )
        }],
        response_format=EventsResponse,
        mcp_servers=["windsor/ticketmaster-mcp"],
    )

    parsed = completion.choices[0].message.parsed
    for e in parsed.events:
        print(e.name, e.category, e.ticket_status)

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

DedalusRunner API (एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस)

Runner response_format को स्वचालित schema conversion के साथ सपोर्ट करता है:
import asyncio

from dedalus_labs import AsyncDedalus, DedalusRunner
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class Event(BaseModel):
    name: str
    city: str
    date: str

class EventsResponse(BaseModel):
    query: str
    events: list[Event]

def as_bullets(items: list[str]) -> str:
    """आइटमों को बुलेटेड सूची के रूप में फ़ॉर्मैट करें।"""
    return "\n".join(f"• {item}" for item in items)

async def main():
    client = AsyncDedalus()
    runner = DedalusRunner(client)

    result = await runner.run(
        input=(
            "Ticketmaster का उपयोग करके जनवरी में San Francisco में मेरे लिए सबसे नज़दीकी बास्केटबॉल गेम ढूँढें। "
            "फिर as_bullets को आइटमों की एक सूची के साथ कॉल करें (प्रति इवेंट एक: नाम, शहर, दिनांक)।"
        ),
        model="anthropic/claude-opus-4-5",
        mcp_servers=["windsor/ticketmaster-mcp"],  # Ticketmaster के माध्यम से इवेंट खोजें
        tools=[as_bullets],
        response_format=EventsResponse,
        max_steps=5,
    )

    print(result.final_output)

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

.create() बनाम .parse() बनाम .stream()

Methodस्कीमा समर्थनस्ट्रीमिंगउपयोग परिदृश्य
.create()केवल Dictमैनुअल JSON स्कीमा
.parse()Pydantic/Zod/Effectटाइप‑सेफ नॉन‑स्ट्रीमिंग
.stream()Pydantic/Zod/Effectटाइप‑सेफ स्ट्रीमिंग
.create() एक साधारण JSON Schema ऑब्जेक्ट की अपेक्षा करता है। कोई भी Pydantic model, Zod schema, या Effect schema सीधे पास न करें।
“स्ट्रीमिंग + typed output” भाषा‑निर्भर है:
  • Python: .stream(...) typed events और एक typed अंतिम snapshot रिटर्न करता है।
  • TypeScript: tokens को स्ट्रीम करें और अंतिम JSON को Zod/Effect के साथ validate करें।

त्रुटि प्रबंधन

import asyncio
from typing import Any
from dedalus_labs import AsyncDedalus
from dotenv import load_dotenv
from pydantic import BaseModel

load_dotenv()

class Event(BaseModel):
    name: str
    city: str
    date: str

class EventsResponse(BaseModel):
    query: str
    events: list[Event]

async def main():
    client = AsyncDedalus()

    try:
        completion = await client.chat.completions.parse(
            model="openai/gpt-5.2",
            messages=[{
                "role": "user",
                "content": (
                    "Return 3 upcoming basketball events near San Francisco as JSON. "
                    "Use ISO dates (YYYY-MM-DD)."
                ),
            }],
            response_format=EventsResponse,
        )
        parsed = completion.choices[0].message.parsed
        print(f"Parsed events: {len(parsed.events)}")
    except Exception as e:
        print("Parse failed:", e)

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

समर्थित मॉडल

Dedalus SDK की .parse() और .stream() मेथड्स सभी प्रोवाइडर्स के साथ काम करती हैं। स्कीमा प्रवर्तन में भिन्नता हो सकती है: सख्त प्रवर्तन (CFG‑आधारित, स्कीमा की गारंटी):
  • openai/* - कॉन्टेक्स्ट‑फ्री ग्रामर कंपाइलेशन
  • xai/* - नैटिव स्कीमा वेलिडेशन
  • fireworks_ai/* - नैटिव स्कीमा वेलिडेशन (चयनित मॉडल)
  • deepseek/* - नैटिव स्कीमा वेलिडेशन (चयनित मॉडल)
सर्वोत्तम प्रयास (स्कीमा केवल मार्गदर्शन के लिए भेजा जाता है, कोई गारंटी नहीं):
  • 🟡 google/* - स्कीमा generationConfig.responseSchema तक अग्रेषित
  • 🟡 anthropic/* - prompt‑आधारित JSON जेनरेशन (~85–90% सफलता दर)
google/* और anthropic/* मॉडल के लिए हमेशा पार्स किए गए आउटपुट को वेलिडेट करें और retry logic लागू करें।

प्रदाता उदाहरण

आप .parse() और .stream() को किसी भी प्रदाता के models के साथ उपयोग कर सकते हैं। व्यवहार में, आपको केवल model बदलना होता है—बाकी सब वैसा ही रहता है। model id की पूरी सूची के लिए providers guide देखें।

त्वरित संदर्भ

Python (Pydantic)

from dedalus_labs import AsyncDedalus
from pydantic import BaseModel

class MyModel(BaseModel):
    field: str

client = AsyncDedalus()
result = await client.chat.completions.parse(
    model="openai/gpt-5.2",
    messages=[...],
    response_format=MyModel,
)
parsed = result.choices[0].message.parsed

TypeScript (Zod)

import Dedalus from 'dedalus-labs';
import { zodResponseFormat } from 'dedalus-labs/helpers/zod';
import { z } from 'zod';

const MySchema = z.object({ field: z.string() });

const client = new Dedalus();
const result = await client.chat.completions.parse({
  model: 'openai/gpt-5.2',
  messages: [...],
  response_format: zodResponseFormat(MySchema, 'my_schema'),
});
const parsed = result.choices[0]?.message.parsed;

TypeScript (Effect Schema)

import Dedalus from 'dedalus-labs';
import { effectResponseFormat } from 'dedalus-labs/helpers/effect';
import * as Schema from 'effect/Schema';

const MySchema = Schema.Struct({ field: Schema.String });

const client = new Dedalus();
const result = await client.chat.completions.parse({
  model: 'openai/gpt-5.2',
  messages: [...],
  response_format: effectResponseFormat(MySchema, 'my_schema'),
});
const parsed = result.choices[0]?.message.parsed;

Zod हेल्पर्स

import { zodResponseFormat, zodFunction } from 'dedalus-labs/helpers/zod';

// For response schemas
zodResponseFormat(MyZodSchema, 'schema_name')

// For tool definitions
zodFunction({
  name: 'tool_name',
  description: 'यह tool क्या करता है',
  parameters: z.object({ ... }),
  function: (args) => { ... },
})

इफ़ेक्ट हेल्पर्स

import { effectResponseFormat, effectFunction } from 'dedalus-labs/helpers/effect';

// For response schemas
effectResponseFormat(MyEffectSchema, 'schema_name')

// For tool definitions
effectFunction({
  name: 'tool_name',
  description: 'What the tool does',
  parameters: MyEffectParametersSchema,
  function: (args) => { ... },
})
यदि आप अभी भी @effect/schema का उपयोग करते हैं, तो @effect/schema/Schema के स्कीमा भी helpers/effect के साथ काम करते हैं।आपको फिर भी effect इंस्टॉल करना होगा (Dedalus SDK रूपांतरण और वैलिडेशन के लिए effect/JSONSchema और effect/Schema का उपयोग करता है)।नए कोड के लिए effect/Schema को प्राथमिकता दें।

अगले चरण

  • स्ट्रीम आउटपुट: स्ट्रीमिंग — लंबे समय तक चलने वाले tool/MCP रन के लिए उपयोगकर्ता अनुभव (UX) बेहतर करें
  • मॉडलों के बीच रूट करें: Handoffs — प्रत्येक चरण के लिए तेज़/शक्तिशाली मॉडल का उपयोग करें
  • पैटर्न देखें: Use Cases — संरचित डेटा‑एक्सट्रैक्शन वर्कफ़्लो
इन डॉक्यूमेंट्स को प्रोग्रामैटिक रूप से कनेक्ट करें Claude, VSCode और अन्य टूल्स से मॉडल कॉन्टेक्स्ट प्रोटोकॉल (MCP) के माध्यम से रीयल‑टाइम जवाबों के लिए।