{"id":25798,"date":"2026-06-24T15:39:21","date_gmt":"2026-06-24T15:39:21","guid":{"rendered":"https:\/\/umang.pk\/2026\/06\/24\/temporal-composio-keda%d8%8c-%d8%a7%d9%88%d8%b1-kubernetes-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%d8%a7%db%8c%da%a9-%d9%be%d8%a7\/"},"modified":"2026-06-24T15:39:23","modified_gmt":"2026-06-24T15:39:23","slug":"temporal-composio-keda%d8%8c-%d8%a7%d9%88%d8%b1-kubernetes-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%d8%a7%db%8c%da%a9-%d9%be%d8%a7","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/06\/24\/temporal-composio-keda%d8%8c-%d8%a7%d9%88%d8%b1-kubernetes-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%d8%a7%db%8c%da%a9-%d9%be%d8%a7\/","title":{"rendered":"Temporal, Composio, KEDA\u060c \u0627\u0648\u0631 Kubernetes \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u06cc\u06a9 \u067e\u0627\u0626\u06cc\u062f\u0627\u0631\u060c \u0633\u06cc\u0644\u0641 \u0627\u0633\u06a9\u06cc\u0644\u0646\u06af AI \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 AI \u0627\u06cc\u062c\u0646\u0679 \u062a\u06cc\u0632 \u0631\u0641\u062a\u0627\u0631 \u06a9\u0627\u0645\u0648\u06ba \u0645\u06cc\u06ba \u0627\u0686\u06be\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062c\u0628 \u0622\u067e \u06a9\u0648\u0626\u06cc \u067e\u06cc\u063a\u0627\u0645 \u0628\u06be\u06cc\u062c\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0627 \u0627\u06cc\u062c\u0646\u0679 \u0686\u0646\u062f \u0679\u0648\u0644\u0632 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u06cc\u06a9\u0646\u0688\u0648\u06ba \u0645\u06cc\u06ba \u062c\u0648\u0627\u0628 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06a9\u06d2 \u062e\u0644\u0627\u0635\u0648\u06ba \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u06cc\u0627 \u0627\u0646\u0679\u0631\u0646\u06cc\u0679 \u062a\u062d\u0642\u06cc\u0642 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u0627\u0645 \u0645\u06cc\u06ba \u0648\u0642\u062a \u0644\u06af\u062a\u0627 \u06c1\u06d2\u061f \u06a9\u0686\u06be \u0627\u0633 \u0637\u0631\u062d \u06a9\u06c1 &quot;\u0622\u062e\u0631\u06cc \u062a\u06cc\u0646 \u062f\u0646\u0648\u06ba \u06a9\u06cc \u0627\u06cc \u0645\u06cc\u0644\u0632 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u060c \u0641\u0648\u0631\u06cc \u062c\u0648\u0627\u0628\u0627\u062a \u06a9\u0627 \u0645\u0633\u0648\u062f\u06c1 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642\u06c1 \u0679\u06a9\u0679\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u06a9\u06cc\u0631\u06cc \u0679\u06a9\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4&#8221; \u06cc\u06c1 \u06a9\u0648\u0626\u06cc \u062c\u0644\u062f\u06cc \u06a9\u06cc \u0628\u0627\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u0645\u06cc\u06ba \u0645\u0646\u0679\u060c \u06af\u06be\u0646\u0679\u06d2 \u06cc\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0642\u062a \u0644\u06af \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0645\u062b\u0627\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u0627 \u067e\u0648\u0631\u0627 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062c\u0633 \u0644\u0645\u062d\u06d2 \u0633\u0631\u0648\u0631 \u06a9\u0631\u06cc\u0634 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0639\u0645\u0644 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0633\u0628 \u06a9\u0686\u06be \u0636\u0627\u0626\u0639 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u0646\u06c1\u06cc\u06ba\u060c \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u0646\u06c1\u06cc\u06ba. \u0622\u067e \u0634\u0631\u0648\u0639 \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2 \u062c\u0633 \u06a9\u0648 \u06cc\u06c1 \u0645\u0636\u0645\u0648\u0646 \u062d\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u0642\u0627\u0644\u06d2 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u067e\u0627\u0626\u06cc\u062f\u0627\u0631 \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0627\u06cc\u062c\u0646\u0679 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06d2 \u062d\u0627\u0644\u0627\u062a \u0645\u06cc\u06ba \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0633 \u06a9\u0627\u0645 \u0686\u06be\u0648\u0691 \u062f\u0648\u060c \u0686\u06be\u0648\u0691 \u062f\u0648\u060c \u0627\u0648\u0631 \u062a\u0645\u06c1\u0627\u0631\u0627 \u06a9\u0627\u0645 \u06c1\u0648 \u06af\u06cc\u0627\u06d4<\/p>\n<p>\u06c1\u0688 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2\u060c \u06cc\u06c1 KEDA \u0622\u0679\u0648 \u0627\u0633\u06a9\u06cc\u0644\u0646\u06af \u06a9\u06d2 \u0633\u0627\u062a\u06be Kubernetes \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0648\u0631\u06a9\u0631\u0632 \u06a9\u0627\u0645 \u06a9\u06d2 \u0622\u0646\u06d2 \u06a9\u06d2 \u0648\u0642\u062a \u0628\u06cc\u06a9\u0627\u0631 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0635\u0641\u0631 \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u06a9\u0627 \u0628\u06cc\u06a9 \u0627\u067e \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0645 \u06a9\u0631\u06cc\u0634 \u0631\u06cc\u06a9\u0648\u0631\u06cc \u0627\u0648\u0631 \u067e\u0627\u0626\u06cc\u062f\u0627\u0631 \u0639\u0645\u0644\u062f\u0631\u0622\u0645\u062f \u06a9\u06d2 \u0644\u06cc\u06d2 Temporal \u0627\u0648\u0631 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc \u0641\u0639\u0627\u0644\u06cc\u062a \u0627\u0648\u0631 \u0679\u0648\u0644\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 Composio \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-whats-covered\">\u06a9\u06cc\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u061f<\/h2>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0627\u06cc\u06a9 \u067e\u0627\u0626\u06cc\u062f\u0627\u0631 \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0627\u06cc\u062c\u0646\u0679 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 Kubernetes \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0633\u06a9\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0648\u0631\u0633 \u0645\u06cc\u06ba \u0622\u067e \u062c\u0648 \u06a9\u0686\u06be \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2 \u0648\u06c1 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e \u06a9\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0644\u0627\u0688 \u0627\u0648\u0631 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0648 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0637\u0648\u06cc\u0644 \u0639\u0631\u0635\u06d2 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u0679\u0627\u0633\u06a9 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u062a\u0646\u0627\u0632\u0639\u0627\u062a \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 Temporal \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u06af\u06cc\u0679 \u0648\u06d2 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062c\u0648 \u0679\u0627\u0633\u06a9 \u0688\u0633\u067e\u06cc\u0686 \u06a9\u0648 \u0639\u0645\u0644 \u0633\u06d2 \u0627\u0644\u06af \u06a9\u0631\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0688\u0648\u06a9\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u0627\u0648\u0631 \u06af\u06cc\u0679 \u0648\u06cc\u0632 \u06a9\u0648 \u06a9\u0646\u0679\u06cc\u0646\u0631\u0627\u0626\u0632 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1<\/p>\n<\/li>\n<li>\n<p>\u067e\u0648\u0631\u06d2 \u0633\u0633\u0679\u0645 \u06a9\u0648 \u0645\u0642\u0627\u0645\u06cc \u06a9\u0628\u0631\u0646\u06cc\u0679\u0633 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u06a9\u06cc\u0633\u06d2 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0642\u0637\u0627\u0631 \u06a9\u06cc \u06af\u06c1\u0631\u0627\u0626\u06cc \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 KEDA \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u062e\u0648\u062f \u0628\u062e\u0648\u062f 0 \u062a\u06a9 \u06a9\u06cc\u0633\u06d2 \u067e\u06cc\u0645\u0627\u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u06cc\u06c1 \u06a9\u0686\u06be \u062c\u062f\u06cc\u062f \u062a\u0635\u0648\u0631\u0627\u062a \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u0631\u0627\u0633\u062a\u06d2 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u06a9\u0686\u06be \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-whats-the-plan-the-architecture\">\u0645\u0646\u0635\u0648\u0628\u06d2 \u06a9\u06cc\u0627 \u06c1\u06cc\u06ba (\u0641\u0646 \u062a\u0639\u0645\u06cc\u0631)<\/h2>\n<p>\u06a9\u0648\u0688 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u0627 \u0645\u062f\u062f\u06af\u0627\u0631 \u06c1\u06d2 \u06a9\u06c1 \u0633\u0628 \u06a9\u0686\u06be \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u06cc\u0633\u06d2 \u0641\u0679 \u0628\u06cc\u0679\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0633\u0679\u0645 \u06a9\u0648 \u062f\u0648 \u0627\u0644\u06af \u0627\u0644\u06af \u0637\u06cc\u0627\u0631\u0648\u06ba \u0645\u06cc\u06ba \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2: \u06a9\u0646\u0679\u0631\u0648\u0644 \u0637\u06cc\u0627\u0631\u06c1\u060c \u062c\u0648 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 (Next.js \u0641\u0631\u0646\u0679 \u0627\u06cc\u0646\u0688)\u060c \u0627\u0648\u0631 \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0634\u0646 \u067e\u0644\u06cc\u0646\u060c \u062c\u06c1\u0627\u06ba \u0627\u0635\u0644 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0627 \u06a9\u0627\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06c1 \u06a9\u0628\u06be\u06cc \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u06c1\u062a\u06d2\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0634\u0631\u0648\u0639 \u0633\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645 \u062a\u06a9 \u0628\u06c1\u0627\u0624 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<h3 id=\"heading-dispatching-a-task\">\u06a9\u0627\u0645 \u06a9\u06cc \u062a\u0631\u0633\u06cc\u0644<\/h3>\n<p>\u062c\u0628 \u06a9\u0648\u0626\u06cc \u0635\u0627\u0631\u0641 \u06a9\u0648\u0626\u06cc \u06af\u0648\u0644 \u062c\u0645\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06af\u06cc\u0679 \u0648\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u067e\u0631\u06cc \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0634\u0646 \u0686\u06cc\u06a9 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u06cc\u06c1 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u06d2 \u06a9\u06c1 \u0627\u0633 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0637\u0644\u0648\u0628\u06c1 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0648 \u0679\u0648\u0644 \u06a9\u0646\u06a9\u0634\u0646\u0632 \u0641\u0639\u0627\u0644 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0627\u06cc\u0633\u0627 \u06c1\u06d2 \u062a\u0648\u060c \u06c1\u0645 \u06cc\u06c1 \u06a9\u0627\u0645 \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u06a9\u0648 \u0633\u0648\u0646\u067e \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06cc\u06c1 \u0641\u0648\u0631\u0627\u064b \u0648\u0627\u067e\u0633 \u0622\u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2\u06d4<\/p>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> \u06cc\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u0633\u06d2 \u062c\u0648\u0627\u0628 \u0622\u0646\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627\u06d4 \u06cc\u06c1 \u0633\u0628 \u06a9\u0686\u06be \u067e\u0633 \u0645\u0646\u0638\u0631 \u0645\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0622\u067e \u06a9\u06cc \u0639\u0627\u0645 \u0686\u06cc\u0679 \u0627\u06cc\u067e \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0628\u06be\u0648\u0644 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-running-the-task\">\u06a9\u0627\u0645 \u0686\u0644\u0627\u0626\u06cc\u06ba<\/h3>\n<p>\u0648\u0642\u062a\u06cc \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u06a9\u06be\u0691\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u067e\u06be\u0644\u06cc \u0627\u0646\u06c1\u06cc\u06ba \u0627\u0679\u06be\u0627 \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0645\u0642\u0635\u062f \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba LLM \u0648\u062c\u0648\u06c1\u0627\u062a\u060c Composio \u0679\u0648\u0644 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0646\u062a\u0627\u0626\u062c \u0648\u0627\u067e\u0633 Temporal \u0645\u06cc\u06ba \u0644\u06a9\u06be\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0641\u0631\u0646\u0679 \u0627\u06cc\u0646\u0688 \u0627\u0633\u0679\u06cc\u0679\u0633 \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06af\u06cc\u0679 \u0648\u06d2 \u06a9\u0648 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u067e\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0622\u067e \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u0686\u06be \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u06cc\u0627 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-scaling\">\u067e\u06cc\u0645\u0627\u0646\u06c1 \u06a9\u0627\u0631\u06cc<\/h3>\n<p>KEDA \u0639\u0627\u0631\u0636\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06cc \u06af\u06c1\u0631\u0627\u0626\u06cc \u06a9\u0627 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u06a9\u0627\u0645 \u06a9\u06cc \u0645\u0642\u062f\u0627\u0631 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u0648\u0631\u06a9\u0631 \u067e\u0648\u0688 \u06a9\u0627 \u0633\u0627\u0626\u0632 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u0642\u0637\u0627\u0631 \u062e\u0627\u0644\u06cc \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0635\u0641\u0631 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0645 \u0622\u062a\u06d2 \u06c1\u06cc \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u0648\u0688 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u06cc\u06c1 \u062e\u0648\u0628\u0635\u0648\u0631\u062a\u06cc \u06c1\u06d2!<\/p>\n<p>\u06af\u06cc\u0679 \u0648\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648\u0688 \u06a9\u0648 \u0646\u06c1 \u0686\u06be\u0648\u0646\u06d2 \u06a9\u06cc \u0648\u062c\u06c1 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0645\u0646\u0679 \u06cc\u0627 \u06af\u06be\u0646\u0679\u06d2 \u0644\u06af \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06c1\u0645 \u0627\u0633\u06d2 \u0627\u067e\u0646\u06cc API \u067e\u0631\u062a \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u062a\u06d2\u06d4 \u0627\u0646 \u06a9\u0648 \u0627\u0644\u06af \u0631\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u0645\u0644\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u067e\u0633 \u0645\u0646\u0638\u0631 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2 \u0627\u0633 \u0633\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0637\u06cc\u0627\u0631\u06c1 \u062a\u06cc\u0632 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u0627\u0646\u0633\u0627\u0646\u06cc \u0645\u062f\u0627\u062e\u0644\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0644\u06cc\u0646\u06a9\u0633 \u06a9\u0631\u0648\u0646 \u062c\u0627\u0628 \u0637\u0631\u0632 \u06a9\u06d2 \u062c\u0627\u0628 \u0634\u06cc\u0688\u0648\u0644\u0646\u06af \u06a9\u06cc \u0628\u06be\u06cc \u062d\u0645\u0627\u06cc\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0644\u06c1\u0630\u0627\u060c \u0639\u0645\u0644 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u0627 \u0645\u062f\u062f\u06af\u0627\u0631 \u06c1\u06d2\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0688\u0633\u067e\u06cc\u0686 \u067e\u0631 \u062c\u0644\u062f\u06cc \u0633\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u0646\u0627 \u0627\u0633 \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0628\u06c1\u062a\u0631 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633\u06cc \u06af\u0645\u0634\u062f\u06c1 \u0679\u0648\u0644 \u06a9\u0646\u06a9\u0634\u0646 \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06a9\u0627\u0645 \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u06c1\u0645\u0627\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u0627\u0639\u0644\u06cc\u0670 \u0633\u0637\u062d\u06cc \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06c1\u06d2\u06d4 \u0633\u06cc\u062f\u06be\u06d2 \u0627\u0644\u0641\u0627\u0638 \u0645\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p><strong>Kubernetes (k8s):<\/strong> \u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0634\u0646 \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>\u0688\u0628\u0644\u06cc\u0648 \u0627\u06cc\u0686 \u0627\u0648:<\/strong> \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u067e\u06be\u06cc\u0644\u0646\u06d2 \u0648\u0627\u0644\u06cc \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>\u0639\u0627\u0631\u0636\u06cc:<\/strong> \u067e\u0627\u0626\u06cc\u062f\u0627\u0631 \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>\u062a\u0631\u06a9\u06cc\u0628:<\/strong> \u0622\u0644\u06d2 \u06a9\u06cc \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0637\u0644\u0648\u0628\u06c1 \u0627\u06cc\u0644 \u0627\u06cc\u0644 \u0627\u06cc\u0645 (\u0627\u0633 \u0645\u0639\u0627\u0645\u0644\u06d2 \u0645\u06cc\u06ba \u0627\u0646\u062a\u06be\u0631\u0648\u067e\u06a9)<\/strong> = \u0627\u0646\u0641\u0631\u0646\u0633 \u067e\u0631\u062a<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-how-to-set-up-the-project\">\u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc\u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0627\u0646\u0633\u0679\u0627\u0644 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0622\u067e \u06a9\u0648 Anthropic \u0627\u0648\u0631 Composio \u06a9\u06d2 \u0644\u06cc\u06d2 API \u06a9\u06cc\u0632 \u06a9\u06cc \u0628\u06be\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4<\/p>\n<p>\u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0644\u0648\u0646\u0646\u06af \u06a9\u0631\u06a9\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\">git clone https:\/\/github.com\/shricodev\/kron-k8s-agent.git\ncd kron-k8s-agent\n<\/code><\/pre>\n<p>\u0627\u06af\u0644\u0627\u060c \u06a9\u0644\u0633\u0679\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u062a\u0635\u0648\u06cc\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\"># Create the local cluster\nk3d cluster create agent --wait\n\n# Build both images and import them into the cluster\nbash scripts\/build-images.sh\nbash scripts\/load-images.sh\n\n# Deploy Temporal (creates the temporal namespace, Postgres, and server)\nkubectl apply -f infra\/k8s\/temporal\/temporal-dev.yaml\n<\/code><\/pre>\n<p>\u0627\u06af\u0644\u0627\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0627\u0648\u0631 \u0631\u0627\u0632 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0686\u0648\u0646\u06a9\u06c1 \u067e\u0648\u0688\u0632 \u0627\u06cc\u067e \u0633\u06d2 \u06a9\u06cc\u0632 \u067e\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0627\u06cc\u067e \u06a9\u06d2 \u062a\u0639\u06cc\u0646\u0627\u062a \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u0627\u0632 \u06a9\u0627 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-shell\"># Create the agent namespace\nkubectl apply -f infra\/k8s\/00-namespace.yaml\n\n# Create the secret with your keys (you're supposed to remove the placeholders with the actual values...)\nkubectl create secret generic agent-secrets -n agent \n --from-literal=ANTHROPIC_API_KEY=sk-ant-... \n --from-literal=COMPOSIO_API_KEY=ak_... \n --from-literal=JWT_SECRET=$(openssl rand -hex 32)\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0627\u067e\u0646\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0622\u0679\u0648 \u0627\u0633\u06a9\u06cc\u0644\u0646\u06af \u0633\u06cc\u0679 \u0627\u067e \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\"># Install KEDA, then apply the scalers\nhelm repo add kedacore https:\/\/kedacore.github.io\/charts\nhelm repo update\nhelm install keda kedacore\/keda -n keda --create-namespace --wait\n\nkubectl apply -f infra\/k8s\/40-keda-worker-scaledobject.yaml -f infra\/k8s\/41-gateway-hpa.yaml\n<\/code><\/pre>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u0627\u067e\u0646\u06d2 \u06af\u06cc\u0679 \u0648\u06d2 \u06a9\u0648 \u067e\u0648\u0631\u0679 \u0641\u0627\u0631\u0648\u0631\u0688 \u06a9\u0631\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u0645\u0634\u06cc\u0646\u06cc\u06ba \u0627\u0633 \u0633\u06d2 \u062c\u0691 \u0633\u06a9\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\"># Port-forward the gateway to localhost:8000\nkubectl -n agent port-forward svc\/gateway 8000:8000\n<\/code><\/pre>\n<p>\u0633\u0627\u0645\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0633\u0631\u06d2 \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>http:\/\/localhost:8000<\/code> \u0627\u0628 \u0622\u067e \u06a9\u0627\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> \u0627\u0633\u06d2 \u0686\u06be\u0648\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>.env<\/code> \u0641\u0627\u0626\u0644 <code>apps\/worker\/<\/code> \u06cc\u0627 <code>apps\/gateway\/<\/code> \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u067e\u0633 \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0622\u067e \u06a9\u06d2 \u06a9\u0645\u067e\u06cc\u0648\u0679\u0631 \u067e\u0631 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba\u060c Pods \u06a9\u0648 ConfigMap \u0633\u06d2 \u0627\u0646 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u0645\u0644 \u062c\u0627\u0626\u06d2 \u06af\u06cc\u060c \u0627\u0648\u0631 \u0622\u067e \u0646\u06d2 \u0627\u0628\u06be\u06cc \u062c\u0648 \u0631\u0627\u0632 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u06d2 \u0648\u0642\u062a \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u062c\u06a9\u0634\u0646 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<h2 id=\"heading-core-components-in-the-application\">\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0627\u062c\u0632\u0627\u0621<\/h2>\n<p>\u06cc\u06c1 \u0645\u0646\u0635\u0648\u0628\u06c1 \u0628\u06c1\u062a \u0628\u0691\u0627 \u06c1\u06d2\u06d4 \u0634\u0631\u0648\u0639 \u0633\u06d2 \u06c1\u0631 \u0633\u0637\u0631 \u06a9\u0648 \u067e\u0691\u06be\u0646\u0627 \u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u0648\u06af\u0627\u060c \u0644\u06c1\u0630\u0627 \u0622\u0626\u06cc\u06d2 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0646 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0627\u062c\u0632\u0627\u0621 \u067e\u0631 \u062a\u0648\u062c\u06c1 \u0645\u0631\u06a9\u0648\u0632 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0646\u0638\u0627\u0645 \u06a9\u0648 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-the-agent-loop\">\u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e<\/h3>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e \u067e\u0648\u0631\u06d2 \u0646\u0638\u0627\u0645 \u06a9\u0627 \u062f\u0645\u0627\u063a \u06c1\u06d2\u06d4 \u062c\u0628 \u0628\u06be\u06cc \u06a9\u0648\u0626\u06cc \u0679\u0627\u0633\u06a9 \u0631\u0648\u0627\u0646\u06c1 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0627\u0633 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062e\u06cc\u0627\u0644\u060c \u0686\u0627\u06c1\u06d2 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u0646\u06c1 \u06c1\u0648\u060c \u0633\u0627\u062f\u06c1 \u06c1\u06d2\u06d4 LLM \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0642\u0635\u062f \u062f\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u0626\u06cc\u06ba\u060c \u0679\u0648\u0644 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0641\u06cc\u0688 \u0628\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u062f\u06c1\u0631\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">async def run_agent(\nuser_id: str,\ngoal: str,\ntoolkit_hint: str | None = None,\n) -> dict:\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0646 \u0686\u06cc\u0632\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2: \u0622\u067e \u06a9\u06cc \u0635\u0627\u0631\u0641 ID (\u062a\u0627\u06a9\u06c1 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0648 \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u0627 \u0644\u0646\u06a9 \u0634\u062f\u06c1 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2)\u060c \u0645\u0642\u0635\u062f \u062e\u0648\u062f\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0679\u0648\u0644 \u06a9\u0679 \u0627\u0634\u0627\u0631\u06c1\u06d4 \u0627\u0634\u0627\u0631\u06d2 \u0622\u067e \u06a9\u0648 \u0644\u0648\u0688 \u06a9\u06cc\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0679\u0648\u0644 \u06a9\u06d2 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0679\u0627\u0633\u06a9 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 Gmail \u06a9\u0627 \u06a9\u0627\u0645 \u06c1\u06d2\u060c \u062a\u0648 &quot;gmail&#8221; \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06a9\u06d2 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0679\u0648\u0644 \u06a9\u0648 \u0644\u0648\u0688 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0644\u0648\u067e \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0648 \u0633\u06cc\u0634\u0646 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u0648\u0644\u0632 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">session = await create_session(user_id, toolkit_hint);\ntools = await get_tools(session);\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u0627\u0635\u0644 \u0644\u0648\u067e \u0686\u0644\u062a\u0627 \u06c1\u06d2.<\/p>\n<pre><code class=\"language-python\">for turn in range(1, settings.max_iterations + 1):\n    response = await client.messages.create(\n        model=settings.model,\n        max_tokens=settings.max_tokens,\n        system=SYSTEM_PROMPT,\n        tools=tools,\n        messages=messages,\n    )\n\nif response.stop_reason == \"end_turn\":\nreturn finish(\"completed\", _extract_text(response.content))\n\nif response.stop_reason == \"tool_use\":\n      # execute the tools, append results, continue\n      # ...\n<\/code><\/pre>\n<p>\u06c1\u0631 \u0645\u0648\u0691 \u067e\u0631\u060c \u06a9\u0644\u0627\u0688 \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0622\u06af\u06d2 \u06a9\u06cc\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u06d2 \u0627\u067e\u0646\u06d2 \u0645\u0642\u0627\u0635\u062f \u0627\u0648\u0631 \u06af\u0641\u062a\u06af\u0648 \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>stop_reason<\/code> \u06cc\u06c1\u0627\u06ba \u06a9\u06cc\u0627 \u06c1\u0648\u0627 \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p><code>\"end_turn\"<\/code>: \u06a9\u0644\u0627\u0688 \u062e\u062a\u0645 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0645 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062d\u062a\u0645\u06cc \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><code>\"tool_use\"<\/code>: \u0622\u067e \u0627\u06cc\u06a9 \u06cc\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0679\u0648\u0644\u0632 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u0648\u067e \u0627\u0633\u06d2 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0648 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u06cc \u0633\u0631\u06af\u0632\u0634\u062a \u0645\u06cc\u06ba \u0648\u0627\u067e\u0633 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u067e\u06be\u0631 \u0648\u0627\u067e\u0633 \u0686\u0644\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0679\u0648\u0644 \u06a9\u0627\u0644 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u0639\u0645\u0644\u062f\u0631\u0622\u0645\u062f \u0645\u06cc\u06ba \u062e\u0644\u0644 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u063a\u0644\u0637\u06cc \u06a9\u0648 \u0688\u0627\u0626\u06cc\u0644\u0627\u06af \u0645\u06cc\u06ba \u0648\u0627\u067e\u0633 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">except ComposioError as exc:\ntool_result_blocks = [\n    {\n        \"type\": \"tool_result\",\n        \"tool_use_id\": block.id,\n        \"content\": f\"Tool execution failed: {exc}\",\n        \"is_error\": True,\n    }\n        for block in tool_use_blocks\n]\n<\/code><\/pre>\n<p>\u0644\u0648\u067e \u067e\u0648\u0631\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a \u0633\u06d2 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 <code>max_iterations<\/code> \u0645\u0648\u0691 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u0628\u0637\u0648\u0631 \u0688\u06cc\u0641\u0627\u0644\u0679 20 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u0627\u0633 \u0645\u06cc\u06ba \u06a9\u06cc \u06af\u0626\u06cc \u06c1\u06d2: <code>apps\/worker\/agent\/config.py<\/code>. \u0627\u06af\u0631 \u0622\u067e \u0645\u06a9\u0645\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0633 \u062d\u062f \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>max_iterations_reached<\/code> \u063a\u06cc\u0631 \u0645\u0639\u06cc\u0646\u06c1 \u0645\u062f\u062a \u062a\u06a9 \u0644\u0679\u06a9\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u062d\u06cc\u062b\u06cc\u062a\u06d4<\/p>\n<p>\u06c1\u0631 <code>run_agent<\/code> \u06a9\u0627\u0644 \u0648\u06c1\u06cc \u0644\u063a\u062a \u06a9\u06cc \u0634\u06a9\u0644 \u0644\u0648\u0679\u0627\u062a\u06cc \u06c1\u06d2: \u062d\u06cc\u062b\u06cc\u062a\u060c \u062e\u0644\u0627\u0635\u06c1\u060c \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u0626\u06d2 \u06af\u0626\u06d2 \u062a\u0645\u0627\u0645 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a\u06d4 \u0645\u0633\u062a\u0642\u0644 \u0641\u0627\u0631\u0645\u06cc\u0679 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0627\u0646 \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u06a9\u0648 \u0622\u0633\u0627\u0646 \u0628\u0646\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u0622\u06af\u06d2 \u06a9\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4<\/p>\n<h3 id=\"heading-making-it-durable-with-temporal\">Temporal \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0633\u062a\u062d\u06a9\u0627\u0645 \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06c1\u06cc \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0627 \u0639\u0645\u0644 \u0645\u0631\u062d\u0644\u06c1 15 \u06a9\u06d2 \u0648\u0633\u0637 \u0645\u06cc\u06ba \u06a9\u0631\u06cc\u0634 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u0633\u0628 \u06a9\u0686\u06be \u0636\u0627\u0626\u0639 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0637\u0631\u06cc\u0642\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u0633 \u062d\u062f \u062a\u06a9 \u0622\u0686\u06a9\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u0634\u0631\u0648\u0639 \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<h4 id=\"heading-workflows-and-activities\">\u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0648\u0631 \u0633\u0631\u06af\u0631\u0645\u06cc\u0627\u06ba<\/h4>\n<p>\u0639\u0627\u0631\u0636\u06cc \u0622\u067e \u06a9\u06d2 \u06a9\u0648\u0688 \u06a9\u0648 \u062f\u0648 \u0627\u0644\u06af \u0627\u0644\u06af \u062d\u0635\u0648\u06ba \u0645\u06cc\u06ba \u062a\u0642\u0633\u06cc\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0648\u0631 \u0633\u0631\u06af\u0631\u0645\u06cc\u0627\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0627 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u0627\u0648\u0631 \u06a9\u0633 \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0635\u0644 \u06a9\u0627\u0645 \u062e\u0648\u062f \u0627\u0646\u062c\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u062a\u0627\u06d4 \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u06a9\u0627\u0644 \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0631\u06a9\u0627\u0648\u0679 \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627\u0646\u06d2 \u0627\u0648\u0631 \u062a\u0635\u0627\u062f\u0645 \u06a9\u06d2 \u0628\u0639\u062f \u0631\u06cc\u0627\u0633\u062a \u06a9\u06cc \u062a\u0634\u06a9\u06cc\u0644 \u0646\u0648 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0631\u06af\u0631\u0645\u06cc\u0627\u06ba \u0648\u06c1 \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u062d\u0642\u06cc\u0642\u06cc \u06a9\u0627\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u06a9\u0627\u0644\u0632\u060c \u0627\u06cc\u0644 \u0627\u06cc\u0644 \u0627\u06cc\u0645 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba\u060c \u0679\u0648\u0644 \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0634\u0646 \u0648\u063a\u06cc\u0631\u06c1 \u0633\u0628\u06be\u06cc \u0633\u0631\u06af\u0631\u0645\u06cc \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4 \u0633\u0631\u06af\u0631\u0645\u06cc\u0627\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06cc \u062d\u0627\u0644\u062a \u06a9\u0648 \u0645\u062a\u0627\u062b\u0631 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u0646\u0635\u0648\u0628\u06d2 \u0645\u06cc\u06ba <code>AgentWorkflow<\/code> \u06a9\u0648 <code>apps\/worker\/workflows.py<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06c1\u06d2\u06d4 <code>run_agent_activity<\/code> \u06a9\u0648 <code>apps\/worker\/activities.py<\/code> \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u06cc \u0633\u0631\u06af\u0631\u0645\u06cc \u062c\u0648 \u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e \u06a9\u0648 \u0644\u067e\u06cc\u0679\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u06a9\u0627\u0645 \u06a9\u0627 \u0628\u06c1\u0627\u0624<\/strong><\/p>\n<pre><code class=\"language-python\">@workflow.defn(name=\"AgentWorkflow\")\nclass AgentWorkflow:\n    def init(self) -> None:\n        self._status: str = \"running\"\n        self._result: dict | None = None\n<\/code><\/pre>\n<p>Temporal \u0627\u0633 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0645 \u0688\u06cc\u0644\u06cc\u0648\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u067e\u0627\u0644\u06cc\u0633\u06cc \u0645\u0631\u062a\u0628 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u0627\u0635\u0644 \u06a9\u0627\u0645 \u06a9\u0648 \u0633\u0631\u06af\u0631\u0645\u06cc \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">retry = RetryPolicy(\n  (initial_interval = timedelta((seconds = 2))),\n  (backoff_coefficient = 2.0),\n  (maximum_interval = timedelta((minutes = 2))),\n  (maximum_attempts = 5),\n  (non_retryable_error_types = [\"ValueError\", \"AuthenticationError\"]),\n);\n\nresult = await workflow.execute_activity(\n  run_agent_activity,\n  (args = [user_id, goal, toolkit_hint]),\n  (start_to_close_timeout = timedelta((minutes = 30))),\n  (retry_policy = retry),\n);\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>start_to_close_timeout<\/code> \u06cc\u06c1 30 \u0645\u0646\u0679 \u067e\u0631 \u0633\u06cc\u0679 \u06c1\u06d2 \u0627\u0648\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 5 \u06a9\u0648\u0634\u0634\u0648\u06ba \u062a\u06a9 \u0645\u062d\u062f\u0648\u062f \u06c1\u06d2\u060c \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u0645\u06cc\u06ba \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0627\u062a\u0646\u0627 \u0648\u0642\u062a \u0644\u06af \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u067e\u0646\u06d2 \u06a9\u0627\u0645 \u06a9\u06cc \u0636\u0631\u0648\u0631\u06cc\u0627\u062a \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0679\u0627\u0626\u0645\u0631 \u06a9\u0648 \u0628\u0691\u06be\u0627 \u06cc\u0627 \u06af\u06be\u0679\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0633\u062a\u0641\u0633\u0627\u0631<\/strong><\/p>\n<p>\u0627\u06cc\u06a9 \u0686\u06cc\u0632 \u062c\u0648 \u06cc\u06c1\u0627\u06ba Temporal \u06a9\u0648 \u0622\u0633\u0627\u0646 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2 \u0648\u06c1 \u06c1\u06d2 \u0627\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627\u06d4 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0635\u0648\u0631\u062a\u062d\u0627\u0644 \u0627\u0648\u0631 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0627\u0646 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0639\u0644\u06cc\u062d\u062f\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">@workflow.query\ndef status(self) -> str:\nreturn self._status\n\n@workflow.query\ndef result(self) -> dict | None:\nreturn self._result\n<\/code><\/pre>\n<p>\u06af\u06cc\u0679 \u0648\u06d2 \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u0633\u06d2 \u067e\u0648\u0686\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c &quot;\u0648\u0631\u06a9 \u0641\u0644\u0648 X \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u06a9\u06cc\u0627 \u06c1\u06d2\u061f&#8221; \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0648\u0642\u062a \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u062c\u0648\u0627\u0628\u0627\u062a \u062d\u0627\u0635\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0641\u0631\u0646\u0679 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0644\u0646\u06af \u0627\u0633 \u0637\u0631\u062d \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0633\u0631\u06af\u0631\u0645\u06cc<\/strong><\/p>\n<p>\u0633\u0631\u06af\u0631\u0645\u06cc \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u0631\u06cc\u067e\u0646\u06af <code>run_agent<\/code> \u0627\u0648\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-python\">@activity.defn(name=\"run_agent_activity\")\nasync def run_agent_activity(user_id: str, goal: str, toolkit_hint: str | None) -> dict:\n    result = await run_agent(user_id=user_id, goal=goal,             toolkit_hint=toolkit_hint)\n    return result\n<\/code><\/pre>\n<p>\u0646\u06cc\u0679 \u0648\u0631\u06a9 \u06a9\u0648 \u0686\u06be\u0648\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06c1\u0631 \u0686\u06cc\u0632 \u06cc\u06c1\u0627\u06ba \u0631\u06c1\u062a\u06cc \u06c1\u06d2\u060c \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u06a9\u0648 \u0627\u067e\u0646\u0627 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u06a9\u0627\u0631\u06a9\u0646<\/strong><\/p>\n<p>\u06a9\u0627\u0631\u06a9\u0646 \u0639\u0645\u0644 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u067e\u0648\u0644\u0646\u06af \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">worker = Worker(\n            client,\n            task_queue=temporal_settings.temporal_task_queue,\n            workflows=[AgentWorkflow],\n            activities=[run_agent_activity, notify_activity],\n            max_concurrent_activities=5,\n)\n<\/code><\/pre>\n<p>\u0639\u0627\u0631\u0636\u06cc \u0633\u06d2 \u062c\u0691\u06cc\u06ba\u060c \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0648\u0631 \u0633\u0631\u06af\u0631\u0645\u06cc\u0627\u06ba \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u0648 \u0633\u0646\u06cc\u06ba\u06d4 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0645 \u0622\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633\u06d2 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0686\u0644\u0627\u0626\u06cc\u06ba. \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0639\u0645\u0644 \u06c1\u06d2 \u062c\u0648 Kubernetes Pod \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0639\u0645\u0644 \u06c1\u06d2 \u062c\u0633\u06d2 KEDA \u0628\u0639\u062f \u0645\u06cc\u06ba \u0642\u0637\u0627\u0631 \u06a9\u06cc \u06af\u06c1\u0631\u0627\u0626\u06cc \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u067e\u06cc\u0645\u0627\u0646\u06c1 \u06a9\u0631\u06d2 \u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-the-agent-gateway\">\u0627\u06cc\u062c\u0646\u0679 \u06af\u06cc\u0679 \u0648\u06d2<\/h3>\n<p>\u06af\u06cc\u0679 \u0648\u06d2 \u0627\u06cc\u06a9 \u0641\u0627\u0633\u0679 \u0627\u06d2 \u067e\u06cc \u0622\u0626\u06cc \u0627\u06cc\u067e \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u0627\u0648\u0631 \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0628\u06cc\u0679\u06be\u062a\u06cc \u06c1\u06d2\u06d4 \u062c\u0627\u0628 \u0688\u0633\u067e\u06cc\u0686\u060c \u0633\u0679\u06cc\u0679\u0633 \u067e\u0648\u0644\u0646\u06af\u060c \u0627\u0648\u0631 \u0645\u0646\u0633\u0648\u062e\u06cc \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u062e\u0648\u062f \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648\u0688 \u067e\u0631 \u0639\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0627 \u0648\u0627\u062d\u062f \u0645\u0634\u0646 \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u0633\u06d2 \u0628\u0627\u062a \u06a9\u0631\u0646\u0627 \u0627\u0648\u0631 \u062c\u0644\u062f\u06cc \u0633\u06d2 \u0648\u0627\u067e\u0633 \u0622\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-dispatching-a-task\">\u06a9\u0627\u0645 \u06a9\u06cc \u062a\u0631\u0633\u06cc\u0644<\/h4>\n<p>\u0688\u0633\u067e\u06cc\u0686 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 <code>apps\/gateway\/routes\/tasks.py<\/code> \u06cc\u06c1\u06cc\u06ba \u0633\u06d2 \u06cc\u06c1 \u0633\u0628 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">  @router.post(\"\/dispatch\", response_model=DispatchResponse)\n  async def dispatch(\n      body: DispatchRequest,\n      user_id: str = Depends(current_user_id),\n  ) -> DispatchResponse:\n      if body.toolkit:\n          access = await check_toolkit_access(user_id, body.toolkit)\n          if not access[\"allowed\"]:\n              raise HTTPException(\n                  status_code=status.HTTP_409_CONFLICT,\n                  detail={\n                      \"error\": \"toolkit_not_connected\",\n                      \"connect_url\": access[\"connect_url\"],\n                  },\n              )\n\n      workflow_id = f\"agent-{user_id}-{uuid.uuid4().hex[:8]}\"\n      await client.start_workflow(\n          WORKFLOW_NAME,\n          args=[user_id, body.goal, body.toolkit],\n          id=workflow_id,\n          task_queue=settings.temporal_task_queue,\n          cron_schedule=body.schedule or \"\",\n      )\n      return DispatchResponse(workflow_id=workflow_id, status=\"dispatched\")\n<\/code><\/pre>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u06ba \u062a\u06cc\u0646 \u0641\u06cc\u0644\u0688\u0632 \u06c1\u06cc\u06ba: \u06af\u0648\u0644\u060c \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0679\u0648\u0644 \u06a9\u0679 \u06a9\u0627 \u0646\u0627\u0645 (\u062a\u0627\u06a9\u06c1 \u0622\u067e \u0679\u0648\u0644 \u06a9\u0679 \u06a9\u0627 \u0646\u0627\u0645 \u0645\u0639\u0644\u0648\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u0645\u06cc\u06ba \u0648\u0642\u062a \u0636\u0627\u0626\u0639 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba)\u060c \u0627\u0648\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u06a9\u0631\u0648\u0646 \u0634\u06cc\u0688\u0648\u0644\u06d4 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 \u0627\u06cc\u06a9 \u067e\u0631\u06cc \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0634\u0646 \u0686\u06cc\u06a9 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0679\u0627\u0633\u06a9 \u06a9\u0648 \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u06a9\u0648 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u067e\u06be\u0631 \u0648\u0631\u06a9 \u0641\u0644\u0648 ID \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2\u06d4<\/p>\n<p>\u062a\u0648\u062c\u06c1 \u0641\u0631\u0645\u0627\u0626\u06cc\u06ba <code>cron_schedule<\/code> \u0645\u06cc\u062f\u0627\u0646 \u06cc\u06c1\u0627\u06ba \u0645\u0639\u06cc\u0627\u0631\u06cc \u06a9\u0631\u0648\u0646 \u0627\u06cc\u06a9\u0633\u067e\u0631\u06cc\u0634\u0646 \u067e\u0627\u0633 \u06a9\u0631\u0646\u0627 \u0679\u0627\u0633\u06a9 \u06a9\u0648 \u0628\u0627\u0631 \u0628\u0627\u0631 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0627\u0645 \u0645\u06cc\u06ba \u0628\u062f\u0644 \u062f\u06d2 \u06af\u0627\u06d4 \u0648\u0642\u062a\u06cc \u0646\u0638\u0627\u0645 \u0627\u0644\u0627\u0648\u0642\u0627\u062a \u06a9\u0648 \u062e\u0648\u062f \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06a9\u0633\u06cc \u0627\u0636\u0627\u0641\u06cc \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-the-preflight-check\">\u067e\u0631\u0648\u0627\u0632 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1<\/h4>\n<p>\u067e\u0631\u0648\u0627\u0632 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 <code>apps\/gateway\/routes\/preflight.py<\/code>. \u06a9\u0633\u06cc \u06a9\u0627\u0645 \u06a9\u0648 \u0628\u06be\u06cc\u062c\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u06c1 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u067e\u0627\u0633 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0645\u0637\u0644\u0648\u0628\u06c1 \u0679\u0648\u0644 \u06a9\u0679 Composio \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">  async def check_toolkit_access(user_id: str, toolkit_hint: str | None) -> dict:\n      if not toolkit_hint:\n          return {\"allowed\": True}\n\n      connected = await asyncio.to_thread(\n          _has_active_account, composio, user_id, toolkit_hint\n      )\n      if connected:\n          return {\"allowed\": True}\n\n      connect_url = await asyncio.to_thread(\n          _connect_link, composio, user_id, toolkit_hint\n      )\n      return {\"allowed\": False, \"toolkit\": toolkit_hint, \"connect_url\": connect_url}\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u06a9\u0646\u06a9\u0634\u0646 \u063a\u0627\u0626\u0628 \u06c1\u06d2\u060c \u06af\u06cc\u0679 \u0648\u06d2 <code>connect_url<\/code> \u0635\u0627\u0631\u0641\u06cc\u0646 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u0638\u0648\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0637\u06d2 \u0634\u062f\u06c1 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-checking-status\">\u0627\u0633\u0679\u06cc\u0679\u0633 \u0686\u06cc\u06a9 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/h4>\n<p>\u062c\u0628 \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0645 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0641\u0631\u0646\u0679 \u0627\u06cc\u0646\u0688 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06a9\u0648 \u067e\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-python\">  @router.get(\"\/{workflow_id}\", response_model=TaskStatusResponse)\n  async def get_task(workflow_id: str, ...) -> TaskStatusResponse:\n      if not _owns(workflow_id, user_id):\n          raise HTTPException(status_code=404, detail=\"task not found\")\n\n      handle = client.get_workflow_handle(workflow_id, run_id=run_id)\n      agent_status = await handle.query(\"status\")\n\n      if desc.status == WorkflowExecutionStatus.COMPLETED:\n          result = await handle.query(\"result\")\n\n      return TaskStatusResponse(...)\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>status<\/code> \u0627\u0648\u0631 <code>result<\/code> \u06cc\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0679\u06cc\u0645\u067e\u0648\u0631\u0644 \u06a9\u06d2 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06a9\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0633\u06d2 \u0622\u062a\u0627 \u06c1\u06d2 \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u062f\u06cc\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0627\u0644\u06af \u0627\u0633\u0679\u06cc\u0679 \u0679\u06cc\u0628\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u0642\u062f\u0645 \u06a9\u06d2 \u0628\u0639\u062f \u06a9\u0648\u0626\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0646\u06c1\u06cc\u06ba \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0686\u06be \u0639\u0627\u0631\u0636\u06cc <strong>\u0633\u0686\u0627\u0626\u06cc \u06a9\u0627 \u0630\u0631\u06cc\u0639\u06c1<\/strong>.<\/p>\n<h3 id=\"heading-containerizing-the-application\">\u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u06a9\u0646\u0679\u06cc\u0646\u0631\u0627\u0626\u0632\u06cc\u0634\u0646<\/h3>\n<p>\u06af\u06cc\u0679 \u0648\u06cc\u0632 \u0627\u0648\u0631 \u0648\u0631\u06a9\u0631\u0632 \u06a9\u0648 \u062f\u0648 \u0627\u0644\u06af \u0627\u0644\u06af \u0627\u0645\u06cc\u062c\u0632 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u06cc\u06a9 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0634\u06cc\u0626\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u067e\u06cc\u0645\u0627\u0646\u06c1 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06cc \u0645\u062e\u062a\u0644\u0641 \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc\u0627\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0688\u0627\u06a9\u0631 \u0641\u0627\u0626\u0644\u0632 <code>\/docker<\/code> \u0627\u0633\u06d2 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0644\u0679\u06cc \u0627\u0633\u0679\u06cc\u062c \u0628\u0644\u0688 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-why-multi-stage\">\u06a9\u062b\u06cc\u0631 \u0633\u0637\u062d\u06cc \u06a9\u06cc\u0648\u06ba\u061f <\/h4>\n<p>\u0628\u0644\u0688\u0631 \u0645\u0631\u062d\u0644\u06c1 Python \u067e\u06cc\u06a9\u062c\u0648\u06ba \u06a9\u0648 \u0645\u0631\u062a\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0645\u067e\u0627\u0626\u0644\u0631 \u0627\u0648\u0631 \u0628\u0644\u0688 \u0679\u0648\u0644\u0632 \u06a9\u0648 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0645\u0631\u062d\u0644\u06c1 \u0635\u0631\u0641 \u0645\u06a9\u0645\u0644 \u0627\u0646\u062d\u0635\u0627\u0631 \u0627\u0648\u0631 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u0648\u0688 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062d\u062a\u0645\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc\u06ba \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0627\u0648\u0632\u0627\u0631 \u0688\u0627\u0644\u0646\u06d2 \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0645\u0637\u0644\u0628 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-the-gateway-image\">\u06af\u06cc\u0679 \u0648\u06d2 \u06a9\u06cc \u062a\u0635\u0648\u06cc\u0631<\/h4>\n<pre><code class=\"language-dockerfile\">FROM python:3.14-slim-bookworm AS builder\n\nRUN python -m venv \/opt\/venv\nENV PATH=\"\/opt\/venv\/bin:$PATH\"\n\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\n\nFROM python:3.14-slim-bookworm AS runtime\n\nENV PYTHONUNBUFFERED=1 PATH=\"\/opt\/venv\/bin:$PATH\"\n\nRUN useradd --create-home --uid 10001 app\nWORKDIR \/app\n\nCOPY --from=builder \/opt\/venv \/opt\/venv\nCOPY . .\n\nUSER app\nEXPOSE 8000\nCMD [\"python\", \"main.py\"]\n<\/code><\/pre>\n<p>\u0631\u0646 \u0679\u0627\u0626\u0645 \u0645\u0631\u062d\u0644\u06d2 \u067e\u0631 <code>venv<\/code> \u0628\u0644\u0688\u0631 \u0645\u06cc\u06ba\u060c \u0646\u0627\u0646 \u0631\u0648\u0679 \u0635\u0627\u0631\u0641 \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 FastAPI \u0627\u06cc\u067e \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0648\u0631 \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06cc \u0637\u0631\u062d\u060c \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u062c\u0691 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba (\u0627\u06cc\u06a9 \u0627\u0686\u06be\u0627 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0628\u0646\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0646\u0627\u0633\u0628 \u062d\u0641\u0627\u0638\u062a\u06cc \u0637\u0631\u06cc\u0642\u0648\u06ba \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u06cc\u06ba )\u06d4<\/p>\n<h4 id=\"heading-the-worker-image\">\u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06cc \u062a\u0635\u0648\u06cc\u0631<\/h4>\n<p>\u0648\u0631\u06a9\u0631 \u0688\u0627\u06a9\u0631 \u0641\u0627\u0626\u0644 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06d2 \u0633\u06d2 \u0641\u0631\u0642 \u06a9\u06d2 \u0639\u0644\u0627\u0648\u06c1 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-dockerfile\"># procps gives us pgrep for the liveness probe\nRUN apt-get update \n && apt-get install -y --no-install-recommends procps \n && rm -rf \/var\/lib\/apt\/lists\/*\n<\/code><\/pre>\n<p>procps \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u062a\u0627\u06a9\u06c1 Kubernetes liveness probe pgrep \u06a9\u0648 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u0644\u0627 \u0633\u06a9\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u06cc\u06c1 \u0639\u0645\u0644 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u0641\u0639\u0627\u0644 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-building-and-loading-the-images\">\u062a\u0635\u0627\u0648\u06cc\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba\u06d4<\/h4>\n<p>\u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627 \u0627\u0633\u06a9\u0631\u067e\u0679 \u06c1\u06d2\u06d4 <code>scripts\/build-images.sh<\/code> \u062f\u0648\u0646\u0648\u06ba \u0627\u0645\u06cc\u062c\u0632 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0631 \u0627\u06cc\u067e \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u06a9\u0648 \u0628\u0644\u0688 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u0627\u0633 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\">docker build \n -f \"$ROOT\/docker\/Dockerfile.gateway\" \n    -t \"agent-gateway:$TAG\" \n \"$ROOT\/apps\/gateway\"\n\ndocker build \n -f \"$ROOT\/docker\/Dockerfile.worker\" \n    -t \"agent-worker:$TAG\" \n \"$ROOT\/apps\/worker\"\n<\/code><\/pre>\n<p>Dockerfile \u067e\u0631 \u0648\u0627\u0642\u0639 \u06c1\u06d2: <code>docker\/<\/code> \u062a\u0627\u06c1\u0645\u060c \u06c1\u0631 \u0627\u06cc\u06a9 \u0627\u067e\u0646\u06cc \u0627\u06cc\u067e \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0628\u0633 <code>COPY . .<\/code> \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u06cc \u06a9\u0627\u067e\u06cc \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u062a\u0635\u0648\u06cc\u0631 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0642\u062f\u0645 \u0627\u0679\u06be\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0645\u0642\u0627\u0645\u06cc k3d \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 Docker \u0688\u06cc\u0645\u0648\u0646 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06cc\u06c1 \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0627\u0626\u06cc \u06af\u0626\u06cc \u062a\u0635\u0627\u0648\u06cc\u0631 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4 \u0622\u067e \u06a9\u0648 \u0627\u0633\u06d2 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<pre><code class=\"language-shell\">k3d image import \"agent-gateway:dev\" \"agent-worker:dev\" -c agent\n<\/code><\/pre>\n<p><code>scripts\/load-images.sh<\/code>    \u0645\u06cc\u06ba \u06cc\u06c1 \u062a\u0645\u06c1\u0627\u0631\u06d2 \u0644\u06cc\u06d2 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u06d4 \u062f\u0631\u0622\u0645\u062f \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06a9\u0644\u0633\u0679\u0631 \u062d\u0633\u0628 \u0645\u0639\u0645\u0648\u0644 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u06be\u06cc\u0646\u0686 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u0648\u0688\u0632 \u0634\u0631\u0648\u0639 \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4 <\/p>\n<h3 id=\"heading-deploying-to-kubernetes\">Kubernetes \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u062a\u0635\u0648\u06cc\u0631 \u0628\u0646 \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u0644\u0648\u0688 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u0627\u06af\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 \u0633\u06cc\u0679 \u0627\u067e \u062f\u0648 \u062a\u06c1\u0648\u06ba \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u06d4 \u0679\u0627\u0626\u0631 1 \u0627\u06c1\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06c1\u06d2\u06d4 <code>namespace<\/code>\u060c <code>config<\/code>\u0627\u0648\u0631 <code>deployments<\/code>. \u0679\u0627\u0626\u0631 2 \u0622\u0679\u0648 \u0627\u0633\u06a9\u06cc\u0644\u0646\u06af \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06af\u0644\u06d2 \u062d\u0635\u06d2 \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-config-and-secrets\">\u062a\u0631\u062a\u06cc\u0628 \u0627\u0648\u0631 \u0631\u0627\u0632<\/h4>\n<p>\u063a\u06cc\u0631 \u062d\u0633\u0627\u0633 \u062a\u0631\u062a\u06cc\u0628 \u06c1\u06d2\u06d4 <code>ConfigMap<\/code> \u06a9\u0648 <code>infra\/k8s\/01-configmap.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">data:\n  MODEL: \"claude-opus-4-8\"\n  MAX_TOKENS: \"4096\"\n  MAX_ITERATIONS: \"20\"\n  TEMPORAL_HOST: \"temporal-frontend.temporal.svc.cluster.local:7233\"\n  TEMPORAL_TASK_QUEUE: \"agent-tasks\"\n  GATEWAY_HOST: \"0.0.0.0\"\n  GATEWAY_PORT: \"8000\"\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0633\u06d2 \u0639\u0627\u0631\u0636\u06cc \u0645\u06cc\u0632\u0628\u0627\u0646 \u06a9\u0627 \u067e\u062a\u06c1 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 \u0639\u0627\u0644\u0645\u06cc \u0627\u0646\u0679\u0631\u0627 \u06a9\u0644\u0633\u0679\u0631 DNS \u0646\u0627\u0645 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0639\u0627\u0631\u0636\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u0639\u0627\u0631\u0636\u06cc \u0641\u0631\u0646\u0679 \u0627\u06cc\u0646\u0688 \u0633\u0631\u0648\u0633 \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u062a\u06c1 \u0635\u0631\u0641 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u062d\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0679\u06be\u06cc\u06a9 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06af\u06cc\u0679 \u0648\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>API \u06a9\u0644\u06cc\u062f \u0627\u06cc\u06a9 Kubernetes \u0631\u0627\u0632 \u0645\u06cc\u06ba \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u062c\u0633\u06d2 \u0622\u067e \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 Git \u0645\u06cc\u06ba \u0627\u0631\u062a\u06a9\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062f\u0648\u0646\u0648\u06ba <code>ConfigMap<\/code> \u0627\u0648\u0631 <code>Secret<\/code> \u06cc\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u06cc\u06a9 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0635\u0628 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2: <code>envFrom<\/code> \u06c1\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0645\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-the-gateway-deployment\">\u06af\u06cc\u0679 \u0648\u06d2 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u06d4<\/h4>\n<pre><code class=\"language-yaml\">spec:\n  replicas: 2\n  containers:\n    - name: gateway\n      image: agent-gateway:dev\n      imagePullPolicy: IfNotPresent\n      command:\n        [\n          \"python\",\n          \"-m\",\n          \"uvicorn\",\n          \"main:\/app\",\n          \"--host\",\n          \"0.0.0.0\",\n          \"--port\",\n          \"8000\",\n        ]\n      readinessProbe:\n        httpGet:\n          path: \/health\n          port: 8000\n      resources:\n        requests:\n          cpu: 100m\n          memory: 256Mi\n        limits:\n          cpu: 500m\n          memory: 512Mi\n<\/code><\/pre>\n<p>\u0686\u0646\u062f \u0628\u0627\u062a\u06cc\u06ba \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u06c1 \u06c1\u06cc\u06ba\u06d4 <code>imagePullPolicy: IfNotPresent<\/code> Kubernetes \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631\u06cc \u0633\u06d2 \u06a9\u06be\u06cc\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u06be\u0631\u06cc \u06c1\u0648\u0626\u06cc \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06c1\u062f\u0627\u06cc\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u0627\u0631\u0679 \u0627\u067e \u06a9\u0645\u0627\u0646\u0688 reload=True \u0641\u0644\u06cc\u06af \u06a9\u0648 \u0646\u0638\u0631\u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0648 main.py \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u06cc\u0688\u06cc \u0646\u06cc\u0633 \u067e\u0631\u0648\u0628 \u06c1\u0679 <code>\/health<\/code> \u06af\u06cc\u0679 \u0648\u06d2 \u0635\u0631\u0641 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0648\u0635\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06cc\u06c1 \u062d\u0642\u06cc\u0642\u062a \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 Kubernetes Pods \u067e\u0631 \u0679\u0631\u06cc\u0641\u06a9 \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06af\u06cc\u0679 \u0648\u06d2 \u0628\u06be\u06cc \u06c1\u06d2\u06d4 <code>ClusterIP<\/code> \u062e\u062f\u0645\u0627\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u062f\u06cc\u06af\u0631 \u067e\u0648\u0688\u0632 \u0627\u0648\u0631 \u067e\u0648\u0631\u0679 \u0641\u0627\u0631\u0648\u0631\u0688\u0646\u06af \u0627\u0646 \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u0633\u06a9\u06d2\u06d4<\/p>\n<pre><code class=\"language-yaml\">apiVersion: v1\nkind: Service\nmetadata:\n  name: gateway\nspec:\n  type: ClusterIP\n  ports:\n    - port: 8000\n      targetPort: 8000\n<\/code><\/pre>\n<h4 id=\"heading-the-worker-deployment\">\u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u06d4<\/h4>\n<pre><code class=\"language-yaml\"># just polls Temporal.\nspec:\n  replicas: 1\n  containers:\n    - name: worker\n      image: agent-worker:dev\n      livenessProbe:\n        exec:\n          command: [\"pgrep\", \"-f\", \"worker.py\"]\n        initialDelaySeconds: 15\n        periodSeconds: 20\n      resources:\n        requests:\n          cpu: 250m\n          memory: 512Mi\n        limits:\n          cpu: \"1\"\n          memory: 1Gi\n<\/code><\/pre>\n<p>\u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u062e\u062f\u0645\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0631\u0627\u0628\u0637\u0648\u06ba \u06a9\u0648 \u0642\u0628\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0639\u0627\u0631\u0636\u06cc \u0627\u0648\u0631 \u06a9\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0648\u0644\u0632 \u0633\u06d2 \u062c\u0691\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06a9\u0633\u06cc \u0686\u06cc\u0632 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633\u06cc \u0644\u06cc\u06d2 <strong>procps Dockerfile \u0645\u06cc\u06ba \u0627\u0646\u0633\u0679\u0627\u0644 \u06c1\u06d2\u06d4<\/strong>.<\/p>\n<p>\u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u06af\u06cc\u0679 \u0648\u06cc\u0632 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0633\u0627\u0626\u0644 \u0645\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0686\u0648\u0646\u06a9\u06c1 \u0622\u067e LLM \u06a9\u0627\u0644\u0632 \u0627\u0648\u0631 \u0679\u0648\u0644\u0632 \u0686\u0644\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0632\u06cc\u062f \u0648\u0633\u0627\u0626\u0644 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u06cc \u0636\u0631\u0648\u0631\u06cc\u0627\u062a \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u06a9\u06cc\u067e\u0633 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u06cc \u062c\u0627\u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-applying-everything\">\u0633\u0628 \u06a9\u0686\u06be \u0644\u0627\u06af\u0648 \u06a9\u0631\u06cc\u06ba<\/h4>\n<p>\u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0627\u0633\u06a9\u0631\u067e\u0679 \u06cc\u06c1\u0627\u06ba \u0648\u0627\u0642\u0639 \u06c1\u06d2: <code>scripts\/deploy.sh<\/code> \u0635\u062d\u06cc\u062d \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u0679\u0627\u0626\u0631 1 \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl apply -f \"$K8S\/00-namespace.yaml\"\nkubectl apply -f \"$K8S\/01-configmap.yaml\"\nkubectl apply -f \"$K8S\/10-gateway-deployment.yaml\"\nkubectl apply -f \"$K8S\/20-worker-deployment.yaml\"\n<\/code><\/pre>\n<p>\u0622\u0631\u0688\u0631 \u06cc\u06c1\u0627\u06ba \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0627 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0622\u067e \u0627\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u06a9\u0648\u0626\u06cc \u0627\u0648\u0631 \u0686\u06cc\u0632 \u0628\u0646\u0627 \u0633\u06a9\u06cc\u06ba\u06d4 <code>ConfigMap<\/code> \u067e\u0648\u0688 \u06a9\u06d2 \u0645\u0646\u062f\u0631\u062c\u0627\u062a \u06a9\u0648 \u067e\u0691\u06be\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633 \u06a9\u0627 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-autoscaling-with-keda\">KEDA \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u0679\u0648 \u0627\u0633\u06a9\u06cc\u0644\u0646\u06af<\/h3>\n<p>Kubernetes CPU \u06cc\u0627 \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 Pods \u06a9\u0648 \u062a\u0631\u0627\u0632\u0648 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0646 \u06af\u06cc\u0679 \u0648\u06cc\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2 \u062c\u0648 HTTP \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u06d2 \u062a\u0646\u0627\u0633\u0628 \u0633\u06d2 CPU \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u06cc\u06a9\u0646 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u062f\u0631\u0633\u062a \u0627\u0634\u0627\u0631\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0645 \u0627\u0646\u062a\u0638\u0627\u0631 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0627\u0631\u06a9\u0646 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06cc\u06a9\u0627\u0631 \u06c1\u06d2\u06d4 \u06a9\u0633\u06cc \u0628\u06be\u06cc CPU \u0644\u06cc\u0679\u0646\u0633\u06cc \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u06a9\u0627\u0645 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u06c1 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0645\u0635\u0631\u0648\u0641 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2. \u0622\u067e \u0648\u0627\u0642\u0639\u06cc \u062c\u0633 \u0686\u06cc\u0632 \u06a9\u0648 \u067e\u06cc\u0645\u0627\u0646\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u0642\u0637\u0627\u0631 \u06a9\u06cc \u06af\u06c1\u0631\u0627\u0626\u06cc \u06c1\u06d2\u060c \u06cc\u0639\u0646\u06cc \u0645\u0644\u0627\u0632\u0645\u062a\u0648\u06ba \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u062c\u0648 \u0686\u0646\u0646\u06d2 \u06a9\u06d2 \u0645\u0646\u062a\u0638\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 KEDA \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0645\u06cc\u0679\u0631\u06a9\u0633 \u062c\u06cc\u0633\u06d2 \u0642\u0637\u0627\u0631 \u06a9\u06cc \u0644\u0645\u0628\u0627\u0626\u06cc\u060c \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f\u060c \u06cc\u0627 \u0627\u0633 \u0645\u0639\u0627\u0645\u0644\u06d2 \u0645\u06cc\u06ba \u0639\u0627\u0631\u0636\u06cc \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06cc \u06af\u06c1\u0631\u0627\u0626\u06cc \u06a9\u0648 \u067e\u0691\u06be\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0633\u06cc \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0627\u067e\u0646\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-scaling-the-worker\">\u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06cc \u062a\u0648\u0633\u06cc\u0639<\/h4>\n<p>\u06a9\u06c1 <code>ScaledObject<\/code> \u06a9\u0648 <code>infra\/k8s\/40-keda-worker-scaledobject.yaml<\/code> \u06cc\u06c1 \u06c1\u06d2 \u062c\u0648 KEDA \u062f\u06cc\u06a9\u06be \u0631\u06c1\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-yaml\">spec:\n  scaleTargetRef:\n    name: worker\n  minReplicaCount: 0\n  maxReplicaCount: 10\n  cooldownPeriod: 120\n  triggers:\n    - type: temporal\n      metadata:\n        endpoint: temporal-frontend.temporal.svc.cluster.local:7233\n        namespace: default\n        taskQueue: agent-tasks\n        queueTypes: \"workflow,activity\"\n        targetQueueSize: \"5\"\n        activationTargetQueueSize: \"0\"\n<\/code><\/pre>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u06c1\u0645 \u0634\u0639\u0628\u0648\u06ba \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ul>\n<li>\n<p><code>minReplicaCount<\/code>: 0 \u0633\u0628 \u0633\u06d2 \u0628\u0691\u0627 \u06c1\u06d2\u06d4 KEDA \u0635\u0641\u0631 \u062a\u06a9 \u067e\u06cc\u0645\u0627\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u0645\u0639\u06cc\u0627\u0631\u06cc HPA \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4 \u062c\u0628 \u0642\u0637\u0627\u0631 \u062e\u0627\u0644\u06cc \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0645\u0627\u0645 \u0648\u0631\u06a9\u0631 \u067e\u0648\u0688\u0632 \u062e\u062a\u0645 \u06a9\u0631\u062f\u06cc\u0626\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062c\u0628 \u0622\u067e \u06a9\u0627 \u0633\u0633\u0679\u0645 \u0628\u06cc\u06a9\u0627\u0631 \u06c1\u06d2 \u062a\u0648 \u0622\u067e \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p><code>activationTargetQueueSize<\/code>: &quot;0&#8221; \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 KEDA \u0627\u0633 \u0648\u0642\u062a \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0648 \u0628\u06cc\u062f\u0627\u0631 \u06a9\u0631 \u062f\u06d2 \u06af\u0627 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u062f\u0627\u062e\u0644 \u06c1\u0648 \u06af\u0627\u06d4 \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u067e\u06be\u0644\u06cc \u0646\u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0639\u0645\u0644 \u0633\u06d2 \u067e\u06be\u0644\u06cc \u06af\u06be\u0648\u0645\u0646\u0627 \u0634\u0631\u0648\u0639 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><code>targetQueueSize<\/code>: &quot;5&#8221; KEDA \u06a9\u0648 \u06c1\u0631 \u067e\u0627\u0646\u0686 \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u06cc\u06a9 \u0648\u0631\u06a9\u0631 \u067e\u0648\u0688 \u06a9\u0648 \u0646\u0634\u0627\u0646\u06c1 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06cc \u06c1\u062f\u0627\u06cc\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 10 \u0642\u0637\u0627\u0631 \u0648\u0627\u0644\u06d2 \u06a9\u0627\u0645 2 \u067e\u0648\u0688 \u06a9\u06d2 \u0628\u0631\u0627\u0628\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p><code>cooldownPeriod<\/code>:120 \u0642\u0637\u0627\u0631 \u0635\u0627\u0641 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f KEDA \u06a9\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0633\u06a9\u0691\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 120 \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u0627 \u0628\u0641\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><code>queueTypes<\/code>: &quot;\u0648\u0631\u06a9 \u0641\u0644\u0648\u060c \u0633\u0631\u06af\u0631\u0645\u06cc&#8221; \u062f\u0648\u0646\u0648\u06ba \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c KEDA \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u06a9\u0627\u0645 \u06a9\u0627 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u062d\u0635\u06c1 \u062f\u06cc\u06a9\u06be \u0633\u06a9\u06d2 \u06af\u0627\u06d4<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0645\u06cc\u0645\u0648<\/strong>: \u0627\u06cc\u0688\u06c1\u0627\u06a9 \u0627\u0633\u06a9\u06cc\u0644\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 KEDA v2.17 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0627 \u06c1\u06cc\u0644\u0645 \u0627\u0646\u0633\u0679\u0627\u0644\u06cc\u0634\u0646 \u0645\u0646\u0627\u0633\u0628 \u0648\u0631\u0698\u0646 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0627\u0648\u067e\u0631 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-scaling-the-gateway\">\u06af\u06cc\u0679 \u0648\u06d2 \u06a9\u06cc \u062a\u0648\u0633\u06cc\u0639<\/h4>\n<p>\u06af\u06cc\u0679 \u0648\u06cc\u0632 \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 CPU \u067e\u0631 \u0645\u0628\u0646\u06cc HPA \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>infra\/k8s\/41-gateway-hpa.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">spec:\n  minReplicas: 2\n  maxReplicas: 6\n  metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        target:\n          type: Utilization\n          averageUtilization: 60\n<\/code><\/pre>\n<p>\u06af\u06cc\u0679 \u0648\u06d2 \u0627\u0635\u0644 \u06a9\u0627\u0645 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06cc HTTP \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0645\u062a\u0646\u0627\u0633\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06cc\u06c1\u0627\u06ba CPU \u062f\u0631\u0633\u062a \u0633\u06af\u0646\u0644 \u06c1\u06d2\u06d4 API \u06a9\u06cc \u0637\u0631\u0641 \u06a9\u0648\u0626\u06cc \u06a9\u0648\u0644\u0688 \u0627\u0633\u0679\u0627\u0631\u0679 \u062a\u0627\u062e\u06cc\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u0645 \u0627\u0632 \u06a9\u0645 2 \u0646\u0642\u0644\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-installing-keda\">KEDA \u06a9\u06cc \u062a\u0646\u0635\u06cc\u0628<\/h4>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u06cc\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc\u0644\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 KEDA \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2: <code>ScaledObject<\/code>:<\/p>\n<pre><code class=\"language-shell\">helm install keda kedacore\/keda -n keda --create-namespace --wait\nkubectl apply -f infra\/k8s\/40-keda-worker-scaledobject.yaml -f infra\/k8s\/41-gateway-hpa.yaml\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0633\u0633\u0679\u0645 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u0627\u067e\u0646\u0627 \u06a9\u0627\u0645 \u062c\u0645\u0639 \u06a9\u0631\u0648\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u0622\u067e \u06a9\u0627 \u0648\u0631\u06a9\u0631 \u067e\u0648\u0688 \u0646\u0638\u0631 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u067e\u0646\u06cc \u0642\u0637\u0627\u0631 \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u063a\u0627\u0626\u0628 \u06c1\u0648\u062a\u06d2 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u06d4 \u06cc\u06c1\u06cc \u0628\u0627\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0637\u0631\u062d\u060c \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0627\u0646\u062a\u06c1\u0627\u0626\u06cc \u067e\u0627\u0626\u06cc\u062f\u0627\u0631\u060c \u0622\u0679\u0648 \u0627\u0633\u06a9\u06cc\u0644 \u0627\u06cc\u0628\u0644 AI \u0627\u06cc\u062c\u0646\u0679 \u06c1\u06d2 \u062c\u0633\u06d2 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0648\u0642\u062a \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0634\u06cc\u0688\u0648\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06a9\u062a\u0646\u0627 \u0679\u06be\u0646\u0688\u0627 \u06c1\u06d2\u061f <\/p>\n<h2 id=\"heading-agent-in-action\">\u0641\u0639\u0627\u0644 \u0627\u06cc\u062c\u0646\u0679<\/h2>\n<p>\u0639\u0645\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0627 \u0627\u06cc\u06a9 \u0641\u0648\u0631\u06cc \u0688\u06cc\u0645\u0648 \u06cc\u06c1 \u06c1\u06d2 (\u06a9\u0648\u0628\u0631\u0646\u06cc\u0679\u0633 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2):<\/p>\n<p><div class=\"ast-oembed-container \" style=\"height: 100%;\"><iframe loading=\"lazy\" title=\"Durable AI Agent workflow with Kubernetes, KEDA, and Temporal | Blog Demo\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/aZy_scANmU4?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0645\u06cc\u06ba AI \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648 \u0686\u0644\u0627\u0646\u0627 AI \u0627\u06cc\u062c\u0646\u0679 \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u0628\u0627\u0644\u06a9\u0644 \u0645\u062e\u062a\u0644\u0641 \u0645\u0639\u0627\u0645\u0644\u06c1 \u06c1\u06d2\u06d4 \u0645\u06cc\u06ba \u0646\u06d2 \u06cc\u06c1\u0627\u06ba \u0627\u0633 \u0641\u0631\u0642 \u067e\u0631 \u062a\u0648\u062c\u06c1 \u0645\u0631\u06a9\u0648\u0632 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0645\u06cc\u062f \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u06be\u0648\u0633 \u062d\u0648\u0627\u0644\u06c1 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u06d2 \u06af\u0627 \u06a9\u06c1 \u0645\u06cc\u06ba \u0627\u0633\u062a\u062d\u06a9\u0627\u0645 \u0627\u0648\u0631 \u062a\u0648\u0633\u06cc\u0639 \u067e\u0630\u06cc\u0631\u06cc \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u06cc\u0633\u06d2 \u0633\u0648\u0686\u062a\u0627 \u06c1\u0648\u06ba\u06d4 \u0627\u0648\u0631 \u0645\u062c\u06be\u06d2 \u0627\u0645\u06cc\u062f \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633 \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u0622\u067e \u06a9\u06cc \u0639\u0627\u0645 AI \u0686\u06cc\u0679 \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u0633\u06d2 \u06a9\u0686\u06be \u0645\u062e\u062a\u0644\u0641 \u0628\u0646\u0627\u0646\u06d2 \u06cc\u0627 \u0633\u0645\u062c\u06be\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u0645\u0644\u06cc\u06d4<\/p>\n<p>Temporal \u0627\u0648\u0631 KEDA \u06a9\u0627 \u0627\u0645\u062a\u0632\u0627\u062c \u0648\u06c1 \u0686\u06cc\u0632 \u06c1\u06d2 \u062c\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 \u0648\u0627\u0642\u0639\u06cc \u062c\u0627\u0646\u0646\u06d2 \u0627\u0648\u0631 \u0645\u0632\u06cc\u062f \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0622\u067e AI \u0627\u06cc\u062c\u0646\u0679\u0633 \u0628\u0646\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u06cc\u0627 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 DevOps \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 Temporal AI \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba (\u067e\u0627\u0626\u06cc\u062f\u0627\u0631) \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0628 \u0633\u06d2 \u0628\u0691\u06d2 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 KEDA \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0628\u06cc\u06a9\u0627\u0631 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 2am \u067e\u0631 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u0646\u06c1 \u06a9\u0631\u06cc\u06ba \u062c\u0628 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2 (\u0627\u06af\u0631 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2)\u06d4 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u0631\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u060c \u0646\u06c1 \u0635\u0631\u0641 CPU\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0633\u06d2 \u062a\u0648\u0633\u06cc\u0639 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u06af\u0646\u062c\u0627\u0626\u0634 \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u067e\u0646\u06cc \u0688\u06cc\u0648\u0644\u067e\u0645\u0646\u0679 JWT \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0646\u0627\u0633\u0628 OIDC \u0633\u06d2 \u0628\u062f\u0644 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06cc\u0627 \u0645\u0632\u06cc\u062f \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 Composio \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0679\u0648\u0644 \u06a9\u0679 \u06a9\u0648\u0631\u06cc\u062c \u06a9\u0648 \u0628\u0691\u06be\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0646\u06cc\u0627\u062f \u0648\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0628\u0627\u0642\u06cc \u0635\u0631\u0641 \u0627\u0633 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2.<\/p>\n<p>\u0622\u067e \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0633\u0648\u0631\u0633 \u06a9\u0648\u0688 \u06cc\u06c1\u0627\u06ba \u0645\u0644 \u0633\u06a9\u062a\u0627 \u06c1\u06d2: shricodev\/kron-k8s-agent<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 AI \u0627\u06cc\u062c\u0646\u0679 \u062a\u06cc\u0632 \u0631\u0641\u062a\u0627\u0631 \u06a9\u0627\u0645\u0648\u06ba \u0645\u06cc\u06ba \u0627\u0686\u06be\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062c\u0628 \u0622\u067e \u06a9\u0648\u0626\u06cc \u067e\u06cc\u063a\u0627\u0645 \u0628\u06be\u06cc\u062c\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0627 \u0627\u06cc\u062c\u0646\u0679 \u0686\u0646\u062f \u0679\u0648\u0644\u0632 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u06cc\u06a9\u0646\u0688\u0648\u06ba \u0645\u06cc\u06ba \u062c\u0648\u0627\u0628 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06a9\u06d2 \u062e\u0644\u0627\u0635\u0648\u06ba \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u06cc\u0627 \u0627\u0646\u0679\u0631\u0646\u06cc\u0679 \u062a\u062d\u0642\u06cc\u0642 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u06a9\u06cc\u0627 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":25799,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-25798","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/25798","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=25798"}],"version-history":[{"count":1,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/25798\/revisions"}],"predecessor-version":[{"id":25800,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/25798\/revisions\/25800"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media\/25799"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=25798"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=25798"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=25798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}