{"id":500369,"date":"2026-10-26T17:18:26","date_gmt":"2026-10-26T14:18:26","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=500369"},"modified":"2026-10-26T17:18:26","modified_gmt":"2026-10-26T14:18:26","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=500369","title":{"rendered":"Pydantic AI: \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u043d\u0430 \u0441\u0432\u043e\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0423 \u0442\u0438\u043f\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 LLM-\u0430\u0433\u0435\u043d\u0442\u043e\u043c \u0441\u0443\u0434\u044c\u0431\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u043d\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u043e \u043c\u0438\u043b\u044b\u0435 \u0441\u043e\u0440\u043e\u043a \u0441\u0442\u0440\u043e\u043a: \u043f\u0440\u043e\u043c\u043f\u0442, \u0432\u044b\u0437\u043e\u0432 openai-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e API, json.loads \u2014 \u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u043d\u0435\u0434\u0435\u043b\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0434 JSON \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0434\u0443\u0445\u0435 \u00ab\u041a\u043e\u043d\u0435\u0447\u043d\u043e! \u0412\u043e\u0442 \u0432\u0430\u0448 \u043e\u0442\u0432\u0435\u0442:\u00bb, \u043e\u0434\u043d\u043e \u0438\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0442\u043e \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442, \u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u0412 \u043a\u043e\u0434 \u0432\u044a\u0435\u0437\u0436\u0430\u044e\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438, \u0440\u0443\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0415\u0449\u0451 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u0432\u044b \u0432\u043b\u0430\u0434\u0435\u0435\u0442\u0435 \u043a\u043e\u043c\u043e\u043c \u0441\u0432\u044f\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0423\u0432\u044b, \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0443\u0442 \u0447\u0430\u0449\u0435 \u043d\u0438 \u043f\u0440\u0438 \u0447\u0451\u043c. \u041b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u044b\u043a \u043c\u0435\u0436\u0434\u0443 \u0435\u0451 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u2014 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0435\u0442 \u043d\u0438 \u0442\u0438\u043f\u043e\u0432, \u043d\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430.<\/p>\n<p>Pydantic AI \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u0440\u0443\u0433\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0438\u043f\u043e\u0432. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Pydantic \u2014 \u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0432 FastAPI, OpenAI SDK \u0438 \u0435\u0449\u0451 \u0434\u043e\u0431\u0440\u043e\u0439 \u0434\u044e\u0436\u0438\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 pydantic-\u043c\u043e\u0434\u0435\u043b\u044c\u044e, \u0430 \u0437\u0430\u043c\u0435\u043d\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Ollama \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u0440\u0430\u0432\u043a\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u0422\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 README. \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u2014 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<hr\/>\n<p>\u0421\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e: <code>uv add pydantic-ai<\/code> \u0438\u043b\u0438 <code>pip install pydantic-ai<\/code> \u2014 \u043a\u0442\u043e \u043a\u0430\u043a \u043f\u0440\u0438\u0432\u044b\u043a. \u0412 v2 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b \u0434\u043e\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 extras, \u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439.<\/p>\n<pre><code class=\"python\">from pydantic_ai import Agentfrom pydantic_ai.models.openai import OpenAIChatModelfrom pydantic_ai.providers.openai import OpenAIProvider# 1. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0448\u043b\u044e\u0437\u0430provider = OpenAIProvider(    base_url='https:\/\/openai.bothub.chat\/v1',  # URL \u0432\u0430\u0448\u0435\u0433\u043e \u0448\u043b\u044e\u0437\u0430    api_key='your-api-token-here')# 2. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c, \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0438\u043c\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u0448\u043b\u044e\u0437\u0435model = OpenAIChatModel(    'gpt-6-luna',    provider=provider)# 3. \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0432 Agentagent = Agent(    model,    instructions='\u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.',)result = agent.run_sync('\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0430\u0441\u044c \u0444\u0440\u0430\u0437\u0430 hello world?')print(result.output)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043e\u0442\u0432\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a:<\/p>\n<pre><code>\u0424\u0440\u0430\u0437\u0430 \u00abhello, world\u00bb \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 \u043a\u043d\u0438\u0433\u0435 \u0411\u0440\u0430\u0439\u0430\u043d\u0430 \u041a\u0435\u0440\u043d\u0438\u0433\u0430\u043d\u0430 \u0438 \u0414\u0435\u043d\u043d\u0438\u0441\u0430 \u0420\u0438\u0442\u0447\u0438 \u00ab\u042f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f C\u00bb (1978) \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u2014 \u0434\u0435\u0432\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u043a, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u0431\u0440\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u2014 \u043e\u0431\u0432\u044f\u0437\u043a\u0430. <code>run_sync<\/code> \u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430\u0434 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u044f\u0434\u0440\u043e\u043c: \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0441\u0451 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043d\u0430 asyncio, \u043d\u043e \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 sync-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430 FastAPI \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>await agent.run(...)<\/code>. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u0414\u043b\u044f Python-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u0434\u043a\u0430\u044f \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430, \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.<\/p>\n<p>\u041a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0445\u043e\u0434\u0438\u0442 \u0432 \u043d\u0430\u0448 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0448\u043b\u044e\u0437. GPT-6-Luna \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u043d\u0430 <a href=\"https:\/\/bothub.chat\/\">BotHub<\/a>, \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u2014 <a href=\"https:\/\/bothub.chat\/models\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u044c\u043c\u0451\u0442\u0435 <a href=\"https:\/\/bothub.chat\/?invitedBy=zx7xIePYIOcWHhTfgg6-O\">\u0440\u0435\u0444\u0435\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443<\/a>, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 300.000 CAPS \u043d\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u2014 \u043d\u0430 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u0445\u0432\u0430\u0442\u0438\u0442 \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c. \u0422\u043e\u043a\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0434\u0432\u0430 \u043a\u043b\u0438\u043a\u0430: \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0435\u0441\u044c \u043d\u0430 BotHub, \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 <a href=\"https:\/\/bothub.chat\/ru\/profile\/for-developers\">\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/a> \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434.<\/p>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 OpenAI \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u0430\u0433\u0435\u043d\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439:<\/p>\n<pre><code class=\"python\">agent = Agent(    'openai:gpt-6.1-sol',    instructions='\u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.',)result = agent.run_sync('\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0430\u0441\u044c \u0444\u0440\u0430\u0437\u0430 hello world?')print(result.output)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u0437\u0430\u0434\u0430\u0451\u0442\u0435 OPENAI_API_KEY \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h3>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f LLM \u2014 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, JSON-\u0441\u0445\u0435\u043c\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c, \u0441\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0433\u0434\u0435-\u0442\u043e \u0442\u0440\u0435\u0442\u044c\u0438\u043c (<a href=\"https:\/\/ai.pydantic.dev\/tools\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>). \u0422\u0430\u043a\u0438\u0435 \u0441\u0445\u0435\u043c\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438, \u0436\u0438\u0432\u0443\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043a\u043e\u0434\u0430 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0437\u0430\u044e\u0442\u0441\u044f \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c. \u0412 Pydantic AI \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e: \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440, \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0430\u043c. \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 JSON-\u0441\u0445\u0435\u043c\u0443, docstring \u0443\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>\u0412\u043e\u0442 \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441 \u0434\u0432\u0443\u043c\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclassimport httpxfrom pydantic_ai import Agent, ModelRetry, RunContext@dataclassclass SupportDeps:    http: httpx.AsyncClient    api_base: strsupport = Agent(    'openai:gpt-6.1-sol',    deps_type=SupportDeps,    instructions='\u041f\u043e\u043c\u043e\u0433\u0430\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438.',)@support.toolasync def get_order(ctx: RunContext[SupportDeps], order_id: int) -&gt; dict:    \"\"\"\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443.\"\"\"    r = await ctx.deps.http.get(f'{ctx.deps.api_base}\/orders\/{order_id}')    r.raise_for_status()    return r.json()@support.tool_plaindef normalize_phone(raw: str) -&gt; str:    \"\"\"\u041f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043a \u0444\u043e\u0440\u043c\u0430\u0442\u0443 +7XXXXXXXXXX.\"\"\"    digits = ''.join(ch for ch in raw if ch.isdigit())    if len(digits) != 11:        raise ModelRetry('\u0412 \u043d\u043e\u043c\u0435\u0440\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c 11 \u0446\u0438\u0444\u0440. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437.')    return f'+7{digits[1:]}'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u0438\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0432\u044b: \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u0445\u0435\u043c\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0434\u0438\u0430\u043b\u043e\u0433 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430, \u043c\u043e\u0434\u0435\u043b\u044c \u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u0438 \u0440\u0435\u0448\u0430\u0435\u0442, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c: <code>@agent.tool<\/code> \u0436\u0434\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c <code>RunContext<\/code>, <code>@agent.tool_plain<\/code> \u2014 \u043d\u0435\u0442. \u0427\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c (\u0437\u0434\u0435\u0441\u044c dataclass \u0441 HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c), \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 <code>deps_type<\/code>, \u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c: <code>support.run(..., deps=SupportDeps(...))<\/code>. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u0432: \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443 \u2014 \u0442\u043e \u0438 \u0432 \u0442\u0438\u043f\u0435, \u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0447\u0435\u043a\u0435\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442, \u0435\u0441\u043b\u0438 \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0435. \u0422\u0435\u0441\u0442\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0430 \u0440\u0443\u043a\u0443: \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0435 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0433\u043e\u043d\u044f\u0435\u0442\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438. \u041f\u0438\u0441\u0430\u0432\u0448\u0438\u043c \u043d\u0430 FastAPI \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0434\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u0438\u044f: \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0432\u0445\u043e\u0434 \u0438 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u043c \u0441\u0445\u0435\u043c\u044b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<p>Docstring \u0437\u0434\u0435\u0441\u044c \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d \u043c\u043e\u0434\u0435\u043b\u0438: \u043e\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442, \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u043b\u0438 \u043e\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u0442. \u00ab\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443\u00bb \u043e\u043d\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443, \u00ab\u0445\u0435\u043b\u043f\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438\u00bb \u2014 \u0443\u0436\u0435 \u0441 \u043d\u0430\u0442\u044f\u0436\u043a\u043e\u0439. \u041f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0435 \u043d\u043e\u0432\u043e\u043c\u0443 \u043a\u043e\u043b\u043b\u0435\u0433\u0435. \u0422\u0435\u043c, \u043a\u043e\u043c\u0443 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b \u043d\u0435 \u043f\u043e \u0432\u043a\u0443\u0441\u0443, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u2014 <code>Agent(..., tools=[get_order])<\/code>, \u044d\u0444\u0444\u0435\u043a\u0442 \u0442\u043e\u0442 \u0436\u0435.<\/p>\n<p><code>raise ModelRetry<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 <code>normalize_phone<\/code> \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f. \u041e\u0431\u044b\u0447\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0443\u043b\u0435\u0442\u0430\u0435\u0442 \u043d\u0430\u0432\u0435\u0440\u0445 \u0438 \u0440\u043e\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a. ModelRetry \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043d\u0430\u0447\u0435: \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u0441\u0430\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043e\u043d\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0435\u0449\u0451 \u0440\u0430\u0437. \u0422\u0430 \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043c\u0438\u043c\u043e \u0441\u0445\u0435\u043c\u044b: <code>ValidationError<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u0432\u043e\u0434 \u0434\u043b\u044f \u0440\u0435\u0442\u0440\u0430\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u0434\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430, \u043b\u0438\u043c\u0438\u0442 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u043c (<code>retries={'tools': N}<\/code>) \u0438\u043b\u0438 \u0442\u043e\u0447\u0435\u0447\u043d\u043e \u2014 <code>@agent.tool(retries=N)<\/code>. \u0412 v2 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <code>ToolFailed<\/code> \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e: \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0437\u043d\u0430\u0451\u0442 \u043e \u043f\u0440\u043e\u0432\u0430\u043b\u0435, \u043d\u043e \u0431\u044e\u0434\u0436\u0435\u0442 \u0440\u0435\u0442\u0440\u0430\u0435\u0432 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f.<\/p>\n<h3>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434<\/h3>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u043d\u0430 \u0441\u0442\u044b\u043a\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <code>output_type<\/code> \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e. \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 pydantic-\u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u2014 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0430\u0433\u0435\u043d\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435. \u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0438 \u0443\u0439\u0434\u0451\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u043a\u0443, \u043a\u0440\u0438\u0432\u043e\u0439 JSON \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0434\u043e\u0435\u0434\u0435\u0442 \u0434\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438, \u0430 <code>result.output<\/code> \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c (<a href=\"https:\/\/ai.pydantic.dev\/output\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>). IDE \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044f, mypy \u043b\u043e\u0432\u0438\u0442 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/p>\n<pre><code class=\"python\">from pydantic import BaseModelfrom pydantic_ai import Agent, ModelRetry, RunContextclass RefundDecision(BaseModel):    approved: bool    amount: int    reason: strrefund = Agent(    'openai:gpt-6.1-sol',    output_type=RefundDecision,    instructions='\u0420\u0435\u0448\u0430\u0439, \u043e\u0434\u043e\u0431\u0440\u044f\u0442\u044c \u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u2014 \u0434\u043e 50 000.',)@refund.output_validatordef check_limit(ctx: RunContext, decision: RefundDecision) -&gt; RefundDecision:    if decision.approved and decision.amount &gt; 50_000:        raise ModelRetry('\u0421\u0432\u044b\u0448\u0435 50 000 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u0412\u0435\u0440\u043d\u0438 approved=False.')    return decision<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0445\u0435\u043c\u0430, \u043e\u0434\u043d\u0430\u043a\u043e, \u043b\u043e\u0432\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u043c\u0430\u0442. \u041c\u043e\u0434\u0435\u043b\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0447\u0435\u0441\u0442\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0438\u0446\u0443 \u2014 \u0441\u043a\u0430\u0436\u0435\u043c, \u043e\u0434\u043e\u0431\u0440\u0438\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d. \u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0435\u0441\u0442\u044c <code>@agent.output_validator<\/code> \u2014 \u0434\u043e\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0445\u0435\u043c\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439, \u043b\u0435\u0437\u0442\u044c \u0432 \u0431\u0430\u0437\u0443, \u0445\u043e\u0434\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u2014 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041f\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438, \u0438 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0443\u0436\u0435 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f. \u0411\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u043e\u043f\u044f\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>retries={'output': N}<\/code>; \u043a\u043e\u0433\u0434\u0430 \u0431\u044e\u0434\u0436\u0435\u0442 \u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f, \u0437\u0430\u043f\u0443\u0441\u043a \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 <code>UnexpectedModelBehavior<\/code> \u2014 \u0442\u0438\u0445\u043e \u043f\u0440\u043e\u0433\u043b\u043e\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442.<\/p>\n<p>\u0412 <code>output_type<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u0448\u0435 \u0441 <code>output_type=[RefundDecision, str]<\/code> \u0432\u0435\u0440\u043d\u0451\u0442 \u043b\u0438\u0431\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043b\u0438\u0431\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u2014 \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 Pydantic AI \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c output-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0445\u0435\u043c\u0430 \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>isinstance<\/code>, \u0430 \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u0432\u0430\u0448\u0435\u0439 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0438 <code>BaseModel<\/code> \u2014 dataclass, TypedDict \u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u0447\u0442\u043e Pydantic \u0443\u043c\u0435\u0435\u0442 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0414\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0438 \u0434\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e \u043c\u0435\u0440\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438: Pydantic \u0443\u043c\u0435\u0435\u0442 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 JSON, \u0438 <code>stream_output()<\/code> \u0432\u044b\u0434\u0430\u0451\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043f\u0435\u043b.<\/p>\n<pre><code class=\"python\">async with refund.run_stream('\u041a\u043b\u0438\u0435\u043d\u0442 \u043a\u0443\u043f\u0438\u043b \u0442\u043e\u0441\u0442\u0435\u0440 \u0438 \u0432\u0435\u0440\u043d\u0443\u043b \u0435\u0433\u043e \u0432 \u0442\u043e\u0442 \u0436\u0435 \u0434\u0435\u043d\u044c') as result:    async for decision in result.stream_output():        render(decision)  # \u0441\u043d\u0430\u043f\u0448\u043e\u0442: \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0435\u0445\u0430\u0442\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0447\u0430\u0442-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043e\u0449\u0443\u0442\u0438\u043c\u0430\u044f: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u0430, \u043f\u043e\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0435\u0449\u0451 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<h3>\u0422\u0435\u0441\u0442\u044b \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 API<\/h3>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0442\u0435\u0441\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: \u043f\u043e\u0434\u043d\u044f\u043b\u0438 \u043c\u043e\u043a HTTP, \u0437\u0430\u0441\u0442\u0430\u0431\u0438\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0438 \u043c\u043e\u043b\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u0432\u043f\u0430\u043b \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u0418\u043b\u0438, \u0447\u0442\u043e \u0447\u0430\u0449\u0435, \u0430\u0433\u0435\u043d\u0442\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u00ab\u0442\u0430\u043c \u0436\u0435 \u043c\u043e\u0434\u0435\u043b\u044c, \u0447\u0442\u043e \u0442\u0443\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb, \u2014 \u044f \u0438 \u0441\u0430\u043c \u0433\u043e\u0434 \u0436\u0438\u043b \u043f\u043e \u044d\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435. \u0412 Pydantic AI \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0438 \u0441\u0432\u044f\u0437\u043a\u0430 \u00ab\u0430\u0433\u0435\u043d\u0442 + \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b + \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 + \u0432\u044b\u0432\u043e\u0434\u00bb \u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Python-\u043a\u043e\u0434 \u0432 pytest (<a href=\"https:\/\/ai.pydantic.dev\/testing\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>).<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 <code>TestModel<\/code>. \u041e\u043d \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 JSON-\u0441\u0445\u0435\u043c\u044b \u0432\u0430\u0448\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u0430\u043c \u0441\u043e\u0447\u0438\u043d\u044f\u0435\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0432\u043e\u0434\u043a\u0443. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0418\u0418 \u0432\u043d\u0443\u0442\u0440\u0438, \u0447\u0438\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0449\u0438\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u043e\u043d\u044b \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u041f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u0442\u0435\u0441\u0442\u0435:<\/p>\n<pre><code class=\"python\">import pytestfrom pydantic_ai import modelsfrom pydantic_ai.models.test import TestModelfrom support import FakeHttp, SupportDeps, support  # \u0430\u0433\u0435\u043d\u0442 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430pytestmark = pytest.mark.anyiomodels.ALLOW_MODEL_REQUESTS = False  # \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0443\u0440\u043e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442async def test_support_flow():    deps = SupportDeps(http=FakeHttp(), api_base='http:\/\/test')    with support.override(model=TestModel()):        result = await support.run('\u0413\u0434\u0435 \u043c\u043e\u0439 \u0437\u0430\u043a\u0430\u0437 42?', deps=deps)    assert 'get_order' in result.output  # \u0432 output \u2014 \u0441\u0432\u043e\u0434\u043a\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>ALLOW_MODEL_REQUESTS = False<\/code> \u0441\u0442\u0440\u0430\u0445\u0443\u0435\u0442 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u0443: \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0442\u0438\u0445\u043e \u0441\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u043d\u044c\u0433\u0438 \u0441 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u0410 <code>Agent('test')<\/code> \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0434\u0430\u0451\u0442 \u0442\u043e\u0442 \u0436\u0435 <code>TestModel<\/code> \u2014 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u043d \u0442\u043e, \u0447\u0442\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442: \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0445\u043e\u0434\u044f\u0442 \u0434\u043e \u043d\u0438\u0445, output \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u043e\u043c\u043e\u043a \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u2014 \u043e\u0431\u0432\u044f\u0437\u043a\u0430, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434 \u0442\u0435\u0441\u0442\u043e\u043c. \u0414\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b, \u0435\u0441\u0442\u044c <code>FunctionModel<\/code>: \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>ModelResponse<\/code>.<\/p>\n<pre><code class=\"python\"># from pydantic_ai import ModelResponse, ToolCallPartdef scripted_model(messages, info):    return ModelResponse(parts=[ToolCallPart('get_order', {'order_id': 42})])with support.override(model=FunctionModel(scripted_model)):    ...  # \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u0430 \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0442\u0435\u0441\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d \u0432 \u043b\u044e\u0431\u043e\u0439 \u0434\u0435\u043d\u044c \u0438 \u0432 \u043b\u044e\u0431\u043e\u043c CI, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0443\u044e \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044e: \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442. \u0415\u0441\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u043d\u043e\u0433\u043e, \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 pytest-\u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0443 \u0441 <code>support.override(...)<\/code>. \u0416\u0438\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u2014 \u0437\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438\u0434\u0438\u0442\u0435 \u0432 evals, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b Pydantic. \u041b\u043e\u0433\u0438\u043a\u0430 \u0436\u0435 \u0430\u0433\u0435\u043d\u0442\u0430, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c, \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430.<\/p>\n<h3>\u0427\u0442\u043e \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 v2<\/h3>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432\u044b\u0448\u043b\u0430 23 \u0438\u044e\u043d\u044f 2026 \u0433\u043e\u0434\u0430, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043f\u043e\u0441\u043b\u0435 1.0 (<a href=\"https:\/\/pydantic.dev\/articles\/pydantic-ai-v2\">\u0430\u043d\u043e\u043d\u0441<\/a>). \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u043e\u0432\u0438\u043d\u043a\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f capability. \u042d\u0442\u043e \u0431\u043b\u043e\u043a \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0445\u0443\u043a\u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043a \u0430\u0433\u0435\u043d\u0442\u0443 \u043e\u0434\u043d\u0438\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c. \u0420\u0430\u043d\u044c\u0448\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u0430\u0445 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u043e\u0441\u044c \u0432 \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0443 \u0438\u0437 \u043f\u043e\u043b\u0443\u0441\u043e\u0442\u043d\u0438 \u0441\u0442\u0440\u043e\u043a. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0431\u043b\u043e\u043a\u043e\u0432, \u0430 \u0431\u043b\u043e\u043a \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 spec-\u0444\u0430\u0439\u043b \u2014 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c, \u043e\u0442\u0434\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0435, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0430\u0433\u0435\u043d\u0442\u0443.<\/p>\n<p>CodeMode \u0440\u0435\u0448\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u2014 \u0446\u0435\u043d\u0443 \u0430\u0433\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430: \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0436\u0434\u0451\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0434\u0443\u043c\u0430\u0435\u0442, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0438\u0442\u043e\u043a \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u0441\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u0438\u0430\u043b\u043e\u0433\u0430. \u0412 CodeMode \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0447\u0435\u0440\u0435\u0434\u044b \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0451\u0440\u0433\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435 Monty, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u043d\u0438-\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0435 Python \u043e\u0442 Pydantic. \u041d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0441 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u043c \u0448\u0430\u0433\u043e\u0432 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0439, \u0438 \u043f\u0430\u0443\u0437\u044b \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0443\u0445\u043e\u0434\u044f\u0442.<\/p>\n<p>ToolSearch \u043d\u0443\u0436\u0435\u043d \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u2014 \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e\u0442\u043d\u0438. \u0421\u0445\u0435\u043c\u044b \u0432\u0441\u0435\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0436\u0438\u0432\u0443\u0442 \u0432 \u043f\u0440\u043e\u043c\u043f\u0442\u0435, \u0438 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u043d\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0430\u0433\u0435\u043d\u0442 \u043d\u0430\u0447\u043d\u0451\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0441 \u043f\u043e\u043c\u0435\u0442\u043a\u043e\u0439 <code>defer_loading=True<\/code> \u0432 \u043f\u0440\u043e\u043c\u043f\u0442 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442: \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0438\u0445 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0447\u0435\u0440\u0435\u0437 ToolSearch, \u0433\u0434\u0435 \u043d\u0430 Anthropic \u0438 OpenAI Responses \u043f\u043e\u0438\u0441\u043a \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439, \u0430 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u2014 \u043e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432 \u0434\u043e BM25.<\/p>\n<p>\u0421 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043e\u0431\u043e\u0439\u0434\u0451\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u043f\u0430\u0440\u044b \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432, \u043d\u043e \u0442\u0440\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438. \u041f\u0440\u0435\u0444\u0438\u043a\u0441 <code>openai:<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0434\u0451\u0442 \u043d\u0430 Responses API, \u0430 \u0437\u0430 \u043f\u0440\u0435\u0436\u043d\u0438\u043c Chat Completions \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>openai-chat:<\/code> \u2014 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u043e \u043d\u0435\u0433\u043e. \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 <code>end_strategy<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u043d\u0430 <code>graceful<\/code>, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043e\u0442\u043c\u0435\u043d\u044b \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0430\u0447\u0435. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0430\u0441\u044c \u0434\u043e v5 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u043e\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u2014 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432, \u044d\u0442\u043e \u043a \u0432\u0430\u043c. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043b\u0435\u0436\u0438\u0442 \u043a\u0430\u0440\u0442\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 V1 \u2192 V2, \u043f\u0435\u0440\u0435\u0434 \u0430\u043f\u0434\u0435\u0439\u0442\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0435\u0451 \u043f\u0440\u0430\u0432\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c.<\/p>\n<h3>\u0427\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435<\/h3>\n<p><code>run<\/code> \u0438 <code>run_sync<\/code> \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0434\u0435\u0432\u044f\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438\u0437 \u0434\u0435\u0441\u044f\u0442\u0438. \u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0446\u0438\u043a\u043b\u0430 \u2014 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433, \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0432\u0435\u0442\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u2014 \u0435\u0441\u0442\u044c <code>agent.iter()<\/code>. \u041e\u043d \u043e\u0442\u0434\u0430\u0451\u0442 \u0446\u0438\u043a\u043b \u043f\u043e \u0443\u0437\u043b\u0430\u043c, \u0433\u0434\u0435 \u0432\u044b \u0441\u0430\u043c\u0438 \u0440\u0435\u0448\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043a \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0438 \u0442\u0443\u0434\u0430 \u0436\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0414\u043b\u044f \u0447\u0430\u0442\u0430 \u0441 \u0436\u0438\u0432\u044b\u043c \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0448\u0442\u0443\u043a\u0430 \u0434\u0435\u043b\u044c\u043d\u0430\u044f.<\/p>\n<p>\u041b\u0438\u043c\u0438\u0442\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 <code>UsageLimits<\/code> \u2014 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u043c\u043e\u0434\u0435\u043b\u0438, \u0442\u043e\u043a\u0435\u043d\u044b, \u0432\u044b\u0437\u043e\u0432\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0447\u0451\u0442 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u0437\u0430 \u0432\u0435\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0432\u0438\u0442\u043a\u0430\u043c\u0438 \u0446\u0438\u043a\u043b\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043c\u043e\u043b\u0447\u0430 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0442\u0440\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432\u044b \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0438. \u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u043b\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u2014 \u043f\u0440\u0435\u0434\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043a\u0443\u043f\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430.<\/p>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0447\u0430\u0441\u0430\u043c\u0438, \u043d\u043e\u0447\u043d\u043e\u0439 \u0431\u0430\u0442\u0447 \u043f\u043e \u0442\u044b\u0441\u044f\u0447\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u044f\u0437\u0430\u043d \u043f\u0435\u0440\u0435\u0436\u0438\u0442\u044c \u0440\u0435\u0441\u0442\u0430\u0440\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 Pydantic AI \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 durable execution: \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f, \u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u0435\u0441\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438. \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u2014 Temporal, DBOS, Prefect, Restate, AWS Lambda, Apache Airflow, \u043f\u043b\u044e\u0441 \u043b\u0451\u0433\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435 Absurd \u0438 pgtask; \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435.<\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 MCP: \u0430\u0433\u0435\u043d\u0442\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f <code>toolsets=[MCPToolset(url)]<\/code>, \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 stdio \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u043e HTTP \u2014 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041f\u043e\u043c\u0435\u0442\u0438\u0432 \u043d\u0430\u0431\u043e\u0440 <code>defer_loading=True<\/code>, \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 \u0445\u043e\u0442\u044c \u0441\u043e\u0442\u043d\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/p>\n<p>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u2014 Logfire \u043e\u0442 \u0442\u043e\u0439 \u0436\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 <code>logfire.instrument_pydantic_ai()<\/code>, \u0438 \u0432 \u0442\u0440\u0430\u0441\u0441\u0430\u0445 \u0432\u0438\u0434\u043d\u044b \u043f\u0440\u043e\u043c\u043f\u0442\u044b, \u043e\u0442\u0432\u0435\u0442\u044b, \u0442\u043e\u043a\u0435\u043d\u044b \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 (<a href=\"https:\/\/ai.pydantic.dev\/logfire\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>). \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c OpenTelemetry, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0440\u0435\u0439\u0441\u044b \u0443\u0445\u043e\u0434\u044f\u0442 \u0432 \u043b\u044e\u0431\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u2014 Grafana, Jaeger, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0442\u0430\u043c \u0437\u0430\u0432\u0435\u0434\u0435\u043d\u043e. AI Gateway, \u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0442\u043e\u0439 \u0436\u0435 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0439 \u043e\u0434\u043d\u0438\u043c, \u0443\u043c\u0435\u0435\u0442 \u0444\u0435\u0439\u043b\u043e\u0432\u0435\u0440 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438 \u0438 \u0441\u0432\u043e\u0434\u0438\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0432 \u043e\u0434\u043d\u0443 \u043a\u0432\u043e\u0442\u0443.<\/p>\n<h3>\u041c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u0436\u0435\u043b\u0435\u0437\u0435<\/h3>\n<p>\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 \u043f\u0435\u0440\u0435\u0432\u0430\u043b\u0438\u043b \u0437\u0430 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c \u0441\u0435\u043c\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u2014 \u043e\u0442 OpenAI \u0438 Anthropic \u0434\u043e Kimi, Qwen, Together \u0438 OpenRouter (<a href=\"https:\/\/ai.pydantic.dev\/models\/overview\/\">\u043e\u0431\u0437\u043e\u0440<\/a>). \u041d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a. \u041f\u0440\u0438\u0447\u0438\u043d\u044b \u0443 \u0432\u0441\u0435\u0445 \u0441\u0432\u043e\u0438: \u0433\u0434\u0435-\u0442\u043e \u0432\u0440\u0430\u0447\u0435\u0431\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0440\u0443\u0436\u0443 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0433\u0434\u0435-\u0442\u043e \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0443\u0440 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0430 \u0433\u0434\u0435-\u0442\u043e \u043d\u0430\u0434\u043e\u0435\u043b\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b \u043d\u0430 \u0430\u0433\u0435\u043d\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u043b\u043e\u0442\u0438\u0442 \u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u043e, \u2014 \u0441\u0432\u043e\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043e\u043a\u0443\u043f\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u043f\u0430\u0440\u0443 \u043c\u0435\u0441\u044f\u0446\u0435\u0432.<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043a\u0440\u043e\u043c\u043d\u043e:<\/p>\n<pre><code class=\"python\">from pydantic_ai import Agentagent = Agent('ollama:qwen3')  # \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 localhost:11434<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0443\u0436\u0435\u043d \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2014 \u0447\u0435\u0440\u0435\u0437 \u044f\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 (<a href=\"https:\/\/ai.pydantic.dev\/models\/ollama\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>):<\/p>\n<pre><code class=\"python\">from pydantic_ai.models.ollama import OllamaModelfrom pydantic_ai.providers.ollama import OllamaProvidermodel = OllamaModel(    'qwen3',    provider=OllamaProvider(base_url='http:\/\/gpu-box.local:11434\/v1'),)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c\u043e\u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0447\u0435\u0440\u0435\u0437 vLLM \u0434\u0430\u0451\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>vllm:<\/code>, \u0430 \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0447\u0438\u0439 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c \u0436\u0435 <code>OpenAIChatModel<\/code> \u0441 <code>Provider(base_url=...)<\/code>, \u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435. \u0421\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f.<\/p>\n<p>\u041d\u0430\u0448 \u0448\u043b\u044e\u0437, \u043a \u0441\u043b\u043e\u0432\u0443, \u2014 \u0442\u043e\u0436\u0435 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u0433\u0438\u0431\u0440\u0438\u0434 \u00ab\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u043e\u0434\u0438\u0442 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e\u00bb \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c \u0436\u0435 \u043a\u043e\u0434\u043e\u043c. \u041c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u043d\u0430 <a href=\"https:\/\/bothub.chat\/\">BotHub<\/a>, \u0430 <a href=\"https:\/\/bothub.chat\/?invitedBy=zx7xIePYIOcWHhTfgg6-O\">\u0440\u0435\u0444\u0435\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430<\/a> \u0434\u0430\u0441\u0442 300.000 CAPS \u043d\u0430 \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>\u041c\u0435\u043b\u043a\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u043e\u0431\u044b\u0447\u043d\u043e 7\u201314 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043e\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u2014 \u043d\u0430 \u0441\u0442\u0440\u043e\u0433\u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430\u0445 \u0441\u044b\u043f\u044f\u0442\u0441\u044f: tool-calling \u0443\u0445\u043e\u0434\u0438\u0442 \u043c\u0438\u043c\u043e \u0441\u0445\u0435\u043c\u044b, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438. \u041b\u0435\u0447\u0438\u0442\u0441\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u0430\u043c\u0431\u0438\u0446\u0438\u0439: \u0441\u0445\u0435\u043c\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u043f\u0440\u043e\u0449\u0435, \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u0440\u043e\u0431\u043d\u0435\u0435, <code>output_type<\/code> \u043f\u043e\u0441\u043a\u0440\u043e\u043c\u043d\u0435\u0435. \u0411\u044e\u0434\u0436\u0435\u0442 \u0440\u0435\u0442\u0440\u0430\u0435\u0432 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0430 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 <code>TestModel<\/code> \u043f\u043e\u043a\u0430\u0436\u0443\u0442, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u0435\u0442\u0441\u044f, \u0435\u0449\u0451 \u0434\u043e \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430. \u041d\u0443 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0441 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 tool-calling \u2014 \u0432 \u043b\u0451\u0433\u043a\u043e\u0439 \u0432\u0435\u0441\u043e\u0432\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0430\u043c\u044b\u0435 \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 qwen\u2019\u044b.<\/p>\n<h3>LangChain \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435<\/h3>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u043f\u043e \u0437\u0432\u0451\u0437\u0434\u0430\u043c \u043d\u0430 GitHub \u2014 \u0437\u0430\u043d\u044f\u0442\u0438\u0435 \u043c\u0430\u043b\u043e\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435; \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u0435\u0435 \u043f\u043e \u0437\u0430\u0434\u0430\u0447\u0430\u043c. \u0414\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e Python-\u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0430\u0433\u0435\u043d\u0442 \u0434\u0451\u0440\u0433\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u044f \u0431\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0440\u0430\u043b Pydantic AI. \u0422\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043c \u2014 \u043d\u0435\u0441\u0443\u0449\u0430\u044f \u0441\u0442\u0435\u043d\u0430: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u0440\u0435\u0442\u0440\u0430\u0438, \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u0438 \u0442\u0435\u0441\u0442\u044b \u0438\u0434\u0443\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c, \u0431\u0435\u0437 \u0430\u0434\u0434\u043e\u043d\u043e\u0432.<\/p>\n<p>\u0423 LangChain \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0448\u0438\u0440\u0435 \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0435\u043c\u0438\u0441\u043e\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439, LangGraph \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 LangSmith \u0437\u0430 $39\u2013399 \u0432 \u043c\u0435\u0441\u044f\u0446. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430\u0445 \u043a \u0434\u0435\u0441\u044f\u0442\u043a\u0443 SaaS, \u044d\u0442\u043e \u0432\u0435\u0441\u043e\u043c\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0438 LangGraph \u0433\u043e\u0434\u0430\u043c\u0438 \u0442\u0430\u0449\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 stateful-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u2014 \u0445\u043e\u0440\u043e\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u043d\u043e. \u041d\u043e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043c \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d\u0430 \u0441\u0431\u043e\u043a\u0443, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0430\u0434\u0434\u043e\u043d-\u043f\u0430\u0440\u0441\u0435\u0440\u0430\u043c\u0438, \u0438 \u043d\u0430 \u0442\u0438\u043f\u043e\u0432\u043e\u043c \u0430\u0433\u0435\u043d\u0442\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u0430 \u043d\u0435\u0432\u043e\u043e\u0440\u0443\u0436\u0451\u043d\u043d\u044b\u043c \u0433\u043b\u0430\u0437\u043e\u043c: \u0437\u0430\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/www.betterclaw.io\/blog\/pydantic-ai-vs-langchain\">\u043e\u0431\u0437\u043e\u0440\u0430 betterclaw<\/a> \u0434\u0430\u043b \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0448\u0435\u0441\u0442\u0438\u0434\u0435\u0441\u044f\u0442\u0438 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 Pydantic AI \u043f\u0440\u043e\u0442\u0438\u0432 \u0434\u0432\u0443\u0445\u0441\u043e\u0442 \u043d\u0430 LangChain. \u0412\u0442\u0440\u043e\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u043b\u0435\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0438\u043d\u0438\u0442\u044c \u0438 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438. \u041d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043d\u0430 LangChain \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 2026-\u043c \u044f \u0431\u044b \u043d\u0435 \u0441\u0442\u0430\u043b; \u0441\u0442\u0430\u0440\u044b\u0439, \u0433\u0434\u0435 \u0443\u0436\u0435 \u0432\u043b\u043e\u0436\u0438\u043b\u0438\u0441\u044c \u0432 \u0433\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b, \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0442\u044c \u0440\u0430\u0434\u0438 \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0430 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<p>CrewAI \u0436\u0438\u0432\u0451\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438: \u0442\u0430\u043c \u0440\u043e\u043b\u0435\u0432\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u2014 \u0432\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u00ab\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u00bb \u0438 \u00ab\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f\u00bb, \u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0440\u0430\u0437\u0440\u0443\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u0414\u043b\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u0430\u0433\u0435\u043d\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0439 \u043d\u0438\u0448\u0430 \u0441\u0432\u043e\u044f, \u0438 \u043b\u0435\u0437\u0442\u044c \u0442\u0443\u0434\u0430 \u0441 Pydantic AI \u0441\u043c\u044b\u0441\u043b\u0430 \u043c\u0430\u043b\u043e. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0432 TypeScript \u2014 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 Mastra \u0438 Vercel AI SDK, \u0443 AWS \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 Strands.<\/p>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0442\u043e. \u041e\u0434\u0438\u043d \u043f\u0440\u043e\u043c\u043f\u0442 \u0438 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u2014 \u0431\u0435\u0440\u0438\u0442\u0435 SDK \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0446\u0435\u0440\u0435\u043c\u043e\u043d\u0438\u0439 \u043c\u0435\u043d\u044c\u0448\u0435; \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0440\u0430\u0434\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u2014 \u043a\u0430\u043a \u0435\u0445\u0430\u0442\u044c \u0432 \u043c\u0430\u0433\u0430\u0437\u0438\u043d \u043d\u0430 \u0431\u0443\u043b\u044c\u0434\u043e\u0437\u0435\u0440\u0435. \u0413\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0440\u0435\u0442\u0440\u0430\u0438 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432: \u0432\u043e\u0442 \u044d\u0442\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u043a\u0443\u0434\u0430 \u0431\u0435\u0437 \u043d\u0438\u0445. \u0420\u0435\u043b\u0438\u0437\u043d\u044b\u0439 \u0440\u0438\u0442\u043c \u043f\u043b\u043e\u0442\u043d\u044b\u0439: \u0437\u0430 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 v1 \u0432\u044b\u0448\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u0442\u043d\u0438 \u0440\u0435\u043b\u0438\u0437\u043e\u0432, changelog \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0435\u0440\u0438\u0430\u043b, \u0438 \u0443\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0432\u0441\u0435\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442 \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u043d\u0430\u0442\u0443. \u041d\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u0435\u043a\u0430\u044e\u0442 \u2014 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0442\u0438\u043f\u044b, \u0433\u0434\u0435 \u0432\u0441\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0441\u0442\u044c API \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0418 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u044e Pydantic \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c: \u0432\u0441\u0451 \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 pydantic-\u043c\u043e\u0434\u0435\u043b\u0438, \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443\u00bb \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u041b\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f \u0442\u0440\u0435\u0442\u044c\u0435 \u043d\u0435 \u0437\u0430\u0434\u0435\u0432\u0430\u0435\u0442 \u2014 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0438\u043f\u043e\u0432 \u0440\u043e\u0432\u043d\u043e \u0437\u0430 \u0442\u0435\u043c \u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438 \u0432\u0437\u044f\u043b, \u2014 \u043d\u043e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0442\u0438\u043b\u0435\u043c \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0447\u0451\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u044b.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0417\u0430 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430 Pydantic AI \u0443 \u043c\u0435\u043d\u044f \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0438 \u0442\u0440\u0438 \u0430\u0433\u0435\u043d\u0442\u0430, \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0432\u0435\u0441\u043e\u043c\u0435\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u044b \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0435\u0433\u043a\u043e: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0434\u0430\u0432\u043d\u043e \u0436\u0438\u0432\u0443\u0442 \u0432 SDK \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432, \u0430 Pydantic AI \u0434\u043e\u0432\u043e\u0434\u0438\u0442 \u0438\u0434\u0435\u044e \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u2014 \u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043e \u0442\u0435\u0441\u0442\u0430. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043b\u043e\u0439 \u0437\u0440\u0435\u043b\u043e\u0441\u0442\u0438 \u043b\u0435\u0436\u0438\u0442 \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435: evals \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, Logfire \u0434\u043b\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u0438, durable execution \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u0421\u0442\u0430\u0432\u043b\u044e \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a \u0436\u0435 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043a\u0430\u043a \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0435\u0431-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1099642\/\">https:\/\/habr.com\/ru\/articles\/1099642\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0423 \u0442\u0438\u043f\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 LLM-\u0430\u0433\u0435\u043d\u0442\u043e\u043c \u0441\u0443\u0434\u044c\u0431\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u043d\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u043e \u043c\u0438\u043b\u044b\u0435 \u0441\u043e\u0440\u043e\u043a \u0441\u0442\u0440\u043e\u043a: \u043f\u0440\u043e\u043c\u043f\u0442, \u0432\u044b\u0437\u043e\u0432 openai-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e API, json.loads \u2014 \u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u043d\u0435\u0434\u0435\u043b\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0434 JSON \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0434\u0443\u0445\u0435 \u00ab\u041a\u043e\u043d\u0435\u0447\u043d\u043e! \u0412\u043e\u0442 \u0432\u0430\u0448 \u043e\u0442\u0432\u0435\u0442:\u00bb, \u043e\u0434\u043d\u043e \u0438\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0442\u043e \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442, \u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u0412 \u043a\u043e\u0434 \u0432\u044a\u0435\u0437\u0436\u0430\u044e\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438, \u0440\u0443\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0415\u0449\u0451 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u0432\u044b \u0432\u043b\u0430\u0434\u0435\u0435\u0442\u0435 \u043a\u043e\u043c\u043e\u043c \u0441\u0432\u044f\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0432\u0430\u043b\u0438\u0442\u0441\u044f.\u0423\u0432\u044b, \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0443\u0442 \u0447\u0430\u0449\u0435 \u043d\u0438 \u043f\u0440\u0438 \u0447\u0451\u043c. \u041b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u044b\u043a \u043c\u0435\u0436\u0434\u0443 \u0435\u0451 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u2014 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0435\u0442 \u043d\u0438 \u0442\u0438\u043f\u043e\u0432, \u043d\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430.Pydantic AI \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u0440\u0443\u0433\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0438\u043f\u043e\u0432. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Pydantic \u2014 \u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0432 FastAPI, OpenAI SDK \u0438 \u0435\u0449\u0451 \u0434\u043e\u0431\u0440\u043e\u0439 \u0434\u044e\u0436\u0438\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 pydantic-\u043c\u043e\u0434\u0435\u043b\u044c\u044e, \u0430 \u0437\u0430\u043c\u0435\u043d\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Ollama \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u0440\u0430\u0432\u043a\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\u0422\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 README. \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u2014 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.\u0421\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e: uv add pydantic-ai \u0438\u043b\u0438 pip install pydantic-ai \u2014 \u043a\u0442\u043e \u043a\u0430\u043a \u043f\u0440\u0438\u0432\u044b\u043a. \u0412 v2 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b \u0434\u043e\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 extras, \u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439.from pydantic_ai import Agentfrom pydantic_ai.models.openai import OpenAIChatModelfrom pydantic_ai.providers.openai import OpenAIProvider# 1. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0448\u043b\u044e\u0437\u0430provider = OpenAIProvider(    base_url=&#8217;https:\/\/openai.bothub.chat\/v1&#8242;,  # URL \u0432\u0430\u0448\u0435\u0433\u043e \u0448\u043b\u044e\u0437\u0430    api_key=&#8217;your-api-token-here&#8217;)# 2. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c, \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0438\u043c\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u0448\u043b\u044e\u0437\u0435model = OpenAIChatModel(    &#8216;gpt-6-luna&#8217;,    provider=provider)# 3. \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0432 Agentagent = Agent(    model,    instructions=&#8217;\u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.&#8217;,)result = agent.run_sync(&#8216;\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0430\u0441\u044c \u0444\u0440\u0430\u0437\u0430 hello world?&#8217;)print(result.output)\u0423 \u043c\u0435\u043d\u044f \u043e\u0442\u0432\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a:\u0424\u0440\u0430\u0437\u0430 \u00abhello, world\u00bb \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 \u043a\u043d\u0438\u0433\u0435 \u0411\u0440\u0430\u0439\u0430\u043d\u0430 \u041a\u0435\u0440\u043d\u0438\u0433\u0430\u043d\u0430 \u0438 \u0414\u0435\u043d\u043d\u0438\u0441\u0430 \u0420\u0438\u0442\u0447\u0438 \u00ab\u042f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f C\u00bb (1978) \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.\u0412\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u2014 \u0434\u0435\u0432\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u043a, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u0431\u0440\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u2014 \u043e\u0431\u0432\u044f\u0437\u043a\u0430. run_sync \u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430\u0434 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u044f\u0434\u0440\u043e\u043c: \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0441\u0451 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043d\u0430 asyncio, \u043d\u043e \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 sync-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430 FastAPI \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 await agent.run(&#8230;). \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u0414\u043b\u044f Python-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u0434\u043a\u0430\u044f \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430, \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.\u041a\u043e\u0434 \u0432\u044b\u0448\u0435 \u0445\u043e\u0434\u0438\u0442 \u0432 \u043d\u0430\u0448 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0448\u043b\u044e\u0437. GPT-6-Luna \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u043d\u0430 BotHub, \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u2014 \u0437\u0434\u0435\u0441\u044c. \u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u044c\u043c\u0451\u0442\u0435 \u0440\u0435\u0444\u0435\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 300.000 CAPS \u043d\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u2014 \u043d\u0430 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u0445\u0432\u0430\u0442\u0438\u0442 \u0441 \u0437\u0430\u043f\u0430\u0441\u043e\u043c. \u0422\u043e\u043a\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0434\u0432\u0430 \u043a\u043b\u0438\u043a\u0430: \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0435\u0441\u044c \u043d\u0430 BotHub, \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434.\u0425\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 OpenAI \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u0430\u0433\u0435\u043d\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439:agent = Agent(    &#8216;openai:gpt-6.1-sol&#8217;,    instructions=&#8217;\u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.&#8217;,)result = agent.run_sync(&#8216;\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0430\u0441\u044c \u0444\u0440\u0430\u0437\u0430 hello world?&#8217;)print(result.output)\u0417\u0430\u0442\u0435\u043c \u0437\u0430\u0434\u0430\u0451\u0442\u0435 OPENAI_API_KEY \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f LLM \u2014 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, JSON-\u0441\u0445\u0435\u043c\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c, \u0441\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0433\u0434\u0435-\u0442\u043e \u0442\u0440\u0435\u0442\u044c\u0438\u043c (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f). \u0422\u0430\u043a\u0438\u0435 \u0441\u0445\u0435\u043c\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438, \u0436\u0438\u0432\u0443\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043a\u043e\u0434\u0430 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0437\u0430\u044e\u0442\u0441\u044f \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c. \u0412 Pydantic AI \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e: \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440, \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0430\u043c. \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 JSON-\u0441\u0445\u0435\u043c\u0443, docstring \u0443\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430.\u0412\u043e\u0442 \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441 \u0434\u0432\u0443\u043c\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438:from dataclasses import dataclassimport httpxfrom pydantic_ai import Agent, ModelRetry, RunContext@dataclassclass SupportDeps:    http: httpx.AsyncClient    api_base: strsupport = Agent(    &#8216;openai:gpt-6.1-sol&#8217;,    deps_type=SupportDeps,    instructions=&#8217;\u041f\u043e\u043c\u043e\u0433\u0430\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438.&#8217;,)@support.toolasync def get_order(ctx: RunContext[SupportDeps], order_id: int) -&gt; dict:    &#171;&#187;&#187;\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443.&#187;&#187;&#187;    r = await ctx.deps.http.get(f'{ctx.deps.api_base}\/orders\/{order_id}&#8217;)    r.raise_for_status()    return r.json()@support.tool_plaindef normalize_phone(raw: str) -&gt; str:    &#171;&#187;&#187;\u041f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043a \u0444\u043e\u0440\u043c\u0430\u0442\u0443 +7XXXXXXXXXX.&#187;&#187;&#187;    digits = &#187;.join(ch for ch in raw if ch.isdigit())    if len(digits) != 11:        raise ModelRetry(&#8216;\u0412 \u043d\u043e\u043c\u0435\u0440\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c 11 \u0446\u0438\u0444\u0440. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437.&#8217;)    return f&#8217;+7{digits[1:]}&#8217;\u041c\u043e\u0434\u0435\u043b\u044c \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u0438\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0432\u044b: \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u0445\u0435\u043c\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0434\u0438\u0430\u043b\u043e\u0433 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430, \u043c\u043e\u0434\u0435\u043b\u044c \u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u0438 \u0440\u0435\u0448\u0430\u0435\u0442, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435.\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c: @agent.tool \u0436\u0434\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c RunContext, @agent.tool_plain \u2014 \u043d\u0435\u0442. \u0427\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c (\u0437\u0434\u0435\u0441\u044c dataclass \u0441 HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c), \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 deps_type, \u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c: support.run(&#8230;, deps=SupportDeps(&#8230;)). \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u0432: \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443 \u2014 \u0442\u043e \u0438 \u0432 \u0442\u0438\u043f\u0435, \u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0447\u0435\u043a\u0435\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442, \u0435\u0441\u043b\u0438 \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0435. \u0422\u0435\u0441\u0442\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0430 \u0440\u0443\u043a\u0443: \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0435 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0433\u043e\u043d\u044f\u0435\u0442\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438. \u041f\u0438\u0441\u0430\u0432\u0448\u0438\u043c \u043d\u0430 FastAPI \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0434\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u0438\u044f: \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0432\u0445\u043e\u0434 \u0438 \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u043c \u0441\u0445\u0435\u043c\u044b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044c.Docstring \u0437\u0434\u0435\u0441\u044c \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d \u043c\u043e\u0434\u0435\u043b\u0438: \u043e\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442, \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u043b\u0438 \u043e\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u0442. \u00ab\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443\u00bb \u043e\u043d\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443, \u00ab\u0445\u0435\u043b\u043f\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438\u00bb \u2014 \u0443\u0436\u0435 \u0441 \u043d\u0430\u0442\u044f\u0436\u043a\u043e\u0439. \u041f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0435 \u043d\u043e\u0432\u043e\u043c\u0443 \u043a\u043e\u043b\u043b\u0435\u0433\u0435. \u0422\u0435\u043c, \u043a\u043e\u043c\u0443 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b \u043d\u0435 \u043f\u043e \u0432\u043a\u0443\u0441\u0443, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u2014 Agent(&#8230;, tools=[get_order]), \u044d\u0444\u0444\u0435\u043a\u0442 \u0442\u043e\u0442 \u0436\u0435.raise ModelRetry \u0432\u043d\u0443\u0442\u0440\u0438 normalize_phone \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f. \u041e\u0431\u044b\u0447\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0443\u043b\u0435\u0442\u0430\u0435\u0442 \u043d\u0430\u0432\u0435\u0440\u0445 \u0438 \u0440\u043e\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a. ModelRetry \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043d\u0430\u0447\u0435: \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u0441\u0430\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043e\u043d\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0435\u0449\u0451 \u0440\u0430\u0437. \u0422\u0430 \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043c\u0438\u043c\u043e \u0441\u0445\u0435\u043c\u044b: ValidationError \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u0432\u043e\u0434 \u0434\u043b\u044f \u0440\u0435\u0442\u0440\u0430\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u0434\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430, \u043b\u0438\u043c\u0438\u0442 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u043c (retries={&#8216;tools&#8217;: N}) \u0438\u043b\u0438 \u0442\u043e\u0447\u0435\u0447\u043d\u043e \u2014 @agent.tool(retries=N). \u0412 v2 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f ToolFailed \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e: \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0437\u043d\u0430\u0451\u0442 \u043e \u043f\u0440\u043e\u0432\u0430\u043b\u0435, \u043d\u043e \u0431\u044e\u0434\u0436\u0435\u0442 \u0440\u0435\u0442\u0440\u0430\u0435\u0432 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f.\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\u041a\u0430\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u043d\u0430 \u0441\u0442\u044b\u043a\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. output_type \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e. \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 pydantic-\u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u2014 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0430\u0433\u0435\u043d\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435. \u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0438 \u0443\u0439\u0434\u0451\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u043a\u0443, \u043a\u0440\u0438\u0432\u043e\u0439 JSON \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0434\u043e\u0435\u0434\u0435\u0442 \u0434\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438, \u0430 result.output \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f). IDE \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044f, mypy \u043b\u043e\u0432\u0438\u0442 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.from pydantic import BaseModelfrom pydantic_ai import Agent, ModelRetry, RunContextclass RefundDecision(BaseModel):    approved: bool    amount: int    reason: strrefund = Agent(    &#8216;openai:gpt-6.1-sol&#8217;,    output_type=RefundDecision,    instructions=&#8217;\u0420\u0435\u0448\u0430\u0439, \u043e\u0434\u043e\u0431\u0440\u044f\u0442\u044c \u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u2014 \u0434\u043e 50 000.&#8217;,)@refund.output_validatordef check_limit(ctx: RunContext, decision: RefundDecision) -&gt; RefundDecision:    if decision.approved and decision.amount &gt; 50_000:        raise ModelRetry(&#8216;\u0421\u0432\u044b\u0448\u0435 50 000 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u0412\u0435\u0440\u043d\u0438 approved=False.&#8217;)    return decision\u0421\u0445\u0435\u043c\u0430, \u043e\u0434\u043d\u0430\u043a\u043e, \u043b\u043e\u0432\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u043c\u0430\u0442. \u041c\u043e\u0434\u0435\u043b\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0447\u0435\u0441\u0442\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0438\u0446\u0443 \u2014 \u0441\u043a\u0430\u0436\u0435\u043c, \u043e\u0434\u043e\u0431\u0440\u0438\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d. \u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0435\u0441\u0442\u044c @agent.output_validator \u2014 \u0434\u043e\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0445\u0435\u043c\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439, \u043b\u0435\u0437\u0442\u044c \u0432 \u0431\u0430\u0437\u0443, \u0445\u043e\u0434\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u2014 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041f\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438, \u0438 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0443\u0436\u0435 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f. \u0411\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u043e\u043f\u044f\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 retries={&#8216;output&#8217;: N}; \u043a\u043e\u0433\u0434\u0430 \u0431\u044e\u0434\u0436\u0435\u0442 \u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f, \u0437\u0430\u043f\u0443\u0441\u043a \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 UnexpectedModelBehavior \u2014 \u0442\u0438\u0445\u043e \u043f\u0440\u043e\u0433\u043b\u043e\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442.\u0412 output_type \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u0448\u0435 \u0441 output_type=[RefundDecision, str] \u0432\u0435\u0440\u043d\u0451\u0442 \u043b\u0438\u0431\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043b\u0438\u0431\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u2014 \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 Pydantic AI \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c output-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0445\u0435\u043c\u0430 \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 isinstance, \u0430 \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u0432\u0430\u0448\u0435\u0439 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0438 BaseModel \u2014 dataclass, TypedDict \u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u0447\u0442\u043e Pydantic \u0443\u043c\u0435\u0435\u0442 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\u0414\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0438 \u0434\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e \u043c\u0435\u0440\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438: Pydantic \u0443\u043c\u0435\u0435\u0442 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 JSON, \u0438 stream_output() \u0432\u044b\u0434\u0430\u0451\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043f\u0435\u043b.async with refund.run_stream(&#8216;\u041a\u043b\u0438\u0435\u043d\u0442 \u043a\u0443\u043f\u0438\u043b \u0442\u043e\u0441\u0442\u0435\u0440 \u0438 \u0432\u0435\u0440\u043d\u0443\u043b \u0435\u0433\u043e \u0432 \u0442\u043e\u0442 \u0436\u0435 \u0434\u0435\u043d\u044c&#8217;) as result:    async for decision in result.stream_output():        render(decision)  # \u0441\u043d\u0430\u043f\u0448\u043e\u0442: \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0435\u0445\u0430\u0442\u044c\u0414\u043b\u044f \u0447\u0430\u0442-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043e\u0449\u0443\u0442\u0438\u043c\u0430\u044f: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u0430, \u043f\u043e\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0435\u0449\u0451 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u043b\u044f.\u0422\u0435\u0441\u0442\u044b \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 API\u041e\u0431\u044b\u0447\u043d\u043e \u0442\u0435\u0441\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: \u043f\u043e\u0434\u043d\u044f\u043b\u0438 \u043c\u043e\u043a HTTP, \u0437\u0430\u0441\u0442\u0430\u0431\u0438\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0438 \u043c\u043e\u043b\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u0432\u043f\u0430\u043b \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u0418\u043b\u0438, \u0447\u0442\u043e \u0447\u0430\u0449\u0435, \u0430\u0433\u0435\u043d\u0442\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u00ab\u0442\u0430\u043c \u0436\u0435 \u043c\u043e\u0434\u0435\u043b\u044c, \u0447\u0442\u043e \u0442\u0443\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb, \u2014 \u044f \u0438 \u0441\u0430\u043c \u0433\u043e\u0434 \u0436\u0438\u043b \u043f\u043e \u044d\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435. \u0412 Pydantic AI \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0438 \u0441\u0432\u044f\u0437\u043a\u0430 \u00ab\u0430\u0433\u0435\u043d\u0442 + \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b + \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 + \u0432\u044b\u0432\u043e\u0434\u00bb \u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Python-\u043a\u043e\u0434 \u0432 pytest (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f).\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 TestModel&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-500369","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=500369"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500369\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=500369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=500369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=500369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}