Pydantic, Zod या Effect स्कीमा के साथ टाइप-सुरक्षित JSON प्रतिक्रियाएँ
LLM टेक्स्ट जनरेट करते हैं। एप्लिकेशन को डेटा स्ट्रक्चर चाहिए। संरचित आउटपुट इस अंतर को पाटते हैं—आप एक स्कीमा परिभाषित करते हैं (Python में Pydantic, TypeScript में Zod या Effect Schema), और Dedalus SDK यह सुनिश्चित करता है कि प्रतिक्रियाएँ पूर्ण टाइप सेफ्टी के साथ उस स्कीमा के अनुरूप हों।विश्वसनीय एप्लिकेशन बनाने के लिए यह अत्यंत महत्वपूर्ण है। फ्री-फॉर्म टेक्स्ट को पार्स करके सब ठीक रहने की उम्मीद करने के बजाय, आपको वैलिडेटेड ऑब्जेक्ट्स मिलते हैं जिन पर आपका कोड भरोसा कर सकता है।
इसे तब उपयोग करें जब आपको स्ट्रीमिंग UX और एक टाइप‑सेफ अंतिम परिणाम चाहिए।
स्ट्रीमिंग हेल्पर्स भाषा के अनुसार अलग होते हैं:
Python: .stream(...) को context manager के रूप में उपयोग करें और टाइप‑सेफ स्ट्रीम इवेंट पढ़ें।
TypeScript: create({ stream: true, ... }) से tokens स्ट्रीम करें, फिर अंतिम JSON को Zod/Effect से validate करें।
गलत कोड की रिपोर्ट करें
कॉपी करें
AI से पूछें
import asynciofrom dedalus_labs import AsyncDedalusfrom dotenv import load_dotenvfrom pydantic import BaseModelload_dotenv()class Event(BaseModel): name: str city: str date: strclass 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())
import asynciofrom dedalus_labs import AsyncDedalusfrom dotenv import load_dotenvfrom pydantic import BaseModelload_dotenv()class Venue(BaseModel): name: str address: str | None = None city: strclass Event(BaseModel): name: str date: str venue: Venueclass 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)
स्वचालित आर्ग्युमेंट पार्सिंग के साथ प्रकार‑सुरक्षित टूल्स परिभाषित करें:
गलत कोड की रिपोर्ट करें
कॉपी करें
AI से पूछें
import asynciofrom dedalus_labs import AsyncDedalusfrom dotenv import load_dotenvfrom pydantic import BaseModelload_dotenv()class SearchEventsArgs(BaseModel): city: str month: str max_results: int = 5async 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 विफल हो जाएगा।
TypeScript: Effect Schema के साथ tool parameters
गलत कोड की रिपोर्ट करें
कॉपी करें
AI से पूछें
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({ ... }) का उपयोग करें)।
DedalusRunner API (एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस)
Runner response_format को स्वचालित schema conversion के साथ सपोर्ट करता है:
गलत कोड की रिपोर्ट करें
कॉपी करें
AI से पूछें
import asynciofrom dedalus_labs import AsyncDedalus, DedalusRunnerfrom dotenv import load_dotenvfrom pydantic import BaseModelload_dotenv()class Event(BaseModel): name: str city: str date: strclass 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())
Dedalus SDK की .parse() और .stream() मेथड्स सभी प्रोवाइडर्स के साथ काम करती हैं। स्कीमा प्रवर्तन में भिन्नता हो सकती है:सख्त प्रवर्तन (CFG‑आधारित, स्कीमा की गारंटी):
आप .parse() और .stream() को किसी भी प्रदाता के models के साथ उपयोग कर सकते हैं। व्यवहार में, आपको केवल model बदलना होता है—बाकी सब वैसा ही रहता है।model id की पूरी सूची के लिए providers guide देखें।
import { effectResponseFormat, effectFunction } from 'dedalus-labs/helpers/effect';// For response schemaseffectResponseFormat(MyEffectSchema, 'schema_name')// For tool definitionseffectFunction({ name: 'tool_name', description: 'What the tool does', parameters: MyEffectParametersSchema, function: (args) => { ... },})
@effect/schema का उपयोग करना (अपस्ट्रीम में अप्रचलित घोषित)
यदि आप अभी भी @effect/schema का उपयोग करते हैं, तो @effect/schema/Schema के स्कीमा भी helpers/effect के साथ काम करते हैं।आपको फिर भी effect इंस्टॉल करना होगा (Dedalus SDK रूपांतरण और वैलिडेशन के लिए effect/JSONSchema और effect/Schema का उपयोग करता है)।नए कोड के लिए effect/Schema को प्राथमिकता दें।