ื™ืฆื™ืจืช ืžื™ื•ืžื ื•ืช ืžืฆื‘ื™ืช ืขื‘ื•ืจ ืืœื™ืก ื‘ืคื•ื ืงืฆื™ื•ืช ืœืœื ืฉืจืช ืฉืœ Yandex.Cloud ื•-Python

ื‘ื•ืื• ื ืชื—ื™ืœ ืขื ื”ื—ื“ืฉื•ืช. ืืชืžื•ืœ ื”ื•ื“ื™ืขื” Yandex.Cloud ืขืœ ื”ืฉืงืช ืฉื™ืจื•ืช ืžื—ืฉื•ื‘ ืœืœื ืฉืจืชื™ื ืคื•ื ืงืฆื™ื•ืช ืขื ืŸ ืฉืœ Yandex. ื–ื” ืื•ืžืจ: ืืชื” ื›ื•ืชื‘ ืจืง ืืช ื”ืงื•ื“ ืฉืœ ื”ืฉื™ืจื•ืช ืฉืœืš (ืœื“ื•ื’ืžื”, ืืคืœื™ืงืฆื™ื™ืช ืื™ื ื˜ืจื ื˜ ืื• ืฆ'ืื˜ ื‘ื•ื˜), ื•ื”ืขื ืŸ ืขืฆืžื• ื™ื•ืฆืจ ื•ืžืชื—ื–ืง ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื”ื™ื›ืŸ ืฉื”ื•ื ืคื•ืขืœ, ื•ืืฃ ืžืฉื›ืคืœ ืื•ืชืŸ ืื ื”ืขื•ืžืก ื’ื“ืœ. ืœื ืฆืจื™ืš ืœื—ืฉื•ื‘ ื‘ื›ืœืœ, ื–ื” ืžืื•ื“ ื ื•ื—. ื•ื”ืชืฉืœื•ื ื”ื•ืœืš ืจืง ืœื–ืžืŸ ื”ื—ื™ืฉื•ื‘ื™ื.

ืขื ื–ืืช, ื™ื™ืชื›ืŸ ืฉื—ืœืง ืžื”ืื ืฉื™ื ืœื ื™ืฉืœืžื• ื›ืœืœ. ืืœื” ื”ืžืคืชื—ื™ื ื”ื›ื™ืฉื•ืจื™ื ื”ื—ื™ืฆื•ื ื™ื™ื ืฉืœ ืืœื™ืก, ื›ืœื•ืžืจ, ืฆ'ืื˜ื‘ื•ื˜ื™ื ืžื•ื‘ื ื™ื ื‘ื•. ื›ืœ ืžืคืชื— ื™ื›ื•ืœ ืœื›ืชื•ื‘, ืœืืจื— ื•ืœืจืฉื•ื ืžื™ื•ืžื ื•ืช ื›ื–ื•, ื•ืžื”ื™ื•ื ืื™ืŸ ืฆื•ืจืš ืืคื™ืœื• ืœืืจื— ืžื™ื•ืžื ื•ื™ื•ืช - ืคืฉื•ื˜ ื”ืขืœื” ืืช ื”ืงื•ื“ ืฉืœื• ืœืขื ืŸ ื‘ื˜ื•ืคืก ืื•ืชื” ืคื•ื ืงืฆื™ื” ืœืœื ืฉืจืช.

ืื‘ืœ ื™ืฉ ื›ืžื” ื ื™ื•ืื ืกื™ื. ืจืืฉื™ืช, ืงื•ื“ ื—ื™ื™ืช ื”ืžื—ืžื“ ืฉืœืš ืขืฉื•ื™ ืœื“ืจื•ืฉ ื›ืžื” ืชืœื•ืช, ื•ื–ื” ืœื ื˜ืจื™ื•ื•ื™ืืœื™ ืœื’ืจื•ืจ ืื•ืชื ืœืขื ืŸ. ืฉื ื™ืช, ื›ืœ ืฆ'ืื˜ ื‘ื•ื˜ ืจื’ื™ืœ ืฆืจื™ืš ืœืื—ืกืŸ ืืช ืžืฆื‘ ื”ื“ื•-ืฉื™ื— ืื™ืคืฉื”ื• (ืžืฆื‘ื™ ื•ืœื›ืŸ); ืื™ืš ืœืขืฉื•ืช ืืช ื–ื” ื‘ืคื•ื ืงืฆื™ื” ืœืœื ืฉืจืช ื‘ืฆื•ืจื” ื”ืงืœื” ื‘ื™ื•ืชืจ? ืฉืœื™ืฉื™ืช, ืื™ืš ืืชื” ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืžื™ื•ืžื ื•ืช ืžื”ื™ืจื” ื•ืžืœื•ื›ืœื›ืช ืขื‘ื•ืจ ืืœื™ืก ืื• ืืคื™ืœื• ืกื•ื’ ืฉืœ ื‘ื•ื˜ ืขื ืขืœื™ืœื” ืฉืื™ื ื” ืืคืก? ืขืœ ื ื™ื•ืื ืกื™ื ืืœื”, ืœืžืขืฉื”, ื”ืžืืžืจ.

ื™ืฆื™ืจืช ืžื™ื•ืžื ื•ืช ืžืฆื‘ื™ืช ืขื‘ื•ืจ ืืœื™ืก ื‘ืคื•ื ืงืฆื™ื•ืช ืœืœื ืฉืจืช ืฉืœ Yandex.Cloud ื•-Python

ื”ื›ื ื” ืžื•ืกืจื™ืช

ืœื—ืกืจื™ ืกื‘ืœื ื•ืช: ืื ื™ ืื•ืกืฃ ืืช ื”ืชืœื•ืช ื”ื ื“ืจืฉืช ืขื makefile ืœืคื ื™ ื”ืขืœืืช ื”ืคื•ื ืงืฆื™ื” ืœืขื ืŸ, ืื ื™ ืžืื—ืกืŸ ืืช ืžืฆื‘ ื”ื“ื•-ืฉื™ื— ื‘-Yandex Object Storage (ื”ื•ื ืชื•ืžืš ื‘-S3 API), ื•ืื ื™ ืžืฉืชืžืฉ ื‘ืกืคืจื™ื™ื” ืฉืœื™ ื›ื“ื™ ืœื ื”ืœ ืืช ื”ื“ื•-ืฉื™ื— tgalice. ื›ืชื•ืฆืื” ืžื›ืš, ืžืกืชื‘ืจ ื›ื–ื” ืžื™ื•ืžื ื•ืช ื”ื“ื’ืžื”. ื•ืขื›ืฉื™ื• ื‘ื•ืื• ื ื ืชื— ืืช ื›ืœ ื–ื” ื‘ืคื™ืจื•ื˜ ืงื˜ืŸ ื™ื•ืชืจ.

ืœืงืฆืช ืคื—ื•ืช ื—ืกืจื™ ืกื‘ืœื ื•ืช, ืœืคื ื™ ืฉืฆื•ืœืœื™ื ืœืกื™ืคื•ืจ ื”ืžื•ืจื›ื‘ื•ืช ืฉืœื™, ืื ื™ ืžืžืœื™ืฅ ื‘ื—ื•ื ืœื”ืชื—ื™ืœ ื‘ืคืฉื˜ื•ืช. ื›ืœื•ืžืจ, ืฆื•ืจ ืคื•ื ืงืฆื™ื™ืช echobot ืฉืœ ืงื•ื‘ืฅ ื™ื—ื™ื“, ืจืฉื•ื ื•ื‘ื“ื•ืง ืื•ืชื” ื‘ืžืกื•ืฃ ื”ืžืคืชื—ื™ื ืฉืœ Dialog; ืคืจื˜ื™ื - ื‘ ื“ื™ืืœื•ื’ื™ื ื‘ื‘ืœื•ื’ ะธ ืชื™ืขื•ื“ ืขื ืŸ. ื•ืจืง ืื– ืœื”ืชื—ื™ืœ.

ืื ืืชื” ืจื•ืฆื” ืœื”ืจื’ื™ืฉ ืžื™ื“ ืขืœ ืžื” ืื ื—ื ื• ื ืœื—ืžื™ื, ืฉืืœ ืืช ืืœื™ืก'ื”ืคืขืœ ืืช ื”ืžื™ื•ืžื ื•ืช "ื”ื•ืจื•ืกืงื•ืค IT"'. ื”ื“ื™ืืœื•ื’ ื”ื‘ื ืฆืจื™ืš ืœื”ืชืงื™ื™ื:

ืืœื™ืก: ืฉืœื•ื! ืืชื” ื‘ืžื™ื•ืžื ื•ืช "ื”ื•ืจื•ืกืงื•ืค IT". ืืžื•ืจ "ื”ืชื—ืœ" ื›ื“ื™ ืœื’ืœื•ืช ืžื” ื”ื›ื•ื›ื‘ื™ื ืžื‘ื˜ื™ื—ื™ื ืœืš.
ืžืฉืชืžืฉ: ื”ืชื—ืœ
ืช: ื ื ืœืฆื™ื™ืŸ ืืช ืฉืžืš.
Yu: Vasisualy
ืช: ืขื›ืฉื™ื• ืกืคืจ ืœื™ ืืช ืฉื ืช ืœื™ื“ืชืš. ืจืง ืืจื‘ืข ืกืคืจื•ืช, ืœื ื™ื•ืชืจ.
ื™ื•: ืฉื ื™
ืช: ืื ื ื ืกื” ืฉื•ื‘. ืฆื™ื™ื ื• ืืช ืฉื ืช ื”ืœื™ื“ื” ืฉืœื›ื - ืืจื‘ืข ืกืคืจื•ืช.
ื™ื•: 2002
ื’ื“ื•ืœ! ืขื›ืฉื™ื• ืชืŸ ืฉื ืœื—ื•ื“ืฉ ื”ืœื™ื“ื” ืฉืœืš.
ื™ื•: ืคื‘ืจื•ืืจ
ื’ื“ื•ืœ! ืœื‘ืกื•ืฃ, ืกืคืจ ืœื™ ืืช ืชืืจื™ืš ื”ืœื™ื“ื” ืฉืœืš - ืจืง ืžืกืคืจ, ืจืง ืกืคืจื” ืื—ืช ืื• ืฉืชื™ื™ื.
ื™ื•: 18
ืช: ืชื•ื“ื” ืœืš, Vasisual! ืขื›ืฉื™ื• ืื ื—ื ื• ื™ื•ื“ืขื™ื: ืืชื” ื‘ืŸ 17 ื•ืืชื” ื“ืœื™. ื”ื ื” ืืชื”, ื›ืžื•ื‘ืŸ, ื‘ืจ ืžื–ืœ! ื”ื›ื•ื›ื‘ื™ื ืื•ืžืจื™ื ืœืš ะฐ ั‡ั‚ะพ ะณะพะฒะพั€ัั‚ ะทะฒั‘ะทะดั‹, ะฒั‹ ัƒะทะฝะฐะตั‚ะต, ะทะฐะฟัƒัั‚ะธะฒ ะฝะฐะฒั‹ะบ.

ื”ื‘ืขื™ื” ื”ื™ื ืฉื›ื“ื™ ืœืฉืžื•ืจ ืืคื™ืœื• ืขืœ ื“ื™ืืœื•ื’ ื›ืœ ื›ืš ืคืฉื•ื˜, ืฆืจื™ืš ืœื–ื›ื•ืจ ืืช ื”ืฉื ื•ืชืืจื™ืš ื”ืœื™ื“ื” ืฉืœ ื”ืžืฉืชืžืฉ, ื•ื‘ืกื‘ื™ื‘ื” ืœืœื ืฉืจืช ื–ื” ืœื ื˜ืจื™ื•ื•ื™ืืœื™. ื–ื” ืœื ื™ืขื‘ื•ื“ ืœืื—ืกืŸ ืืช ื”ื”ืงืฉืจ ื‘-RAM ืื• ื›ืงื•ื‘ืฅ ื‘ื“ื™ืกืง, ื‘ื’ืœืœ Yandex.Cloud ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” ืขืœ ืžืกืคืจ ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื‘ื• ื–ืžื ื™ืช ื•ืœืขื‘ื•ืจ ื‘ื™ื ื™ื”ื ื‘ืื•ืคืŸ ืฉืจื™ืจื•ืชื™. ืชืฆื˜ืจืš ืœื”ืฉืชืžืฉ ื‘ืื—ืกื•ืŸ ื—ื™ืฆื•ื ื™ ื›ืœืฉื”ื•. Object Storage ื ื‘ื—ืจ ื›ืื—ืกื•ืŸ ื“ื™ ื–ื•ืœ ื•ืคืฉื•ื˜ ื™ืฉื™ืจื•ืช ื‘-Yandex.Cloud (ื›ืœื•ืžืจ, ื›ื ืจืื” ืžื”ื™ืจ). ื›ื—ืœื•ืคื” ื—ื™ื ืžื™ืช, ืืชื” ื™ื›ื•ืœ ืœื ืกื•ืช, ืœืžืฉืœ, ื™ืฆื™ืจื” ื‘ื—ื™ื ื ืžื•ื ื’ื™ ืžืขื•ื ืŸ ืื™ืคืฉื”ื• ืจื—ื•ืง. ื’ื ืœ-Object Storage (ื”ื•ื ืชื•ืžืš ื‘ืžืžืฉืง S3) ื•ื’ื ืœืžื•ื ื’ื• ื™ืฉ ืขื˜ื™ืคื•ืช Python ื ื•ื—ื•ืช.

ื‘ืขื™ื” ื ื•ืกืคืช ื”ื™ื ืฉื›ื“ื™ ืœืขื‘ื•ืจ ืœ-Object Storage, MongoDB ื•ืœื›ืœ ืžืกื“ ื ืชื•ื ื™ื ืื• ืžืื’ืจ ื ืชื•ื ื™ื ืื—ืจ, ืืชื” ืฆืจื™ืš ื›ืžื” ืชืœื•ืช ื—ื™ืฆื•ื ื™ื•ืช ืฉืืชื” ืฆืจื™ืš ืœื”ืขืœื•ืช ืœ- Yandex Functions ื™ื—ื“ ืขื ืงื•ื“ ื”ืคื•ื ืงืฆื™ื” ืฉืœืš. ื•ืื ื™ ืจื•ืฆื” ืœืขืฉื•ืช ืืช ื–ื” ื‘ื ื•ื—ื•ืช. ื–ื” ื ื•ื— ืœื—ืœื•ื˜ื™ืŸ (ื›ืžื• ื‘-heroku), ืื‘ื•ื™, ื–ื” ืœื ื™ืขื‘ื•ื“, ืื‘ืœ ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืงืฆืช ื ื•ื—ื•ืช ื‘ืกื™ืกื™ืช ืขืœ ื™ื“ื™ ื›ืชื™ื‘ืช ืกืงืจื™ืคื˜ ืœื‘ื ื™ื™ืช ื”ืกื‘ื™ื‘ื” (ืขืฉื” ืงื•ื‘ืฅ).

ืื™ืš ืœื”ืชื—ื™ืœ ืืช ืžื™ื•ืžื ื•ืช ื”ื”ื•ืจื•ืกืงื•ืค

  1. ืชืชื›ื•ื ืŸ: ืœืš ืœืื™ื–ื” ืžื—ืฉื‘ ืขื ืœื™ื ื•ืงืก. ื‘ืื•ืคืŸ ืขืงืจื•ื ื™, ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉื’ื ืืชื” ื™ื›ื•ืœ ืœืขื‘ื•ื“ ืขื Windows, ืื‘ืœ ืื– ืืชื” ืฆืจื™ืš ืœื”ืขืœื•ืช ืขืœ ื”ื“ืขืช ืขื ื”ืฉืงืช ื”-makefile. ื•ื‘ื›ืœ ืžืงืจื”, ืชืฆื˜ืจืš ืœืคื—ื•ืช Python ืžื•ืชืงืŸ 3.6.
  2. ืฉื™ื‘ื•ื˜ ืž-github ื“ื•ื’ืžื” ืœืžื™ื•ืžื ื•ืช ื”ื•ืจื•ืกืงื•ืค.
  3. ื”ืจืฉืžื” ื‘-Ya.Cloud: https://cloud.yandex.ru
  4. ืฆื•ืจ ืœืขืฆืžืš ืฉื ื™ ื“ืœื™ื™ื ืคื ื™ืžื” ืื—ืกื•ืŸ ืื•ื‘ื™ื™ืงื˜ื™ื, ืงืจื ืœื”ื ื‘ื›ืœ ืฉื {BUCKET NAME} ะธ tgalice-test-cold-storage (ืฉื ืืžืฆืขื™ ื–ื” ืžืงื•ื“ื“ ื›ืขืช ืœืชื•ืš main.py ื”ื“ื•ื’ืžื” ืฉืœื™). ื”ื“ืœื™ ื”ืจืืฉื•ืŸ ื™ื”ื™ื” ื ื—ื•ืฅ ืจืง ืœืคืจื™ืกื”, ื”ืฉื ื™ - ืœืื—ืกื•ืŸ ืžืฆื‘ื™ ื“ื™ืืœื•ื’.
  5. ืœื™ืฆื•ืจ ื—ืฉื‘ื•ืŸ ืฉื™ืจื•ืช, ืชืŸ ืœื• ืชืคืงื™ื“ editor, ื•ืงื‘ืœ ืื™ืฉื•ืจื™ื ืกื˜ื˜ื™ื™ื ืขื‘ื•ืจื• {KEY ID} ะธ {KEY VALUE} - ื ืฉืชืžืฉ ื‘ื”ื ื›ื“ื™ ืœืชืขื“ ืืช ืžืฆื‘ ื”ื“ื™ืืœื•ื’. ื›ืœ ื–ื” ื ื—ื•ืฅ ื›ื“ื™ ืฉื”ืคื•ื ืงืฆื™ื” ืž- Ya.Cloud ืชื•ื›ืœ ืœื’ืฉืช ืœืื—ืกื•ืŸ ืž- Ya.Cloud. ืžืชื™ืฉื”ื•, ืื ื™ ืžืงื•ื•ื”, ื”ืื™ืฉื•ืจ ื™ื”ืคื•ืš ืœืื•ื˜ื•ืžื˜ื™, ืื‘ืœ ืœืขืช ืขืชื” - ื›ืš.
  6. (ืื•ืคืฆื™ื•ื ืœื™) ืœื”ืชืงื™ืŸ ืžืžืฉืง ืฉื•ืจืช ื”ืคืงื•ื“ื” yc. ืืคืฉืจ ืœื™ืฆื•ืจ ืคื•ื ืงืฆื™ื” ื’ื ื“ืจืš ืžืžืฉืง ื”ืื™ื ื˜ืจื ื˜, ืื‘ืœ ื”-CLI ื˜ื•ื‘ ื›ื™ ื›ืœ ืžื™ื ื™ ื—ื™ื“ื•ืฉื™ื ืžื•ืคื™ืขื™ื ื‘ื• ืžื”ืจ ื™ื•ืชืจ.
  7. ืขื›ืฉื™ื• ืืชื” ื™ื›ื•ืœ, ืœืžืขืฉื”, ืœื”ื›ื™ืŸ ืืช ืžื›ืœื•ืœ ื”ืชืœื•ืช: ื”ืคืขืœ ืขืœ ืฉื•ืจืช ื”ืคืงื•ื“ื” ืžื”ืชื™ืงื™ื” ืขื ื“ื•ื’ืžืช ื”ืžื™ื•ืžื ื•ืช make all. ื—ื‘ื•ืจื” ืฉืœ ืกืคืจื™ื•ืช (ื‘ืขื™ืงืจ, ื›ืจื’ื™ืœ, ืžื™ื•ืชืจื•ืช) ื™ื•ืชืงื ื• ื‘ืชื™ืงื™ื™ื” dist.
  8. ืžืœืื• ื‘ืขื˜ื™ื ืœืื—ืกื•ืŸ ื—ืคืฆื™ื (ืœื“ืœื™ {BUCKET NAME}) ื”ืืจื›ื™ื•ืŸ ืฉื”ื•ืฉื’ ื‘ืฉืœื‘ ื”ืงื•ื“ื dist.zip. ืื ืชืจืฆื”, ืชื•ื›ืœ ืœืขืฉื•ืช ื–ืืช ื’ื ืžืฉื•ืจืช ื”ืคืงื•ื“ื”, ืœืžืฉืœ, ื‘ืืžืฆืขื•ืช AWS CLI.
  9. ืฆื•ืจ ืคื•ื ืงืฆื™ื” ืœืœื ืฉืจืช ื“ืจืš ืžืžืฉืง ื”ืื™ื ื˜ืจื ื˜ ืื• ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืฉื™ืจื•ืช yc. ืขื‘ื•ืจ ื›ืœื™ ื”ืฉื™ืจื•ืช, ื”ืคืงื•ื“ื” ืชื™ืจืื” ื›ืš:

yc serverless function version create
    --function-name=horoscope
    --environment=AWS_ACCESS_KEY_ID={KEY ID},AWS_SECRET_ACCESS_KEY={KEY VALUE}
    --runtime=python37
    --package-bucket-name={BUCKET NAME}
    --package-object-name=dist.zip
    --entrypoint=main.alice_handler
    --memory=128M
    --execution-timeout=3s

ื‘ืขืช ื™ืฆื™ืจื” ื™ื“ื ื™ืช ืฉืœ ืคื•ื ืงืฆื™ื”, ื›ืœ ื”ืคืจืžื˜ืจื™ื ืžืชืžืœืื™ื ื‘ืื•ืชื• ืื•ืคืŸ.

ื›ืขืช ื ื™ืชืŸ ืœื‘ื“ื•ืง ืืช ื”ืคื•ื ืงืฆื™ื” ืฉื™ืฆืจืช ื“ืจืš ืžืกื•ืฃ ื”ืžืคืชื—ื™ื, ื•ืœืื—ืจ ืžื›ืŸ ืœืกื™ื™ื ื•ืœืคืจืกื ืืช ื”ืžื™ื•ืžื ื•ืช.

ื™ืฆื™ืจืช ืžื™ื•ืžื ื•ืช ืžืฆื‘ื™ืช ืขื‘ื•ืจ ืืœื™ืก ื‘ืคื•ื ืงืฆื™ื•ืช ืœืœื ืฉืจืช ืฉืœ Yandex.Cloud ื•-Python

ืžื” ื™ืฉ ืžืชื—ืช ืœืžื›ืกื” ื”ืžื ื•ืข

ื”-makefile ืžื›ื™ืœ ืœืžืขืฉื” ืกืงืจื™ืคื˜ ืคืฉื•ื˜ ืœืžื“ื™ ืœื”ืชืงื ืช ืชืœื•ืช ื•ื”ื›ื ืกืชื ืœืืจื›ื™ื•ืŸ. dist.zip, ืžืฉื”ื• ื›ื–ื”:

mkdir -p dist/
pip3 install -r requirements.txt --target dist/ 
cp main.py dist/main.py
cp form.yaml dist/form.yaml
cd dist && zip --exclude '*.pyc' -r ../dist.zip ./*

ื”ืฉืืจ ื”ื ื›ืžื” ื›ืœื™ื ืคืฉื•ื˜ื™ื ืขื˜ื•ืคื™ื ื‘ืกืคืจื™ื™ื” tgalice. ืชื”ืœื™ืš ืžื™ืœื•ื™ ื ืชื•ื ื™ ื”ืžืฉืชืžืฉ ืžืชื•ืืจ ืขืœ ื™ื“ื™ ื”ืชืฆื•ืจื” form.yaml:

form_name: 'horoscope_form'
start:
  regexp: 'ัั‚ะฐั€ั‚|ะฝะฐั‡(ะฐั‚ัŒ|ะฝะธ)'
  suggests:
    - ะกั‚ะฐั€ั‚
fields:
  - name: 'name'
    question: ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฝะฐะทะพะฒะธั‚ะต ัะฒะพั‘ ะธะผั.
  - name: 'year'
    question: ะขะตะฟะตั€ัŒ ัะบะฐะถะธั‚ะต ะผะฝะต ะณะพะด ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั. ะขะพะปัŒะบะพ ั‡ะตั‚ั‹ั€ะต ั†ะธั„ั€ั‹, ะฝะธั‡ะตะณะพ ะปะธัˆะฝะตะณะพ.
    validate_regexp: '^[0-9]{4}$'
    validate_message: ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฟะพะฟั€ะพะฑัƒะนั‚ะต ะตั‰ั‘ ั€ะฐะท. ะะฐะทะพะฒะธั‚ะต ะณะพะด ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั - ั‡ะตั‚ั‹ั€ะต ั†ะธั„ั€ั‹.
  - name: 'month'
    question: ะ—ะฐะผะตั‡ะฐั‚ะตะปัŒะฝะพ! ะขะตะฟะตั€ัŒ ะฝะฐะทะพะฒะธั‚ะต ะผะตััั† ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั.
    options:
      - ัะฝะฒะฐั€ัŒ
     ...
      - ะดะตะบะฐะฑั€ัŒ
    validate_message: ะขะพ, ั‡ั‚ะพ ะฒั‹ ะฝะฐะทะฒะฐะปะธ, ะฝะต ะฟะพั…ะพะถะต ะฝะฐ ะผะตััั†. ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฝะฐะทะพะฒะธั‚ะต ะผะตััั† ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั, ะฑะตะท ะดั€ัƒะณะธั… ัะปะพะฒ.
  - name: 'day'
    question: ะžั‚ะปะธั‡ะฝะพ! ะะฐะบะพะฝะตั†, ะฝะฐะทะพะฒะธั‚ะต ะผะฝะต ะดะฐั‚ัƒ ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั - ั‚ะพะปัŒะบะพ ั‡ะธัะปะพ, ะฒัะตะณะพ ะพะดะฝะฐ ะธะปะธ ะดะฒะต ั†ะธั„ั€ั‹.
    validate_regexp: '[0123]?d$'
    validate_message: ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฟะพะฟั€ะพะฑัƒะนั‚ะต ะตั‰ั‘ ั€ะฐะท. ะ’ะฐะผ ะฝัƒะถะฝะพ ะฝะฐะทะฒะฐั‚ัŒ ั‡ะธัะปะพ ัะฒะพะตะณะพ ั€ะพะถะดะตะฝะธั (ะฝะฐะฟั€ะธะผะตั€, ะดะฒะฐะดั†ะฐั‚ะพะต); ัั‚ะพ ะพะดะฝะฐ ะธะปะธ ะดะฒะต ั†ะธั„ั€ั‹.

ืžื—ืœืงืช python ืžืฉืชืœื˜ืช ืขืœ ืขื‘ื•ื“ืช ื ื™ืชื•ื— ื”ืชืฆื•ืจื” ื”ื–ื• ื•ื—ื™ืฉื•ื‘ ื”ืชื•ืฆืื” ื”ืกื•ืคื™ืช

class CheckableFormFiller(tgalice.dialog_manager.form_filling.FormFillingDialogManager):
    SIGNS = {
        'ัะฝะฒะฐั€ัŒ': 'ะšะพะทะตั€ะพะณ',
        ...
    }

    def handle_completed_form(self, form, user_object, ctx):
        response = tgalice.dialog_manager.base.Response(
            text='ะกะฟะฐัะธะฑะพ, {}! ะขะตะฟะตั€ัŒ ะผั‹ ะทะฝะฐะตะผ: ะฒะฐะผ {} ะปะตั‚, ะธ ะฒั‹ {}. n'
                 'ะ’ะพั‚ ัั‚ะพ ะฒะฐะผ, ะบะพะฝะตั‡ะฝะพ, ะฟะพะฒะตะทะปะพ! ะ—ะฒั‘ะทะดั‹ ะณะพะฒะพั€ัั‚ ะฒะฐะผ: {}'.format(
                form['fields']['name'],
                2019 - int(form['fields']['year']),
                self.SIGNS[form['fields']['month']],
                random.choice(FORECASTS),
            ),
            user_object=user_object,
        )
        return response

ืœื™ืชืจ ื“ื™ื•ืง, ืžืขืžื“ ื”ื‘ืกื™ืก FormFillingDialogManager ืขื•ืกืงืช ื‘ืžื™ืœื•ื™ ื”"ื˜ื•ืคืก", ื•ื‘ืฉื™ื˜ืช ื›ื™ืชืช ื”ื™ืœื“ handle_completed_form ืื•ืžืจืช ืžื” ืœืขืฉื•ืช ื›ืฉื”ื™ื ืžื•ื›ื ื”.

ื‘ื ื•ืกืฃ ืœื–ืจื™ืžื” ื”ืขื™ืงืจื™ืช ื”ื–ื• ืฉืœ ื”ื“ื™ืืœื•ื’ ืฉืœ ื”ืžืฉืชืžืฉ, ื™ืฉ ืฆื•ืจืš ื’ื ืœื‘ืจืš ืืช ื”ืžืฉืชืžืฉ, ื•ื›ืŸ ืœื”ื ืคื™ืง ืขื–ืจื” ื‘ืคืงื•ื“ืช "ืขื–ืจื”" ื•ืœืฉื—ืจืจ ืžื”ืžื™ื•ืžื ื•ืช ื‘ืคืงื•ื“ืช "ื™ืฆื™ืื”". ื‘ืฉื‘ื™ืœ ื–ื” ื‘ tgalice ื™ืฉ ื’ื ืชื‘ื ื™ืช, ื›ืš ืฉื›ืœ ืžื ื”ืœ ื”ื“ื•-ืฉื™ื— ืžื•ืจื›ื‘ ืžื—ืœืงื™ื:

dm = tgalice.dialog_manager.CascadeDialogManager(
    tgalice.dialog_manager.GreetAndHelpDialogManager(
        greeting_message=DEFAULT_MESSAGE,
        help_message=DEFAULT_MESSAGE,
        exit_message='ะ”ะพ ัะฒะธะดะฐะฝะธั, ะฟั€ะธั…ะพะดะธั‚ะต ะฒ ะฝะฐะฒั‹ะบ "ะะนั‚ะธัˆะฝั‹ะน ะณะพั€ะพัะบะพะฟ" ะตั‰ั‘!'
    ),
    CheckableFormFiller(`form.yaml`, default_message=DEFAULT_MESSAGE)
)

CascadeDialogManager ืขื•ื‘ื“ ืคืฉื•ื˜: ื”ื•ื ืžื ืกื” ืœื”ื—ื™ืœ ืขืœ ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ืฉืœ ื”ื“ื™ืืœื•ื’ ืืช ื›ืœ ืžืจื›ื™ื‘ื™ื• ื‘ืชื•ืจื•, ื•ื‘ื•ื—ืจ ืืช ื”ืจืœื•ื•ื ื˜ื™ ื”ืจืืฉื•ืŸ.

ื›ืชื’ื•ื‘ื” ืœื›ืœ ื”ื•ื“ืขื”, ืžื ื”ืœ ื”ื“ื•-ืฉื™ื— ืžื—ื–ื™ืจ ืื•ื‘ื™ื™ืงื˜ ืคื™ืชื•ืŸ Response, ืืฉืจ ืœืื—ืจ ืžื›ืŸ ื ื™ืชืŸ ืœื”ืžื™ืจ ืœื˜ืงืกื˜ ืจื’ื™ืœ, ืื• ืœื”ื•ื“ืขื” ื‘ืืœื™ืก ืื• ื‘ื˜ืœื’ืจื - ืชืœื•ื™ ืื™ืคื” ื”ื‘ื•ื˜ ืคื•ืขืœ; ื”ื•ื ืžื›ื™ืœ ื’ื ืืช ื”ืžืฆื‘ ื”ืžืฉืชื ื” ืฉืœ ืชื™ื‘ืช ื”ื“ื•-ืฉื™ื— ืฉื™ืฉ ืœืฉืžื•ืจ. ื›ืœ ื”ืžื˜ื‘ื— ื”ื–ื” ืžื˜ื•ืคืœ ืขืœ ื™ื“ื™ ื›ื™ืชื” ืื—ืจืช, DialogConnector, ืื– ื”ืชืกืจื™ื˜ ื”ื™ืฉื™ืจ ืœืชื—ื™ืœืช ืžื™ื•ืžื ื•ืช ื‘-Yandex Functions ื ืจืื” ื›ืš:

...
session = boto3.session.Session()
s3 = session.client(
    service_name='s3',
    endpoint_url='https://storage.yandexcloud.net',
    aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'],
    aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'],
    region_name='ru-central1',
)
storage = tgalice.session_storage.S3BasedStorage(s3_client=s3, bucket_name='tgalice-test-cold-storage')
connector = tgalice.dialog_connector.DialogConnector(dialog_manager=dm, storage=storage)
alice_handler = connector.serverless_alice_handler

ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ืจื•ื‘ ื”ืงื•ื“ ื”ื–ื” ื™ื•ืฆืจ ื—ื™ื‘ื•ืจ ืœืžืžืฉืง Object Storage S3. ื›ื™ืฆื“ ื ืขืฉื” ืฉื™ืžื•ืฉ ื™ืฉื™ืจ ื‘ื—ื™ื‘ื•ืจ ื”ื–ื”, ืืชื” ื™ื›ื•ืœ ืœืงืจื•ื ื‘ืงื•ื“ tgalice.
ื”ืฉื•ืจื” ื”ืื—ืจื•ื ื” ื™ื•ืฆืจืช ืคื•ื ืงืฆื™ื” alice_handler - ื–ื” ืฉื”ื–ืžื ื• ืœืžืฉื•ืš ืืช Yandex.Cloud ื›ืืฉืจ ืื ื• ืžื’ื“ื™ืจื™ื ืืช ื”ืคืจืžื˜ืจ --entrypoint=main.alice_handler.

ื–ื”, ืœืžืขืฉื”, ื”ื›ืœ. Makefiles ืœื‘ื ื™ื™ื”, ืื—ืกื•ืŸ ืื•ื‘ื™ื™ืงื˜ื™ื ื“ืžื•ื™ S3 ืœืื—ืกื•ืŸ ื”ืงืฉืจ, ื•ืกืคืจื™ื™ืช ืคื™ืชื•ืŸ tgalice. ื™ื—ื“ ืขื ื”ืชื›ื•ื ื•ืช ื—ืกืจื•ืช ื”ืฉืจืช ื•ื›ื•ืฉืจ ื”ื”ื‘ืขื” ืฉืœ ืคื™ืชื•ืŸ, ื–ื” ืžืกืคื™ืง ื›ื“ื™ ืœืคืชื— ืืช ื”ืžื™ื•ืžื ื•ืช ืฉืœ ืื“ื ื‘ืจื™ื.

ืืชื” ื™ื›ื•ืœ ืœืฉืื•ืœ ืœืžื” ืืชื” ืฆืจื™ืš ืœื™ืฆื•ืจ tgalice? ื›ืœ ื”ืงื•ื“ ื”ืžืฉืขืžื ืฉืžืขื‘ื™ืจ JSON ืžื‘ืงืฉื” ืœืชื’ื•ื‘ื” ื•ืžืื—ืกื•ืŸ ืœื–ื™ื›ืจื•ืŸ ื•ื‘ื—ื–ืจื” ื˜ืžื•ืŸ ื‘ื•. ื™ืฉ ื’ื ืืคืœื™ืงืฆื™ื” ืจื’ื™ืœื”, ืคื•ื ืงืฆื™ื” ืœื”ื‘ื ื” ืฉ"ืคื‘ืจื•ืืจ" ื“ื•ืžื” ืœ"ืคื‘ืจื•ืืจ", ื•ืขื•ื“ NLU ืœืขื ื™ื™ื. ืœืคื™ ื”ืจืขื™ื•ืŸ ืฉืœื™, ื–ื” ื›ื‘ืจ ืืžื•ืจ ืœื”ืกืคื™ืง ื›ื“ื™ ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœืฉืจื˜ื˜ ืื‘ื•ืช ื˜ื™ืคื•ืก ืฉืœ ืžื™ื•ืžื ื•ืช ื‘ืงื‘ืฆื™ yaml ืžื‘ืœื™ ืœื”ื™ื•ืช ืžื•ืกื—ืช ืžื“ื™ ืขืœ ื™ื“ื™ ืคืจื˜ื™ื ื˜ื›ื ื™ื™ื.

ืื ืืชื” ืจื•ืฆื” NLU ืจืฆื™ื ื™ ื™ื•ืชืจ, ืืชื” ื™ื›ื•ืœ ืœื“ืคื•ืง ืื•ืชื• ืœืžื™ื•ืžื ื•ืช ืฉืœืš ืจืืกื” ืื• ื“ื™ืคืคืœื•ื‘, ืื‘ืœ ื”ืงืžืชื ืชื“ืจื•ืฉ ืจื™ืงื•ื“ ื ื•ืกืฃ ืขื ื˜ืžื‘ื•ืจื™ืŸ, ื‘ืžื™ื•ื—ื“ ืœืœื ืฉืจืช. ืื ืœื ืžืชื—ืฉืง ืœืš ืงื™ื“ื•ื“ ื‘ื›ืœืœ, ืขืœื™ืš ืœื”ืฉืชืžืฉ ื‘ื‘ื ืื™ ื”ืกื•ื’ ื”ื•ื•ื™ื–ื•ืืœื™ ืื™ื™ืžื™ืœื•ื’'ื™ืง. ื‘ืขืช ื™ืฆื™ืจืช tgalice, ื—ืฉื‘ืชื™ ืขืœ ืื™ื–ืฉื”ื• ื ืชื™ื‘ ื‘ื™ื ื™ื™ื. ื‘ื•ื ื ืจืื” ืžื” ืงื•ืจื”.

ื•ื‘ื›ืŸ, ืขื›ืฉื™ื• ื”ืฆื˜ืจืฃ ืฆ'ืื˜ ืœืžืคืชื—ื™ ืžื™ื•ืžื ื•ื™ื•ืช Aliy, ืœืงืจื•ื ืชื™ืขื•ื“ื•ืœื™ืฆื•ืจ ืžื“ื”ื™ื ื›ื™ืฉื•ืจื™ื!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”