{"id":108780,"date":"2025-05-13T08:25:16","date_gmt":"2025-05-13T04:55:16","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/"},"modified":"2025-05-13T08:25:16","modified_gmt":"2025-05-13T04:55:16","slug":"%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/","title":{"rendered":"\u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u0639\u0627\u0645\u0644 \u0627\u0631\u0632 A2A \u0628\u0627 \u0644\u0627\u0646\u06af\u06af\u0631\u0627\u0641"},"content":{"rendered":"<div data-article-id=\"2482631\" id=\"article-body\">\n<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u062a\u0648\u0636\u06cc\u062d \u0645\u0641\u0635\u0644\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0639\u0627\u0645\u0644 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 A2A \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Langgraph \u0648 \u0645\u062f\u0644 Google Gemini \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f. \u0645\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u0645\u0648\u0646\u0647 \u0639\u0627\u0645\u0644 \u0627\u0631\u0632 \u0627\u0632 A2A Python SDK \u0642\u062f\u0645 \u0645\u06cc \u0632\u0646\u06cc\u0645 \u0648 \u0647\u0631 \u0645\u0624\u0644\u0641\u0647 \u060c \u062c\u0631\u06cc\u0627\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0648 \u0686\u06af\u0648\u0646\u06af\u06cc \u067e\u0631\u0648\u062a\u06a9\u0644 A2A \u062a\u0639\u0627\u0645\u0644 \u0639\u0627\u0645\u0644 \u0631\u0627 \u062a\u0633\u0647\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D9%85%D8%B7%D8%A7%D9%84%D8%A8\" >\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D9%86%D9%85%D8%A7%DB%8C_%DA%A9%D9%84%DB%8C\" >\u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C\" >\u0645\u0639\u0645\u0627\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%88_%D9%86%D8%B5%D8%A8\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0648 \u0646\u0635\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D9%85%D8%A4%D9%84%D9%81%D9%87_%D9%87%D8%A7_%D8%AA%D9%88%D8%B6%DB%8C%D8%AD_%D8%AF%D8%A7%D8%AF%D9%87_%D8%B4%D8%AF%D9%87_%D8%A7%D9%86%D8%AF\" >\u0645\u0624\u0644\u0641\u0647 \u0647\u0627 \u062a\u0648\u0636\u06cc\u062d \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0646\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%DA%A9%D8%A7%D8%B1%D8%AA_%D9%88_%D9%85%D9%87%D8%A7%D8%B1%D8%AA_%D9%87%D8%A7%DB%8C_%D8%B9%D8%A7%D9%85%D9%84\" >\u06a9\u0627\u0631\u062a \u0648 \u0645\u0647\u0627\u0631\u062a \u0647\u0627\u06cc \u0639\u0627\u0645\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D8%A7%D8%B1%D8%B2\" >\u0627\u0631\u0632<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D9%85%D8%AC%D8%B1%DB%8C\" >\u0645\u062c\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%DB%8C%D8%A7%D8%B1%D8%A7%D9%86\" >\u06cc\u0627\u0631\u0627\u0646<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D8%AC%D8%B1%DB%8C%D8%A7%D9%86_%D8%A7%D8%AC%D8%B1%D8%A7\" >\u062c\u0631\u06cc\u0627\u0646 \u0627\u062c\u0631\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D8%AA%D8%B9%D8%A7%D9%85%D9%84_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C\" >\u062a\u0639\u0627\u0645\u0644 \u0645\u0634\u062a\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D9%88%DB%8C%DA%98%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87\" >\u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D8%AC%D8%B1%DB%8C%D8%A7%D9%86\" >\u062c\u0631\u06cc\u0627\u0646<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D9%85%DA%A9%D8%A7%D9%84%D9%85%D8%A7%D8%AA_%DA%86%D9%86%D8%AF_%DA%86%D8%B1%D8%AE%D8%B4\" >\u0645\u06a9\u0627\u0644\u0645\u0627\u062a \u0686\u0646\u062f \u0686\u0631\u062e\u0634<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa%d9%86-%db%8c%da%a9-%d8%b9%d8%a7%d9%85%d9%84-%d8%a7%d8%b1%d8%b2-a2a-%d8%a8%d8%a7-%d9%84%d8%a7%d9%86%da%af%da%af%d8%b1%d8%a7%d9%81\/#%D9%85%D8%B1%D8%A7%D8%AD%D9%84_%D8%A8%D8%B9%D8%AF%DB%8C\" >\u0645\u0631\u0627\u062d\u0644 \u0628\u0639\u062f\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D9%85%D8%B7%D8%A7%D9%84%D8%A8\"><\/span>\n<p>  \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc<\/li>\n<li>\u0645\u0639\u0645\u0627\u0631\u06cc<\/li>\n<li>\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0648 \u0646\u0635\u0628<\/li>\n<li>\n<p>\u0645\u0624\u0644\u0641\u0647 \u0647\u0627 \u062a\u0648\u0636\u06cc\u062d \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0646\u062f<\/p>\n<\/li>\n<li>\u062c\u0631\u06cc\u0627\u0646 \u0627\u062c\u0631\u0627<\/li>\n<li>\u062a\u0639\u0627\u0645\u0644 \u0645\u0634\u062a\u0631\u06cc<\/li>\n<li>\n<p>\u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<\/p>\n<\/li>\n<li>\u0645\u0631\u0627\u062d\u0644 \u0628\u0639\u062f\u06cc<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D9%85%D8%A7%DB%8C_%DA%A9%D9%84%DB%8C\"><\/span>\n<p>  \u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0639\u0627\u0645\u0644 \u0627\u0631\u0632 \u06cc\u06a9 \u0639\u0627\u0645\u0644 \u062a\u062e\u0635\u0635\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u062a\u0628\u062f\u06cc\u0644 \u0627\u0631\u0632 \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<ul>\n<li>\n<strong>\u067e\u0631\u0648\u062a\u06a9\u0644 A2a<\/strong>: \u0628\u0631\u0627\u06cc \u0627\u0631\u062a\u0628\u0627\u0637\u0627\u062a \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f<\/li>\n<li>\n<strong>\u0644\u0646\u06af\u0631\u0627\u0641\u06cc<\/strong>: \u0628\u0631\u0627\u06cc \u0627\u0631\u06a9\u0633\u062a\u0631 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0639\u0627\u0645\u0644<\/li>\n<li>\n<strong>\u0645\u062f\u0644 \u062c\u0645\u06cc\u0646\u06cc \u06af\u0648\u06af\u0644<\/strong>: \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u0648\u062a\u0648\u0631 \u0627\u0633\u062a\u062f\u0644\u0627\u0644<\/li>\n<li>\n<strong>API \u062e\u0627\u0631\u062c\u06cc<\/strong>: \u0628\u0631\u0627\u06cc \u0648\u0627\u06a9\u0634\u06cc \u0646\u0631\u062e \u0627\u0631\u0632 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc<\/li>\n<\/ul>\n<p>\u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u0686\u0646\u062f\u06cc\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u0645\u0647\u0645 A2A \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<ul>\n<li>\u067e\u0627\u0633\u062e \u0647\u0627\u06cc \u062c\u0631\u06cc\u0627\u0646 \u0628\u0631\u0627\u06cc \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc<\/li>\n<li>\u0645\u06a9\u0627\u0644\u0645\u0627\u062a \u0686\u0646\u062f \u0686\u0631\u062e\u0634 \u0628\u0631\u0627\u06cc \u0634\u0641\u0627\u0641 \u0633\u0627\u0632\u06cc<\/li>\n<li>\u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0648\u0644\u062a \u0648\u0638\u06cc\u0641\u0647<\/li>\n<li>\u0627\u062f\u063a\u0627\u0645 \u0628\u0627 LLM<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C\"><\/span>\n<p>  \u0645\u0639\u0645\u0627\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0639\u0645\u0627\u0631\u06cc \u0633\u0637\u062d \u0628\u0627\u0644\u0627\u06cc\u06cc \u0627\u0632 \u0627\u0631\u0632:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faogyiaqkvwumq9na1d17.jpg\" alt=\"\u0634\u0631\u062d \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"705\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>graph TD\n    Client[Client] &lt;--&gt;|A2A Protocol| Server[A2A Server]\n    Server --&gt; RequestHandler[DefaultA2ARequestHandler]\n    RequestHandler --&gt; Executor[CurrencyAgentExecutor]\n    Executor --&gt; Agent[CurrencyAgent]\n    Agent --&gt; |Uses| Gemini[Gemini LLM]\n    Agent --&gt; |Calls| ExchangeAPI[Exchange Rate API]\n\n    subgraph \"Task Management\"\n        Executor --&gt; TaskStore[InMemoryTaskStore]\n    end\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%88_%D9%86%D8%B5%D8%A8\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0648 \u0646\u0635\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u060c \u0634\u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f:<\/p>\n<ol>\n<li>\u067e\u0627\u06cc\u062a\u0648\u0646 3.10 \u06cc\u0627 \u0628\u0627\u0644\u0627\u062a\u0631<\/li>\n<li>\u06cc\u06a9 \u06a9\u0644\u06cc\u062f API \u062c\u0645\u06cc\u0646\u06cc<\/li>\n<\/ol>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0645\u062e\u0632\u0646 A2A \u0631\u0627 \u06a9\u0644\u0648\u0646 \u06a9\u0631\u062f\u0647 \u0648 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>git clone https:\/\/github.com\/google\/A2A.git <span class=\"nt\">-b<\/span> main <span class=\"nt\">--depth<\/span> 1\n<span class=\"nb\">cd <\/span>A2A\/a2a-python-sdk\npython <span class=\"nt\">-m<\/span> venv .venv\n<span class=\"nb\">source<\/span> .venv\/bin\/activate  <span class=\"c\"># On Windows: .venv\\Scripts\\activate<\/span>\npip <span class=\"nb\">install<\/span> <span class=\"nt\">-e<\/span> .[dev]\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u067e\u0633 \u060c \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>.env<\/code> \u067e\u0631\u0648\u0646\u062f\u0647 \u062f\u0631 <code>examples\/langgraph\/<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">echo<\/span> <span class=\"s2\">\"GOOGLE_API_KEY=YOUR_API_KEY_HERE\"<\/span> <span class=\"o\">&gt;<\/span> a2a-python-sdk\/examples\/langgraph\/.env\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%A4%D9%84%D9%81%D9%87_%D9%87%D8%A7_%D8%AA%D9%88%D8%B6%DB%8C%D8%AD_%D8%AF%D8%A7%D8%AF%D9%87_%D8%B4%D8%AF%D9%87_%D8%A7%D9%86%D8%AF\"><\/span>\n<p>  \u0645\u0624\u0644\u0641\u0647 \u0647\u0627 \u062a\u0648\u0636\u06cc\u062d \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0646\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u0645\u0624\u0644\u0641\u0647 \u0647\u0627\u06cc \u0627\u0631\u0632 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%DA%A9%D8%A7%D8%B1%D8%AA_%D9%88_%D9%85%D9%87%D8%A7%D8%B1%D8%AA_%D9%87%D8%A7%DB%8C_%D8%B9%D8%A7%D9%85%D9%84\"><\/span>\n<p>  \u06a9\u0627\u0631\u062a \u0648 \u0645\u0647\u0627\u0631\u062a \u0647\u0627\u06cc \u0639\u0627\u0645\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06a9\u0627\u0631\u062a \u0639\u0627\u0645\u0644 \u0647\u0648\u06cc\u062a \u060c \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627 \u0648 \u0645\u0647\u0627\u0631\u062a \u0647\u0627\u06cc \u0639\u0627\u0645\u0644 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u062f\u0631 \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0627\u0633\u062a <code>__main__.py<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">def<\/span> <span class=\"nf\">get_agent_card<\/span><span class=\"p\">(<\/span><span class=\"n\">host<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">port<\/span><span class=\"p\">:<\/span> <span class=\"nb\">int<\/span><span class=\"p\">):<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Returns the Agent Card for the Currency Agent.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"n\">capabilities<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">AgentCapabilities<\/span><span class=\"p\">(<\/span><span class=\"n\">streaming<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">,<\/span> <span class=\"n\">pushNotifications<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">skill<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">AgentSkill<\/span><span class=\"p\">(<\/span>\n        <span class=\"nb\">id<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">convert_currency<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">Currency Exchange Rates Tool<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">description<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">Helps with exchange values between various currencies<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tags<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">currency conversion<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">currency exchange<\/span><span class=\"sh\">'<\/span><span class=\"p\">],<\/span>\n        <span class=\"n\">examples<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">What is exchange rate between USD and GBP?<\/span><span class=\"sh\">'<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nc\">AgentCard<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">Currency Agent<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">description<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">Helps with exchange rates for currencies<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">url<\/span><span class=\"o\">=<\/span><span class=\"sa\">f<\/span><span class=\"sh\">'<\/span><span class=\"s\">http:\/\/<\/span><span class=\"si\">{<\/span><span class=\"n\">host<\/span><span class=\"si\">}<\/span><span class=\"s\">:<\/span><span class=\"si\">{<\/span><span class=\"n\">port<\/span><span class=\"si\">}<\/span><span class=\"s\">\/<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">version<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">1.0.0<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">defaultInputModes<\/span><span class=\"o\">=<\/span><span class=\"n\">CurrencyAgent<\/span><span class=\"p\">.<\/span><span class=\"n\">SUPPORTED_CONTENT_TYPES<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">defaultOutputModes<\/span><span class=\"o\">=<\/span><span class=\"n\">CurrencyAgent<\/span><span class=\"p\">.<\/span><span class=\"n\">SUPPORTED_CONTENT_TYPES<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">capabilities<\/span><span class=\"o\">=<\/span><span class=\"n\">capabilities<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">skills<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"n\">skill<\/span><span class=\"p\">],<\/span>\n        <span class=\"n\">authentication<\/span><span class=\"o\">=<\/span><span class=\"nc\">AgentAuthentication<\/span><span class=\"p\">(<\/span><span class=\"n\">schemes<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">public<\/span><span class=\"sh\">'<\/span><span class=\"p\">]),<\/span>\n    <span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0646\u06a9\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc:<\/p>\n<ul>\n<li>\u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u06cc\u06a9 \u0645\u0647\u0627\u0631\u062a \u0648\u0627\u062d\u062f \u062f\u0627\u0631\u062f: <code>convert_currency<\/code>\n<\/li>\n<li>\u0627\u0632 \u062c\u0631\u06cc\u0627\u0646 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f (<code>capabilities.streaming=True<\/code>)<\/li>\n<li>\u0627\u0646\u0648\u0627\u0639 \u0645\u062d\u062a\u0648\u0627\u06cc \u0645\u062a\u0646 \u0631\u0627 \u0645\u06cc \u067e\u0630\u06cc\u0631\u062f \u0648 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f<\/li>\n<li>\u0627\u0632 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0639\u0645\u0648\u0645\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f (\u0628\u062f\u0648\u0646 AUTH \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a)<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B1%D8%B2\"><\/span>\n<p>  \u0627\u0631\u0632<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 <code>CurrencyAgent<\/code> \u062f\u0631 \u06a9\u0644\u0627\u0633 <code>agent.py<\/code> \u0634\u0627\u0645\u0644 \u0645\u0646\u0637\u0642 \u0627\u0635\u0644\u06cc \u0639\u0627\u0645\u0644 \u0627\u0633\u062a:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftd0fxrkj26xpsca067i6.jpg\" alt=\"\u0634\u0631\u062d \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"762\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>classDiagram\n    class CurrencyAgent {\n        +SYSTEM_INSTRUCTION: str\n        +RESPONSE_FORMAT_INSTRUCTION: str\n        +SUPPORTED_CONTENT_TYPES: list\n        -model: ChatGoogleGenerativeAI\n        -tools: list\n        -graph: AgentGraph\n        +invoke(query: str, sessionId: str): dict\n        +stream(query: str, sessionId: str): AsyncGenerator\n        -get_agent_response(config: dict): dict\n    }\n\n    class get_exchange_rate {\n        &lt;<function>&gt;\n    }\n\n    class ResponseFormat {\n        &lt;<interface>&gt;\n    }\n\n    CurrencyAgent ..&gt; get_exchange_rate : uses\n    CurrencyAgent ..&gt; ResponseFormat : returns\n\n<\/interface><\/function><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u0635\u0644\u06cc \u0634\u0627\u0645\u0644 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<ol>\n<li>\n<strong>\u062a\u0639\u0631\u06cc\u0641 \u0627\u0628\u0632\u0627\u0631<\/strong>: <code>get_exchange_rate<\/code> \u0627\u0628\u0632\u0627\u0631 \u0646\u0631\u062e \u0627\u0631\u0632 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u0627\u0632 \u06cc\u06a9 API \u062e\u0627\u0631\u062c\u06cc \u0648\u0627\u06af\u0630\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"nd\">@tool<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">get_exchange_rate<\/span><span class=\"p\">(<\/span>\n    <span class=\"n\">currency_from<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">'<\/span><span class=\"s\">USD<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">currency_to<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">'<\/span><span class=\"s\">EUR<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">currency_date<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">'<\/span><span class=\"s\">latest<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">):<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Use this to get current exchange rate.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">response<\/span> <span class=\"o\">=<\/span> <span class=\"n\">httpx<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span>\n            <span class=\"sa\">f<\/span><span class=\"sh\">'<\/span><span class=\"s\">https:\/\/api.frankfurter.app\/<\/span><span class=\"si\">{<\/span><span class=\"n\">currency_date<\/span><span class=\"si\">}<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">params<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">from<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"n\">currency_from<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">to<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"n\">currency_to<\/span><span class=\"p\">},<\/span>\n        <span class=\"p\">)<\/span>\n        <span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">raise_for_status<\/span><span class=\"p\">()<\/span>\n\n        <span class=\"n\">data<\/span> <span class=\"o\">=<\/span> <span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">()<\/span>\n        <span class=\"c1\"># ... error handling code\n<\/span>        <span class=\"k\">return<\/span> <span class=\"n\">data<\/span>\n    <span class=\"k\">except<\/span> <span class=\"n\">httpx<\/span><span class=\"p\">.<\/span><span class=\"n\">HTTPError<\/span> <span class=\"k\">as<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">error<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sa\">f<\/span><span class=\"sh\">'<\/span><span class=\"s\">API request failed: <\/span><span class=\"si\">{<\/span><span class=\"n\">e<\/span><span class=\"si\">}<\/span><span class=\"sh\">'<\/span><span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ol>\n<li>\n<strong>\u062a\u0639\u0631\u06cc\u0641 \u0639\u0627\u0645\u0644<\/strong>: \u0639\u0627\u0645\u0644 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Langgraph \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0627\u0633\u062a <code>create_react_agent<\/code>:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">model<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">ChatGoogleGenerativeAI<\/span><span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">gemini-2.0-flash<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">tools<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">get_exchange_rate<\/span><span class=\"p\">]<\/span>\n\n    <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">graph<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_react_agent<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">model<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tools<\/span><span class=\"o\">=<\/span><span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">tools<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">checkpointer<\/span><span class=\"o\">=<\/span><span class=\"n\">memory<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">prompt<\/span><span class=\"o\">=<\/span><span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">SYSTEM_INSTRUCTION<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">response_format<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">RESPONSE_FORMAT_INSTRUCTION<\/span><span class=\"p\">,<\/span> <span class=\"n\">ResponseFormat<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ol>\n<li>\n<strong>\u0642\u0627\u0644\u0628 \u067e\u0627\u0633\u062e<\/strong>: \u06cc\u06a9 \u0642\u0627\u0644\u0628 \u0633\u0627\u062e\u062a\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u067e\u0627\u0633\u062e \u0647\u0627\u06cc \u0639\u0627\u0645\u0644:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">class<\/span> <span class=\"nc\">ResponseFormat<\/span><span class=\"p\">(<\/span><span class=\"n\">BaseModel<\/span><span class=\"p\">):<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Respond to the user in this format.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"n\">status<\/span><span class=\"p\">:<\/span> <span class=\"n\">Literal<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">input_required<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">completed<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">error<\/span><span class=\"sh\">'<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">'<\/span><span class=\"s\">input_required<\/span><span class=\"sh\">'<\/span>\n    <span class=\"n\">message<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ol>\n<li>\n<strong>\u0631\u0648\u0634\u0647\u0627\u06cc \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc<\/strong>: \u0631\u0648\u0634 \u0647\u0627\u06cc \u062f\u0639\u0648\u062a \u0645\u0633\u062a\u0642\u06cc\u0645 \u0648 \u062c\u0631\u06cc\u0627\u0646:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">def<\/span> <span class=\"nf\">invoke<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">query<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">sessionId<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">[<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">Any<\/span><span class=\"p\">]:<\/span>\n    <span class=\"n\">config<\/span><span class=\"p\">:<\/span> <span class=\"n\">RunnableConfig<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">configurable<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">thread_id<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"n\">sessionId<\/span><span class=\"p\">}}<\/span>\n    <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">graph<\/span><span class=\"p\">.<\/span><span class=\"nf\">invoke<\/span><span class=\"p\">({<\/span><span class=\"sh\">'<\/span><span class=\"s\">messages<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"p\">[(<\/span><span class=\"sh\">'<\/span><span class=\"s\">user<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"n\">query<\/span><span class=\"p\">)]},<\/span> <span class=\"n\">config<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">get_agent_response<\/span><span class=\"p\">(<\/span><span class=\"n\">config<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">stream<\/span><span class=\"p\">(<\/span>\n    <span class=\"n\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">query<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">sessionId<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span>\n<span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">AsyncIterable<\/span><span class=\"p\">[<\/span><span class=\"nb\">dict<\/span><span class=\"p\">[<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">Any<\/span><span class=\"p\">]]:<\/span>\n    <span class=\"n\">inputs<\/span><span class=\"p\">:<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">[<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">Any<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">messages<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"p\">[(<\/span><span class=\"sh\">'<\/span><span class=\"s\">user<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"n\">query<\/span><span class=\"p\">)]}<\/span>\n    <span class=\"n\">config<\/span><span class=\"p\">:<\/span> <span class=\"n\">RunnableConfig<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">configurable<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">thread_id<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"n\">sessionId<\/span><span class=\"p\">}}<\/span>\n\n    <span class=\"k\">for<\/span> <span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">graph<\/span><span class=\"p\">.<\/span><span class=\"nf\">stream<\/span><span class=\"p\">(<\/span><span class=\"n\">inputs<\/span><span class=\"p\">,<\/span> <span class=\"n\">config<\/span><span class=\"p\">,<\/span> <span class=\"n\">stream_mode<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">values<\/span><span class=\"sh\">'<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"n\">item<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">messages<\/span><span class=\"sh\">'<\/span><span class=\"p\">][<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span>\n        <span class=\"k\">if<\/span> <span class=\"nf\">isinstance<\/span><span class=\"p\">(<\/span><span class=\"n\">message<\/span><span class=\"p\">,<\/span> <span class=\"n\">AIMessage<\/span><span class=\"p\">)<\/span> <span class=\"ow\">and<\/span> <span class=\"n\">message<\/span><span class=\"p\">.<\/span><span class=\"n\">tool_calls<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">yield<\/span> <span class=\"p\">{<\/span>\n                <span class=\"sh\">'<\/span><span class=\"s\">is_task_complete<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\n                <span class=\"sh\">'<\/span><span class=\"s\">require_user_input<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\n                <span class=\"sh\">'<\/span><span class=\"s\">content<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">Looking up the exchange rates...<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"k\">elif<\/span> <span class=\"nf\">isinstance<\/span><span class=\"p\">(<\/span><span class=\"n\">message<\/span><span class=\"p\">,<\/span> <span class=\"n\">ToolMessage<\/span><span class=\"p\">):<\/span>\n            <span class=\"k\">yield<\/span> <span class=\"p\">{<\/span>\n                <span class=\"sh\">'<\/span><span class=\"s\">is_task_complete<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\n                <span class=\"sh\">'<\/span><span class=\"s\">require_user_input<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\n                <span class=\"sh\">'<\/span><span class=\"s\">content<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">Processing the exchange rates..<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n            <span class=\"p\">}<\/span>\n\n    <span class=\"k\">yield<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">get_agent_response<\/span><span class=\"p\">(<\/span><span class=\"n\">config<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AC%D8%B1%DB%8C\"><\/span>\n<p>  \u0645\u062c\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 <code>CurrencyAgentExecutor<\/code> \u062f\u0631 <code>agent_executor.py<\/code> \u0639\u0627\u0645\u0644 Langgraph \u0631\u0627 \u0628\u0627 \u067e\u0631\u0648\u062a\u06a9\u0644 A2A \u0633\u0627\u0632\u06af\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">class<\/span> <span class=\"nc\">CurrencyAgentExecutor<\/span><span class=\"p\">(<\/span><span class=\"n\">BaseAgentExecutor<\/span><span class=\"p\">):<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Currency AgentExecutor Example.<\/span><span class=\"sh\">\"\"\"<\/span>\n\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">agent<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">CurrencyAgent<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"nd\">@override<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">on_message_send<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">self<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">request<\/span><span class=\"p\">:<\/span> <span class=\"n\">SendMessageRequest<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">event_queue<\/span><span class=\"p\">:<\/span> <span class=\"n\">EventQueue<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">task<\/span><span class=\"p\">:<\/span> <span class=\"n\">Task<\/span> <span class=\"o\">|<\/span> <span class=\"bp\">None<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"bp\">None<\/span><span class=\"p\">:<\/span>\n        <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Handler for <\/span><span class=\"sh\">'<\/span><span class=\"s\">message\/send<\/span><span class=\"sh\">'<\/span><span class=\"s\"> requests.<\/span><span class=\"sh\">\"\"\"<\/span>\n        <span class=\"n\">params<\/span><span class=\"p\">:<\/span> <span class=\"n\">MessageSendParams<\/span> <span class=\"o\">=<\/span> <span class=\"n\">request<\/span><span class=\"p\">.<\/span><span class=\"n\">params<\/span>\n        <span class=\"n\">query<\/span> <span class=\"o\">=<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">_get_user_query<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">task<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">task<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_task_obj<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"c1\"># invoke the underlying agent\n<\/span>        <span class=\"n\">agent_response<\/span><span class=\"p\">:<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">[<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">Any<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">agent<\/span><span class=\"p\">.<\/span><span class=\"nf\">invoke<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">query<\/span><span class=\"p\">,<\/span> <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">contextId<\/span>\n        <span class=\"p\">)<\/span>\n        <span class=\"nf\">update_task_with_agent_response<\/span><span class=\"p\">(<\/span><span class=\"n\">task<\/span><span class=\"p\">,<\/span> <span class=\"n\">agent_response<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">event_queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">enqueue_event<\/span><span class=\"p\">(<\/span><span class=\"n\">task<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"nd\">@override<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">on_message_stream<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">self<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">request<\/span><span class=\"p\">:<\/span> <span class=\"n\">SendStreamingMessageRequest<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">event_queue<\/span><span class=\"p\">:<\/span> <span class=\"n\">EventQueue<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">task<\/span><span class=\"p\">:<\/span> <span class=\"n\">Task<\/span> <span class=\"o\">|<\/span> <span class=\"bp\">None<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"bp\">None<\/span><span class=\"p\">:<\/span>\n        <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Handler for <\/span><span class=\"sh\">'<\/span><span class=\"s\">message\/stream<\/span><span class=\"sh\">'<\/span><span class=\"s\"> requests.<\/span><span class=\"sh\">\"\"\"<\/span>\n        <span class=\"n\">params<\/span><span class=\"p\">:<\/span> <span class=\"n\">MessageSendParams<\/span> <span class=\"o\">=<\/span> <span class=\"n\">request<\/span><span class=\"p\">.<\/span><span class=\"n\">params<\/span>\n        <span class=\"n\">query<\/span> <span class=\"o\">=<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">_get_user_query<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">task<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">task<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_task_obj<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"p\">)<\/span>\n            <span class=\"c1\"># emit the initial task so it is persisted to TaskStore\n<\/span>            <span class=\"n\">event_queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">enqueue_event<\/span><span class=\"p\">(<\/span><span class=\"n\">task<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"c1\"># kickoff the streaming agent and process responses\n<\/span>        <span class=\"k\">async<\/span> <span class=\"k\">for<\/span> <span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">agent<\/span><span class=\"p\">.<\/span><span class=\"nf\">stream<\/span><span class=\"p\">(<\/span><span class=\"n\">query<\/span><span class=\"p\">,<\/span> <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">contextId<\/span><span class=\"p\">):<\/span>\n            <span class=\"n\">task_artifact_update_event<\/span><span class=\"p\">,<\/span> <span class=\"n\">task_status_event<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\n                <span class=\"nf\">process_streaming_agent_response<\/span><span class=\"p\">(<\/span><span class=\"n\">task<\/span><span class=\"p\">,<\/span> <span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n            <span class=\"p\">)<\/span>\n\n            <span class=\"k\">if<\/span> <span class=\"n\">task_artifact_update_event<\/span><span class=\"p\">:<\/span>\n                <span class=\"n\">event_queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">enqueue_event<\/span><span class=\"p\">(<\/span><span class=\"n\">task_artifact_update_event<\/span><span class=\"p\">)<\/span>\n\n            <span class=\"n\">event_queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">enqueue_event<\/span><span class=\"p\">(<\/span><span class=\"n\">task_status_event<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">def<\/span> <span class=\"nf\">_get_user_query<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">task_send_params<\/span><span class=\"p\">:<\/span> <span class=\"n\">MessageSendParams<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nb\">str<\/span><span class=\"p\">:<\/span>\n        <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Helper to get user query from task send params.<\/span><span class=\"sh\">\"\"\"<\/span>\n        <span class=\"n\">part<\/span> <span class=\"o\">=<\/span> <span class=\"n\">task_send_params<\/span><span class=\"p\">.<\/span><span class=\"n\">message<\/span><span class=\"p\">.<\/span><span class=\"n\">parts<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">].<\/span><span class=\"n\">root<\/span>\n        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"nf\">isinstance<\/span><span class=\"p\">(<\/span><span class=\"n\">part<\/span><span class=\"p\">,<\/span> <span class=\"n\">TextPart<\/span><span class=\"p\">):<\/span>\n            <span class=\"k\">raise<\/span> <span class=\"nc\">ValueError<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">Only text parts are supported<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">part<\/span><span class=\"p\">.<\/span><span class=\"n\">text<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u0645\u062c\u0631\u06cc \u062f\u0648 \u0631\u0648\u0634 \u0627\u0635\u0644\u06cc \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<ol>\n<li>\n<code>on_message_send<\/code>: \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u0647\u0645\u0632\u0645\u0627\u0646 \u0631\u0627 \u06a9\u0646\u062a\u0631\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u06cc\u06a9 \u067e\u0627\u0633\u062e \u06a9\u0627\u0645\u0644 \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f<\/li>\n<li>\n<code>on_message_stream<\/code>: \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u062c\u0631\u06cc\u0627\u0646 \u0631\u0627 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0631\u062f\u0647 \u0648 \u0648\u0642\u0627\u06cc\u0639 \u0631\u0627 \u0647\u0646\u06af\u0627\u0645 \u0648\u0642\u0648\u0639 \u0645\u0646\u062a\u0634\u0631 \u0645\u06cc \u06a9\u0646\u062f<\/li>\n<\/ol>\n<h3><span class=\"ez-toc-section\" id=\"%DB%8C%D8%A7%D8%B1%D8%A7%D9%86\"><\/span>\n<p>  \u06cc\u0627\u0631\u0627\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 <code>helpers.py<\/code> \u067e\u0631\u0648\u0646\u062f\u0647 \u0634\u0627\u0645\u0644 \u062a\u0648\u0627\u0628\u0639 \u0627\u0628\u0632\u0627\u0631 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0638\u0627\u06cc\u0641 \u0648 \u062a\u0628\u062f\u06cc\u0644 \u067e\u0627\u0633\u062e \u0647\u0627\u06cc \u0639\u0627\u0645\u0644 \u0628\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u067e\u0631\u0648\u062a\u06a9\u0644 A2A \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">def<\/span> <span class=\"nf\">update_task_with_agent_response<\/span><span class=\"p\">(<\/span>\n    <span class=\"n\">task<\/span><span class=\"p\">:<\/span> <span class=\"n\">Task<\/span><span class=\"p\">,<\/span> <span class=\"n\">agent_response<\/span><span class=\"p\">:<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">[<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">Any<\/span><span class=\"p\">]<\/span>\n<span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"bp\">None<\/span><span class=\"p\">:<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Updates the provided task with the agent response.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">status<\/span><span class=\"p\">.<\/span><span class=\"n\">timestamp<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">().<\/span><span class=\"nf\">isoformat<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">parts<\/span><span class=\"p\">:<\/span> <span class=\"nb\">list<\/span><span class=\"p\">[<\/span><span class=\"n\">Part<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"nc\">Part<\/span><span class=\"p\">(<\/span><span class=\"nc\">TextPart<\/span><span class=\"p\">(<\/span><span class=\"n\">text<\/span><span class=\"o\">=<\/span><span class=\"n\">agent_response<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">content<\/span><span class=\"sh\">'<\/span><span class=\"p\">]))]<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">agent_response<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">require_user_input<\/span><span class=\"sh\">'<\/span><span class=\"p\">]:<\/span>\n        <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">status<\/span><span class=\"p\">.<\/span><span class=\"n\">state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">TaskState<\/span><span class=\"p\">.<\/span><span class=\"n\">input_required<\/span>\n        <span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Message<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">messageId<\/span><span class=\"o\">=<\/span><span class=\"nf\">str<\/span><span class=\"p\">(<\/span><span class=\"nf\">uuid4<\/span><span class=\"p\">()),<\/span>\n            <span class=\"n\">role<\/span><span class=\"o\">=<\/span><span class=\"n\">Role<\/span><span class=\"p\">.<\/span><span class=\"n\">agent<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">parts<\/span><span class=\"o\">=<\/span><span class=\"n\">parts<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">)<\/span>\n        <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">status<\/span><span class=\"p\">.<\/span><span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"n\">message<\/span>\n        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">history<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">history<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[]<\/span>\n\n        <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">history<\/span><span class=\"p\">.<\/span><span class=\"nf\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">message<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">status<\/span><span class=\"p\">.<\/span><span class=\"n\">state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">TaskState<\/span><span class=\"p\">.<\/span><span class=\"n\">completed<\/span>\n        <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">status<\/span><span class=\"p\">.<\/span><span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">None<\/span>\n        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">artifacts<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">artifacts<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[]<\/span>\n\n        <span class=\"n\">artifact<\/span><span class=\"p\">:<\/span> <span class=\"n\">Artifact<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Artifact<\/span><span class=\"p\">(<\/span><span class=\"n\">parts<\/span><span class=\"o\">=<\/span><span class=\"n\">parts<\/span><span class=\"p\">,<\/span> <span class=\"n\">artifactId<\/span><span class=\"o\">=<\/span><span class=\"nf\">str<\/span><span class=\"p\">(<\/span><span class=\"nf\">uuid4<\/span><span class=\"p\">()))<\/span>\n        <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">artifacts<\/span><span class=\"p\">.<\/span><span class=\"nf\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">artifact<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">process_streaming_agent_response<\/span><span class=\"p\">(<\/span>\n    <span class=\"n\">task<\/span><span class=\"p\">:<\/span> <span class=\"n\">Task<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">agent_response<\/span><span class=\"p\">:<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">[<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">Any<\/span><span class=\"p\">],<\/span>\n<span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nb\">tuple<\/span><span class=\"p\">[<\/span><span class=\"n\">TaskArtifactUpdateEvent<\/span> <span class=\"o\">|<\/span> <span class=\"bp\">None<\/span><span class=\"p\">,<\/span> <span class=\"n\">TaskStatusUpdateEvent<\/span><span class=\"p\">]:<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Processes the streaming agent responses and returns TaskArtifactUpdateEvent and TaskStatusUpdateEvent.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"n\">is_task_complete<\/span> <span class=\"o\">=<\/span> <span class=\"n\">agent_response<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">is_task_complete<\/span><span class=\"sh\">'<\/span><span class=\"p\">]<\/span>\n    <span class=\"n\">require_user_input<\/span> <span class=\"o\">=<\/span> <span class=\"n\">agent_response<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">require_user_input<\/span><span class=\"sh\">'<\/span><span class=\"p\">]<\/span>\n    <span class=\"n\">parts<\/span><span class=\"p\">:<\/span> <span class=\"nb\">list<\/span><span class=\"p\">[<\/span><span class=\"n\">Part<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"nc\">Part<\/span><span class=\"p\">(<\/span><span class=\"nc\">TextPart<\/span><span class=\"p\">(<\/span><span class=\"n\">text<\/span><span class=\"o\">=<\/span><span class=\"n\">agent_response<\/span><span class=\"p\">[<\/span><span class=\"sh\">'<\/span><span class=\"s\">content<\/span><span class=\"sh\">'<\/span><span class=\"p\">]))]<\/span>\n\n    <span class=\"n\">end_stream<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">False<\/span>\n    <span class=\"n\">artifact<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">None<\/span>\n    <span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">None<\/span>\n\n    <span class=\"c1\"># responses from this agent can be working\/completed\/input-required\n<\/span>    <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">is_task_complete<\/span> <span class=\"ow\">and<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">require_user_input<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">task_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">TaskState<\/span><span class=\"p\">.<\/span><span class=\"n\">working<\/span>\n        <span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Message<\/span><span class=\"p\">(<\/span><span class=\"n\">role<\/span><span class=\"o\">=<\/span><span class=\"n\">Role<\/span><span class=\"p\">.<\/span><span class=\"n\">agent<\/span><span class=\"p\">,<\/span> <span class=\"n\">parts<\/span><span class=\"o\">=<\/span><span class=\"n\">parts<\/span><span class=\"p\">,<\/span> <span class=\"n\">messageId<\/span><span class=\"o\">=<\/span><span class=\"nf\">str<\/span><span class=\"p\">(<\/span><span class=\"nf\">uuid4<\/span><span class=\"p\">()))<\/span>\n    <span class=\"k\">elif<\/span> <span class=\"n\">require_user_input<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">task_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">TaskState<\/span><span class=\"p\">.<\/span><span class=\"n\">input_required<\/span>\n        <span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Message<\/span><span class=\"p\">(<\/span><span class=\"n\">role<\/span><span class=\"o\">=<\/span><span class=\"n\">Role<\/span><span class=\"p\">.<\/span><span class=\"n\">agent<\/span><span class=\"p\">,<\/span> <span class=\"n\">parts<\/span><span class=\"o\">=<\/span><span class=\"n\">parts<\/span><span class=\"p\">,<\/span> <span class=\"n\">messageId<\/span><span class=\"o\">=<\/span><span class=\"nf\">str<\/span><span class=\"p\">(<\/span><span class=\"nf\">uuid4<\/span><span class=\"p\">()))<\/span>\n        <span class=\"n\">end_stream<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n    <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">task_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">TaskState<\/span><span class=\"p\">.<\/span><span class=\"n\">completed<\/span>\n        <span class=\"n\">artifact<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Artifact<\/span><span class=\"p\">(<\/span><span class=\"n\">parts<\/span><span class=\"o\">=<\/span><span class=\"n\">parts<\/span><span class=\"p\">,<\/span> <span class=\"n\">artifactId<\/span><span class=\"o\">=<\/span><span class=\"nf\">str<\/span><span class=\"p\">(<\/span><span class=\"nf\">uuid4<\/span><span class=\"p\">()))<\/span>\n        <span class=\"n\">end_stream<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n\n    <span class=\"n\">task_artifact_update_event<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">None<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">artifact<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">task_artifact_update_event<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">TaskArtifactUpdateEvent<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">taskId<\/span><span class=\"o\">=<\/span><span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"nb\">id<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">contextId<\/span><span class=\"o\">=<\/span><span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">contextId<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">artifact<\/span><span class=\"o\">=<\/span><span class=\"n\">artifact<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">append<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">lastChunk<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">)<\/span>\n\n    <span class=\"n\">task_status_event<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">TaskStatusUpdateEvent<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">taskId<\/span><span class=\"o\">=<\/span><span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"nb\">id<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">contextId<\/span><span class=\"o\">=<\/span><span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">contextId<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">status<\/span><span class=\"o\">=<\/span><span class=\"nc\">TaskStatus<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">state<\/span><span class=\"o\">=<\/span><span class=\"n\">task_state<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">message<\/span><span class=\"o\">=<\/span><span class=\"n\">message<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">timestamp<\/span><span class=\"o\">=<\/span><span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">().<\/span><span class=\"nf\">isoformat<\/span><span class=\"p\">(),<\/span>\n        <span class=\"p\">),<\/span>\n        <span class=\"n\">final<\/span><span class=\"o\">=<\/span><span class=\"n\">end_stream<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"n\">task_artifact_update_event<\/span><span class=\"p\">,<\/span> <span class=\"n\">task_status_event<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0648\u0627\u0628\u0639 \u06a9\u0644\u06cc\u062f\u06cc \u0642\u0627\u0644\u0628 \u067e\u0627\u0633\u062e \u062f\u0627\u062e\u0644\u06cc \u0639\u0627\u0645\u0644 \u0631\u0627 \u0628\u0647 \u0645\u062f\u0644 \u0631\u0648\u06cc\u062f\u0627\u062f \u067e\u0631\u0648\u062a\u06a9\u0644 A2A \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AC%D8%B1%DB%8C%D8%A7%D9%86_%D8%A7%D8%AC%D8%B1%D8%A7\"><\/span>\n<p>  \u062c\u0631\u06cc\u0627\u0646 \u0627\u062c\u0631\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06a9\u0644 \u062c\u0631\u06cc\u0627\u0646 \u0627\u062c\u0631\u0627\u06cc \u0631\u0627 \u062f\u0631 \u0647\u0646\u06af\u0627\u0645 \u062a\u0639\u0627\u0645\u0644 \u0645\u0634\u062a\u0631\u06cc \u0628\u0627 \u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0627\u0631\u0632 \u062a\u062c\u0633\u0645 \u06a9\u0646\u06cc\u0645:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhoz8wz8tzmmlgl809fkq.jpg\" alt=\"\u0634\u0631\u062d \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"762\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>sequenceDiagram\n    participant Client\n    participant A2AServer\n    participant RequestHandler\n    participant Executor as CurrencyAgentExecutor\n    participant Agent as CurrencyAgent\n    participant LLM as Gemini LLM\n    participant API as Exchange Rate API\n\n    Client-&gt;&gt;A2AServer: Request Agent Card\n    A2AServer-&gt;&gt;Client: Return Agent Card\n\n    %% Single turn conversation\n    Client-&gt;&gt;A2AServer: message\/send\n    A2AServer-&gt;&gt;RequestHandler: Route request\n    RequestHandler-&gt;&gt;Executor: on_message_send\n    Executor-&gt;&gt;Agent: invoke(query, contextId)\n    Agent-&gt;&gt;LLM: Process with Gemini\n    LLM--&gt;&gt;Agent: Need exchange rate info\n    Agent-&gt;&gt;API: get_exchange_rate\n    API--&gt;&gt;Agent: Return exchange data\n    Agent-&gt;&gt;LLM: Process with data\n    LLM--&gt;&gt;Agent: Generate response\n    Agent--&gt;&gt;Executor: Return response dict\n    Executor--&gt;&gt;RequestHandler: Update Task &amp; enqueue event\n    RequestHandler--&gt;&gt;A2AServer: Return Task with results\n    A2AServer--&gt;&gt;Client: Send response\n\n    %% Streaming example\n    Client-&gt;&gt;A2AServer: message\/sendStream\n    A2AServer-&gt;&gt;RequestHandler: Route streaming request\n    RequestHandler-&gt;&gt;Executor: on_message_stream\n    Executor-&gt;&gt;Agent: stream(query, contextId)\n    Agent-&gt;&gt;LLM: Start processing\n\n    LLM--&gt;&gt;Agent: Need exchange rate\n    Agent--&gt;&gt;Executor: Yield status update\n    Executor--&gt;&gt;RequestHandler: Enqueue TaskStatusUpdateEvent\n    RequestHandler--&gt;&gt;A2AServer: SSE event\n    A2AServer--&gt;&gt;Client: Stream status update\n\n    Agent-&gt;&gt;API: get_exchange_rate\n    API--&gt;&gt;Agent: Return exchange data\n    Agent--&gt;&gt;Executor: Yield process update\n    Executor--&gt;&gt;RequestHandler: Enqueue TaskStatusUpdateEvent\n    RequestHandler--&gt;&gt;A2AServer: SSE event\n    A2AServer--&gt;&gt;Client: Stream process update\n\n    Agent-&gt;&gt;LLM: Process with data\n    LLM--&gt;&gt;Agent: Generate final response\n    Agent--&gt;&gt;Executor: Yield final response\n    Executor--&gt;&gt;RequestHandler: Enqueue TaskArtifactUpdateEvent &amp; TaskStatusUpdateEvent\n    RequestHandler--&gt;&gt;A2AServer: Final SSE events\n    A2AServer--&gt;&gt;Client: Stream final result\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%D8%B9%D8%A7%D9%85%D9%84_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C\"><\/span>\n<p>  \u062a\u0639\u0627\u0645\u0644 \u0645\u0634\u062a\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 <code>test_client.py<\/code> \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0646\u062d\u0648\u0647 \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0639\u0627\u0645\u0644 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u067e\u0631\u0648\u062a\u06a9\u0644 A2A \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">run_single_turn_test<\/span><span class=\"p\">(<\/span><span class=\"n\">client<\/span><span class=\"p\">:<\/span> <span class=\"n\">A2AClient<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"bp\">None<\/span><span class=\"p\">:<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Runs a single-turn non-streaming test.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"n\">send_payload<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_send_message_payload<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">text<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">how much is 100 USD in CAD?<\/span><span class=\"sh\">'<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"c1\"># Send Message\n<\/span>    <span class=\"n\">send_response<\/span><span class=\"p\">:<\/span> <span class=\"n\">SendMessageResponse<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">send_message<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">payload<\/span><span class=\"o\">=<\/span><span class=\"n\">send_payload<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"nf\">print_json_response<\/span><span class=\"p\">(<\/span><span class=\"n\">send_response<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">Single Turn Request Response<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c1\"># Query the task if needed\n<\/span>    <span class=\"k\">if<\/span> <span class=\"nf\">isinstance<\/span><span class=\"p\">(<\/span><span class=\"n\">send_response<\/span><span class=\"p\">.<\/span><span class=\"n\">root<\/span><span class=\"p\">,<\/span> <span class=\"n\">SendMessageSuccessResponse<\/span><span class=\"p\">)<\/span> <span class=\"ow\">and<\/span> \\\n       <span class=\"nf\">isinstance<\/span><span class=\"p\">(<\/span><span class=\"n\">send_response<\/span><span class=\"p\">.<\/span><span class=\"n\">root<\/span><span class=\"p\">.<\/span><span class=\"n\">result<\/span><span class=\"p\">,<\/span> <span class=\"n\">Task<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">task_id<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">=<\/span> <span class=\"n\">send_response<\/span><span class=\"p\">.<\/span><span class=\"n\">root<\/span><span class=\"p\">.<\/span><span class=\"n\">result<\/span><span class=\"p\">.<\/span><span class=\"nb\">id<\/span>\n        <span class=\"n\">task_id_payload<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">id<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"n\">task_id<\/span><span class=\"p\">}<\/span>\n        <span class=\"n\">get_response<\/span><span class=\"p\">:<\/span> <span class=\"n\">GetTaskResponse<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">get_task<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">payload<\/span><span class=\"o\">=<\/span><span class=\"n\">task_id_payload<\/span>\n        <span class=\"p\">)<\/span>\n        <span class=\"nf\">print_json_response<\/span><span class=\"p\">(<\/span><span class=\"n\">get_response<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">Query Task Response<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">run_streaming_test<\/span><span class=\"p\">(<\/span><span class=\"n\">client<\/span><span class=\"p\">:<\/span> <span class=\"n\">A2AClient<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"bp\">None<\/span><span class=\"p\">:<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Runs a single-turn streaming test.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"n\">send_payload<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_send_message_payload<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">text<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">how much is 50 EUR in JPY?<\/span><span class=\"sh\">'<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">--- Single Turn Streaming Request ---<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">stream_response<\/span> <span class=\"o\">=<\/span> <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">send_message_streaming<\/span><span class=\"p\">(<\/span><span class=\"n\">payload<\/span><span class=\"o\">=<\/span><span class=\"n\">send_payload<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">for<\/span> <span class=\"n\">chunk<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">stream_response<\/span><span class=\"p\">:<\/span>\n        <span class=\"nf\">print_json_response<\/span><span class=\"p\">(<\/span><span class=\"n\">chunk<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">Streaming Chunk<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">run_multi_turn_test<\/span><span class=\"p\">(<\/span><span class=\"n\">client<\/span><span class=\"p\">:<\/span> <span class=\"n\">A2AClient<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"bp\">None<\/span><span class=\"p\">:<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Runs a multi-turn non-streaming test.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">--- Multi-Turn Request ---<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"c1\"># --- First Turn ---\n<\/span>    <span class=\"n\">first_turn_payload<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_send_message_payload<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">text<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">how much is 100 USD?<\/span><span class=\"sh\">'<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"n\">first_turn_response<\/span><span class=\"p\">:<\/span> <span class=\"n\">SendMessageResponse<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">send_message<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">payload<\/span><span class=\"o\">=<\/span><span class=\"n\">first_turn_payload<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"nf\">print_json_response<\/span><span class=\"p\">(<\/span><span class=\"n\">first_turn_response<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">Multi-Turn: First Turn Response<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">context_id<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span> <span class=\"o\">|<\/span> <span class=\"bp\">None<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">None<\/span>\n    <span class=\"k\">if<\/span> <span class=\"nf\">isinstance<\/span><span class=\"p\">(<\/span><span class=\"n\">first_turn_response<\/span><span class=\"p\">.<\/span><span class=\"n\">root<\/span><span class=\"p\">,<\/span> <span class=\"n\">SendMessageSuccessResponse<\/span><span class=\"p\">)<\/span> <span class=\"ow\">and<\/span> \\\n       <span class=\"nf\">isinstance<\/span><span class=\"p\">(<\/span><span class=\"n\">first_turn_response<\/span><span class=\"p\">.<\/span><span class=\"n\">root<\/span><span class=\"p\">.<\/span><span class=\"n\">result<\/span><span class=\"p\">,<\/span> <span class=\"n\">Task<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">task<\/span><span class=\"p\">:<\/span> <span class=\"n\">Task<\/span> <span class=\"o\">=<\/span> <span class=\"n\">first_turn_response<\/span><span class=\"p\">.<\/span><span class=\"n\">root<\/span><span class=\"p\">.<\/span><span class=\"n\">result<\/span>\n        <span class=\"n\">context_id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">contextId<\/span>  <span class=\"c1\"># Capture context ID\n<\/span>\n        <span class=\"c1\"># --- Second Turn (if input required) ---\n<\/span>        <span class=\"k\">if<\/span> <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">status<\/span><span class=\"p\">.<\/span><span class=\"n\">state<\/span> <span class=\"o\">==<\/span> <span class=\"n\">TaskState<\/span><span class=\"p\">.<\/span><span class=\"n\">input_required<\/span> <span class=\"ow\">and<\/span> <span class=\"n\">context_id<\/span><span class=\"p\">:<\/span>\n            <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">--- Multi-Turn: Second Turn (Input Required) ---<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">second_turn_payload<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_send_message_payload<\/span><span class=\"p\">(<\/span>\n                <span class=\"sh\">'<\/span><span class=\"s\">in GBP<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"nb\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">context_id<\/span>\n            <span class=\"p\">)<\/span>\n            <span class=\"n\">second_turn_response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">send_message<\/span><span class=\"p\">(<\/span>\n                <span class=\"n\">payload<\/span><span class=\"o\">=<\/span><span class=\"n\">second_turn_payload<\/span>\n            <span class=\"p\">)<\/span>\n            <span class=\"nf\">print_json_response<\/span><span class=\"p\">(<\/span>\n                <span class=\"n\">second_turn_response<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">Multi-Turn: Second Turn Response<\/span><span class=\"sh\">'<\/span>\n            <span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%88%DB%8C%DA%98%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87\"><\/span>\n<p>  \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AC%D8%B1%DB%8C%D8%A7%D9%86\"><\/span>\n<p>  \u062c\u0631\u06cc\u0627\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0627\u0631\u0632 \u0627\u0632 \u067e\u0627\u0633\u062e \u0647\u0627\u06cc \u062c\u0631\u06cc\u0627\u0646 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0647 \u0622\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0647\u0627\u06cc \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u062f \u0632\u06cc\u0631\u0627 \u0627\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u067e\u0631\u062f\u0627\u0632\u0634 \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<ol>\n<li>\u0648\u0642\u062a\u06cc \u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0634\u0631\u0648\u0639 \u0628\u0647 \u0641\u06a9\u0631 \u06a9\u0631\u062f\u0646 \u06a9\u0631\u062f \u060c \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc &#8220;\u062f\u0631 \u062d\u0627\u0644 \u0627\u0646\u062c\u0627\u0645&#8221; \u0631\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f<\/li>\n<li>\u0648\u0642\u062a\u06cc API \u0646\u0631\u062e \u0627\u0631\u0632 \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f \u060c \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc \u0634\u0648\u062f<\/li>\n<li>\u0647\u0646\u06af\u0627\u0645 \u067e\u0631\u062f\u0627\u0632\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627 \u060c \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u062f\u06cc\u06af\u0631\u06cc \u0631\u0627 \u067e\u062e\u0634 \u0645\u06cc \u06a9\u0646\u062f<\/li>\n<li>\u0633\u0631\u0627\u0646\u062c\u0627\u0645 \u060c \u0646\u062a\u06cc\u062c\u0647 \u06a9\u0627\u0645\u0644 \u0631\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f<\/li>\n<\/ol>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0628\u0647\u062a\u0631\u06cc \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u06a9\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0632\u0645\u0627\u0646 \u0644\u0627\u0632\u0645 \u0628\u0627\u0634\u062f \u060c \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%DA%A9%D8%A7%D9%84%D9%85%D8%A7%D8%AA_%DA%86%D9%86%D8%AF_%DA%86%D8%B1%D8%AE%D8%B4\"><\/span>\n<p>  \u0645\u06a9\u0627\u0644\u0645\u0627\u062a \u0686\u0646\u062f \u0686\u0631\u062e\u0634<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u060c \u062f\u0631 \u0645\u06a9\u0627\u0644\u0645\u0627\u062a \u0686\u0646\u062f \u0686\u0631\u062e\u0634 \u0634\u0631\u06a9\u062a \u06a9\u0646\u062f:<\/p>\n<ol>\n<li>\u0627\u06af\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc \u067e\u0631\u0633\u062f &#8220;100 \u062f\u0644\u0627\u0631 \u0686\u0642\u062f\u0631 \u0627\u0633\u062a\u061f&#8221; \u0628\u062f\u0648\u0646 \u0645\u0634\u062e\u0635 \u06a9\u0631\u062f\u0646 \u0627\u0631\u0632 \u0647\u062f\u0641<\/li>\n<li>\u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u062d\u0627\u0644\u062a \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f <code>TaskState.input_required<\/code>\n<\/li>\n<li>\u0645\u0634\u062a\u0631\u06cc \u0633\u067e\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u067e\u06cc\u06af\u06cc\u0631\u06cc \u0631\u0627 \u0628\u0627 \u0647\u0645\u0627\u0646 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u062f <code>contextId<\/code>\n<\/li>\n<li>\u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0632\u0645\u06cc\u0646\u0647 \u0628\u06cc\u0646 \u0686\u0631\u062e\u0634 \u0647\u0627 \u0631\u0627 \u062d\u0641\u0638 \u0645\u06cc \u06a9\u0646\u062f<\/li>\n<\/ol>\n<p>\u0645\u06a9\u0627\u0644\u0645\u0647 \u0645\u062b\u0627\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>User: How much is 100 USD?\nAgent: To which currency would you like to convert 100 USD?\nUser: in GBP\nAgent: 100 USD is approximately 78.45 GBP according to the current exchange rate.\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%A7%D8%AD%D9%84_%D8%A8%D8%B9%D8%AF%DB%8C\"><\/span>\n<p>  \u0645\u0631\u0627\u062d\u0644 \u0628\u0639\u062f\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06a9\u0647 \u0645\u06cc \u0641\u0647\u0645\u06cc\u062f \u06a9\u0647 \u0639\u0627\u0645\u0644 \u0627\u0631\u0632 \u0686\u06af\u0648\u0646\u0647 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f:<\/p>\n<ol>\n<li>\n<strong>\u0633\u0624\u0627\u0644\u0627\u062a \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u062f<\/strong>: \u0628\u0627 \u062c\u0641\u062a \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0627\u0631\u0632 \u062a\u0633\u062a \u06a9\u0646\u06cc\u062f<\/li>\n<li>\n<strong>\u0639\u0627\u0645\u0644 \u0631\u0627 \u0627\u0635\u0644\u0627\u062d \u06a9\u0646\u06cc\u062f<\/strong>: \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631<\/p>\n<ul>\n<li>\u0646\u0631\u062e \u0627\u0631\u0632 \u062a\u0627\u0631\u06cc\u062e\u06cc<\/li>\n<li>\u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0631\u0648\u0646\u062f \u0627\u0631\u0632\u06cc<\/li>\n<li>\u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0627\u0631\u0632\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631<\/li>\n<\/ul>\n<\/li>\n<li>\n<strong>\u0645\u0639\u0645\u0627\u0631\u06cc \u0631\u0627 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u06cc\u062f<\/strong>:<\/p>\n<ul>\n<li>\u0645\u0627\u0646\u062f\u06af\u0627\u0631 <code>TaskStore<\/code> \u0628\u0631\u0627\u06cc \u062c\u0644\u0633\u0627\u062a \u0637\u0648\u0644\u0627\u0646\u06cc \u0645\u062f\u062a<\/li>\n<li>\u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u062a\u0648\u0644\u06cc\u062f \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u06cc\u062f<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u067e\u0631\u0648\u062a\u06a9\u0644 A2A:<\/p>\n<p>\u0622\u0645\u0648\u0632\u0634 A2a Langgraph<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u062a\u0648\u0636\u06cc\u062d \u0645\u0641\u0635\u0644\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0639\u0627\u0645\u0644 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 A2A \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Langgraph \u0648 \u0645\u062f\u0644 Google Gemini \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f. \u0645\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u0645\u0648\u0646\u0647 \u0639\u0627\u0645\u0644 \u0627\u0631\u0632 \u0627\u0632 A2A Python SDK \u0642\u062f\u0645 \u0645\u06cc \u0632\u0646\u06cc\u0645 \u0648 \u0647\u0631 \u0645\u0624\u0644\u0641\u0647 \u060c \u062c\u0631\u06cc\u0627\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0648 \u0686\u06af\u0648\u0646\u06af\u06cc \u067e\u0631\u0648\u062a\u06a9\u0644 A2A \u062a\u0639\u0627\u0645\u0644 \u0639\u0627\u0645\u0644 \u0631\u0627 \u062a\u0633\u0647\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u0641\u0647\u0631\u0633\u062a &hellip;<\/p>\n","protected":false},"author":2,"featured_media":108781,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/media2.dev.to\/dynamic\/image\/width=1000,height=500,fit=cover,gravity=auto,format=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fav8evsjnf7rrm9vguejd.png","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-108780","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/108780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=108780"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/108780\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/108781"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=108780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=108780"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=108780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}