{"id":13400814,"url":"https://github.com/borzunov/alice_scripts","last_synced_at":"2025-04-15T21:42:27.639Z","repository":{"id":57409711,"uuid":"142916368","full_name":"borzunov/alice_scripts","owner":"borzunov","description":"👩 📜  Easy way to make skills for the Alice voice assistant","archived":false,"fork":false,"pushed_at":"2024-04-16T23:51:03.000Z","size":23,"stargazers_count":39,"open_issues_count":2,"forks_count":7,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-12-25T08:21:37.959Z","etag":null,"topics":["alice-sdk","python","yandex-alice","yandex-dialogs"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/borzunov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-30T18:59:03.000Z","updated_at":"2024-09-19T14:22:53.000Z","dependencies_parsed_at":"2024-10-03T12:31:35.766Z","dependency_job_id":"d454a001-5c55-457d-ae62-4a3a88da4fab","html_url":"https://github.com/borzunov/alice_scripts","commit_stats":{"total_commits":17,"total_committers":2,"mean_commits":8.5,"dds":0.05882352941176472,"last_synced_commit":"db4cd08226ae5429ec8083ffedc0edef8b44adeb"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borzunov%2Falice_scripts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borzunov%2Falice_scripts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borzunov%2Falice_scripts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/borzunov%2Falice_scripts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/borzunov","download_url":"https://codeload.github.com/borzunov/alice_scripts/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231756278,"owners_count":18421881,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alice-sdk","python","yandex-alice","yandex-dialogs"],"created_at":"2024-07-30T19:00:55.758Z","updated_at":"2024-12-29T15:58:00.705Z","avatar_url":"https://github.com/borzunov.png","language":"Python","funding_links":[],"categories":["Разработка"],"sub_categories":["SDK"],"readme":"alice_scripts\n=============\n\nПростой способ создавать сложные сценарии для [Яндекс.Алисы](https://dialogs.yandex.ru/)\n\n\u003e Библиотека разработана сообществом и не является продуктом Яндекса\n\n## 🚀 Быстрый старт\n\nЭта библиотека позволяет писать многоэтапные сценарии без callback-ов и ручного хранения информации о состоянии диалога. Достаточно использовать условия и циклы:\n\n```python\nfrom alice_scripts import Skill, request, say, suggest\nskill = Skill(__name__)\n\n@skill.script\ndef run_script():\n    yield say('Добрый день! Как вас зовут?')\n    name = request.command\n\n    yield say('Сколько вам лет?')\n    while not request.matches(r'\\d+'):\n        yield say('Я вас не поняла. Скажите число')\n    age = int(request.command)\n\n    yield say('Вы любите кошек или собак?',\n              suggest('Обожаю кошечек', 'Люблю собак'))\n    while not request.has_lemmas('кошка', 'кошечка',\n                                 'собака', 'собачка'):\n        yield say('У вас только два варианта - кошки или собаки')\n    loves_cats = request.has_lemmas('кошка', 'кошечка')\n\n    yield say(f'Рада познакомиться, {name}! Когда вам '\n              f'исполнится {age + 1}, я могу подарить '\n              f'{\"котёнка\" if loves_cats else \"щенка\"}!',\n              end_session=True)\n```\n\nЗапустить сценарий можно как обычное [Flask](http://flask.pocoo.org/)-приложение:\n\n    pip install alice_scripts\n    FLASK_APP=hello.py flask run --with-threads\n    \n## Примеры\n\n* [Примеры из документации](examples)\n* [Навык \u0026laquo;Приложение для знакомств\u0026raquo;](https://github.com/FuryThrue/WhoIsAlice/blob/master/app.py)\n\n## 📖 Интерфейс\n\n### Skill\n\nКласс `Skill` реализует WSGI-приложение и является наследником класса [flask.Flask](http://flask.pocoo.org/docs/1.0/api/#flask.Flask). Сценарий, соответствующий приложению, регистрируется с помощью декоратора `@skill.script` (см. пример выше).\n\nСценарий запускается отдельно для каждого уникального значения `session_id`.\n\n### yield say(...)\n\nКонструкция `yield say(...)` служит для выдачи ответа на запрос и принимает три типа параметров:\n\n- Неименованные строковые аргументы задают варианты фразы, которую нужно показать и сказать пользователю. При выполнении случайно выбирается один из вариантов:\n\n    ```python\n    yield say('Как дела?', 'Как вы?', 'Как поживаете?')\n    ```\n\n- Модификаторы (см. ниже) позволяют указать дополнительные свойства ответа. Например, модификатор `suggest` создаёт кнопки с подсказками для ответа:\n\n    ```python\n    yield say('Как дела?', suggest('Хорошо', 'Нормально', 'Не очень'))\n    ```\n\n- Именованные аргументы позволяют использовать те возможности [протокола](https://tech.yandex.ru/dialogs/alice/doc/protocol-docpage/#response), для которых нет модификаторов:\n\n    ```python\n    yield say('Здравствуйте! Это мы, хороводоведы.',\n              tts='Здравствуйте! Это мы, хоров+одо в+еды.')\n    ```\n  \n  Переданные пары \u0026laquo;ключ-значение\u0026raquo; будут записаны в словарь `response` в ответе навыка.\n\n### Модификаторы\n\nМодификаторы \u0026mdash; это функции, возвращающие [замыкания](https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)). При этом каждое замыкание должно принимать словарь `response` из [ответа](https://tech.yandex.ru/dialogs/alice/doc/protocol-docpage/#response) навыка и добавлять туда нужные ключи.\n\n- `suggest(...)`\n\n    Создаёт кнопки с подсказками для ответа:\n    \n    ```python\n    yield say('Как дела?', suggest('Хорошо', 'Нормально'))\n    ```\n    \n\u003e Так как библиотека находится в стадии proof of concept, других модификаторов пока не реализовано. Используйте именованные параметры в конструкции `yield say(...)`.\n\n### request\n\nОбъект `request` представляет собой thread-local хранилище, содержащее информацию о последнем действии пользователя в сессии.\n\n- С объектом `request` можно работать как со словарём, полученным из [запроса](https://tech.yandex.ru/dialogs/alice/doc/protocol-docpage/#request) к навыку:\n\n    ```python\n    original_utterance = request['request']['original_utterance'] \n    ```\n\n- `request.command` \u0026mdash; свойство, содержащее значение поля [command](https://tech.yandex.ru/dialogs/alice/doc/protocol-docpage/#request), из которого убраны завершающие точки.\n\n- `request.matches(pattern, flags=0)` \u0026mdash; метод, позволяющий проверить, удовлетворяет ли свойство `request.command` регулярному выражению `pattern` (используется функция [re.fullmatch](https://docs.python.org/3/library/re.html#re.fullmatch)).\n\n- `request.words` \u0026mdash; свойство, содержащее все слова (и числа), найденные в поле [command](https://tech.yandex.ru/dialogs/alice/doc/protocol-docpage/#request).\n\n- `request.lemmas` \u0026mdash; свойство, содержащее начальные формы слов из свойства `request.words` (полученные с помощью библиотеки [pymorphy2](http://pymorphy2.readthedocs.io/en/latest/)).\n\n- `request.has_lemmas(...)` \u0026mdash; метод, позволяющий проверить, были ли в запросе слова, чьи начальные формы совпадают с начальными формами указанных слов:\n\n    ```python\n    if request.has_lemmas('нет', 'не'):\n        answer = 'no'\n    elif request.has_lemmas('да', 'ага'):\n        answer = 'yes'\n    ```\n\n## Разбиение на подпрограммы\n\nСценарий можно (и нужно) разбивать на подпрограммы. Каждая подпрограмма *должна* вызываться с помощью оператора `yield from` и может возвращать значение с помощью оператора `return`. См. [пример](examples/guess_number_subgens.py).\n\n## Развёртывание\n\nВ этой библиотеке состояние диалога хранится в виде состояния Python-генератора и не может быть сериализовано. В связи с этим:\n\n- Реплики из одной сессии всегда должны обрабатываться одним и тем же процессом.\n- Навык не может быть запущен на serverless-платформе.\n- При перезапуске приложения все сессии будут разорваны.\n\nРазвернуть приложение в production-е можно с помощью gunicorn. Вы можете использовать несколько [потоков](http://docs.gunicorn.org/en/stable/settings.html#threads), но не можете использовать несколько [воркеров](http://docs.gunicorn.org/en/stable/settings.html#workers) (иначе gunicorn будет направлять реплики из одной сессии разным процессам).\n\n## Масштабирование\n\nЕсли у вашего навыка много пользователей и одного процесса недостаточно, чтобы успевать отвечать на запросы за требуемое время (по протоколу \u0026mdash; не более 1,5 сек), можно поступить так:\n\n1. Запустите несколько экземпляров gunicorn (в каждом \u0026mdash; 1 воркер) на одном или нескольких серверах.\n2. Настройте nginx таким образом, чтобы он направлял запросы с одним и тем же `session_id` к одному и тому же экземпляру gunicorn.\n\nПример описанной конфигурации есть в [этой папке](examples/scaling).\n\n## Автор\n\nCopyright \u0026copy; Александр Борзунов, 2018\n\nThe MIT License (MIT)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborzunov%2Falice_scripts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fborzunov%2Falice_scripts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fborzunov%2Falice_scripts/lists"}