Skip to content

πŸ‘© πŸ“œ Easy way to make skills for the Alice voice assistant

License

Notifications You must be signed in to change notification settings

borzunov/alice_scripts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

18 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

alice_scripts

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ способ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС сцСнарии для ЯндСкс.Алисы

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° сообщСством ΠΈ Π½Π΅ являСтся ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ ЯндСкса

πŸš€ Быстрый старт

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ многоэтапныС сцСнарии Π±Π΅Π· callback-ΠΎΠ² ΠΈ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ состоянии Π΄ΠΈΠ°Π»ΠΎΠ³Π°. Достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ условия ΠΈ Ρ†ΠΈΠΊΠ»Ρ‹:

from alice_scripts import Skill, request, say, suggest
skill = Skill(__name__)

@skill.script
def run_script():
    yield say('Π”ΠΎΠ±Ρ€Ρ‹ΠΉ дСнь! Как вас Π·ΠΎΠ²ΡƒΡ‚?')
    name = request.command

    yield say('Бколько Π²Π°ΠΌ Π»Π΅Ρ‚?')
    while not request.matches(r'\d+'):
        yield say('Π― вас Π½Π΅ поняла. Π‘ΠΊΠ°ΠΆΠΈΡ‚Π΅ число')
    age = int(request.command)

    yield say('Π’Ρ‹ Π»ΡŽΠ±ΠΈΡ‚Π΅ кошСк ΠΈΠ»ΠΈ собак?',
              suggest('ОбоТаю ΠΊΠΎΡˆΠ΅Ρ‡Π΅ΠΊ', 'Π›ΡŽΠ±Π»ΡŽ собак'))
    while not request.has_lemmas('кошка', 'ΠΊΠΎΡˆΠ΅Ρ‡ΠΊΠ°',
                                 'собака', 'собачка'):
        yield say('Π£ вас Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° - кошки ΠΈΠ»ΠΈ собаки')
    loves_cats = request.has_lemmas('кошка', 'ΠΊΠΎΡˆΠ΅Ρ‡ΠΊΠ°')

    yield say(f'Π Π°Π΄Π° ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ, {name}! Когда Π²Π°ΠΌ '
              f'исполнится {age + 1}, я ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ '
              f'{"ΠΊΠΎΡ‚Ρ‘Π½ΠΊΠ°" if loves_cats else "Ρ‰Π΅Π½ΠΊΠ°"}!',
              end_session=True)

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сцСнарий ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Flask-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

pip install alice_scripts
FLASK_APP=hello.py flask run --with-threads

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

πŸ“– Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ

Skill

Класс Skill Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ WSGI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ являСтся наслСдником класса flask.Flask. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, рСгистрируСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° @skill.script (см. ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹ΡˆΠ΅).

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ запускаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния session_id.

yield say(...)

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ yield say(...) слуТит для Π²Ρ‹Π΄Π°Ρ‡ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° запрос ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

  • НСимСнованныС строковыС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π·Π°Π΄Π°ΡŽΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ„Ρ€Π°Π·Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ случайно выбираСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²:

    yield say('Как Π΄Π΅Π»Π°?', 'Как Π²Ρ‹?', 'Как ΠΏΠΎΠΆΠΈΠ²Π°Π΅Ρ‚Π΅?')
  • ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ (см. Π½ΠΈΠΆΠ΅) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свойства ΠΎΡ‚Π²Π΅Ρ‚Π°. НапримСр, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ suggest создаёт ΠΊΠ½ΠΎΠΏΠΊΠΈ с подсказками для ΠΎΡ‚Π²Π΅Ρ‚Π°:

    yield say('Как Π΄Π΅Π»Π°?', suggest('Π₯ΠΎΡ€ΠΎΡˆΠΎ', 'ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ', 'НС ΠΎΡ‡Π΅Π½ΡŒ'))
  • Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ возмоТности ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²:

    yield say('ЗдравствуйтС! Π­Ρ‚ΠΎ ΠΌΡ‹, Ρ…ΠΎΡ€ΠΎΠ²ΠΎΠ΄ΠΎΠ²Π΅Π΄Ρ‹.',
              tts='ЗдравствуйтС! Π­Ρ‚ΠΎ ΠΌΡ‹, Ρ…ΠΎΡ€ΠΎΠ²+ΠΎΠ΄ΠΎ Π²+Π΅Π΄Ρ‹.')

    ΠŸΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹ Β«ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β» Π±ΡƒΠ΄ΡƒΡ‚ записаны Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ response Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ Π½Π°Π²Ρ‹ΠΊΠ°.

ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹

ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ β€” это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ замыкания. ΠŸΡ€ΠΈ этом ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ response ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π°Π²Ρ‹ΠΊΠ° ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ.

  • suggest(...)

    Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΠΈ с подсказками для ΠΎΡ‚Π²Π΅Ρ‚Π°:

    yield say('Как Π΄Π΅Π»Π°?', suggest('Π₯ΠΎΡ€ΠΎΡˆΠΎ', 'ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ'))

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° находится Π² стадии proof of concept, Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠΊΠ° Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² конструкции yield say(...).

request

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ request прСдставляСт собой thread-local Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, содСрТащСС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ послСднСм дСйствии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² сСссии.

  • Π‘ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ request ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ со словарём, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ· запроса ΠΊ Π½Π°Π²Ρ‹ΠΊΡƒ:

    original_utterance = request['request']['original_utterance'] 
  • request.command β€” свойство, содСрТащСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля command, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠ±Ρ€Π°Π½Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ.

  • request.matches(pattern, flags=0) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, удовлСтворяСт Π»ΠΈ свойство request.command рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ pattern (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция re.fullmatch).

  • request.words β€” свойство, содСрТащСС всС слова (ΠΈ числа), Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΠ»Π΅ command.

  • request.lemmas β€” свойство, содСрТащСС Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ слов ΠΈΠ· свойства request.words (ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ pymorphy2).

  • request.has_lemmas(...) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π±Ρ‹Π»ΠΈ Π»ΠΈ Π² запросС слова, Ρ‡ΡŒΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… слов:

    if request.has_lemmas('Π½Π΅Ρ‚', 'Π½Π΅'):
        answer = 'no'
    elif request.has_lemmas('Π΄Π°', 'Π°Π³Π°'):
        answer = 'yes'

Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ (ΠΈ Π½ΡƒΠΆΠ½ΠΎ) Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. КаТдая ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° yield from ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° return. Π‘ΠΌ. ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Π Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅

Π’ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ состояниС Π΄ΠΈΠ°Π»ΠΎΠ³Π° хранится Π² Π²ΠΈΠ΄Π΅ состояния Python-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сСриализовано. Π’ связи с этим:

  • Π Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ сСссии всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ процСссом.
  • Навык Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π½Π° serverless-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅.
  • ΠŸΡ€ΠΈ пСрСзапускС прилоТСния всС сСссии Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΎΡ€Π²Π°Π½Ρ‹.

Π Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² production-Π΅ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gunicorn. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ² (ΠΈΠ½Π°Ρ‡Π΅ gunicorn Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ сСссии Ρ€Π°Π·Π½Ρ‹ΠΌ процСссам).

ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Если Ρƒ вашСго Π½Π°Π²Ρ‹ΠΊΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса нСдостаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΏΠ΅Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° запросы Π·Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ врСмя (ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ β€” Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1,5 сСк), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

  1. ЗапуститС нСсколько экзСмпляров gunicorn (Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ β€” 1 Π²ΠΎΡ€ΠΊΠ΅Ρ€) Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сСрвСрах.
  2. НастройтС nginx Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ направлял запросы с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ session_id ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ экзСмпляру gunicorn.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ описанной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Π² этой ΠΏΠ°ΠΏΠΊΠ΅.

Автор

Copyright Β© АлСксандр Π‘ΠΎΡ€Π·ΡƒΠ½ΠΎΠ², 2018

The MIT License (MIT)

About

πŸ‘© πŸ“œ Easy way to make skills for the Alice voice assistant

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages