Giter Site home page Giter Site logo

aioalice's Introduction

Русский | English

Яндекс Алиса. Диалоги (навыки)

aioAlice это асинхронная библиотека для взаимодействия с Алисой

Зачем?

  • Работайте с привычными классами, а не зайнимайтесь парсингом JSON'а
  • Автоматический ответ в вебхук, даже если вы не успели подготовить ответ вовремя - навык не вернет ошибку сервера, но запишет вам лог

Автоматический ответ сработает только при использовании async IO. Если затянется обработка в каком-то цикле или др. синхронное вычисление, это не поможет

  • Удобные хэндлеры - будет вызван обработчик, соответствующий полученной команде
  • Работа с состояниями
  • Легко загрузить изображение, сформировать ответ

Установка

# рекомендуется использовать virtual env и python 3.6+:
python3.6 -m venv aliceenv
source ./aliceenv/bin/activate

pip install pip -U
pip install setuptools -U
pip install uvloop  # uvloop при желании

pip install aioalice -U
# Or install from GitHub:
# pip install git+https://github.com/surik00/aioalice.git -U

# Если git не установлен:
# 1. скачайте ZIP
# 2. разархивируйте и перейдите в папку
# 3. выполните следующую команду:
python setup.py install

Быстрый старт

Пример простейшего навыка

dp = Dispatcher()

@dp.request_handler()
async def handle_all_requests(alice_request):
    return alice_request.response('Привет этому миру!')

Карточки

JSON serializing

Если вы хотите использовать более быструю библиотеку для работы с JSON, установите rapidjson или ujson. Библиотека определится и будет использована автоматически.


Навыки с использованием aioAlice


Тестирование и деплой

В примерах используется следующая конфигурация:

WEBHOOK_URL_PATH = '/my-alice-webhook/'  # webhook endpoint

WEBAPP_HOST = 'localhost'  # запускаем на локальной машине
WEBAPP_PORT = 3001  # испльзуем любой не занятый порт

Для тестирования можно использовать ngrok, тогда вебхук нужно будет установить на https://1a2b3c4d5e.ngrok.io/my-alice-webhook/ (endpoint должен быть WEBHOOK_URL_PATH, так как WebApp ожидает получать обновления именно там), порт в настройках нужно указать WEBAPP_PORT (в данном случае 3001)

Для продакшена можно использовать Nginx, тогда в конфигурации Nginx внутри блока server необходимо добавить:

location /my-alice-webhook/ {  # WEBHOOK_URL_PATH
    proxy_pass         http://127.0.0.1:3001/;  # адрес до запущенного WebApp, в нашем случае это localhost и порт 3001
    proxy_redirect     off;
    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Host $server_name;
}

aioalice's People

Contributors

alekseevav avatar asmfreak avatar goodsmileduck avatar mahenzon avatar uburuntu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aioalice's Issues

Игнорировать лишние параметры в JSON request от Алисы

Основная мысль

Предлагаю во всех объектах добавить игнорирование дополнительных параметров при парсинге JSON

Мотивация

  1. API в основном расширяется, а не меняется. Это значит что с большой вероятностью при обновлении API навык будет продолжать работать
  2. Поддержка дебажных JSON с полями типо __comment
  3. Постепенная миграция со старой версии библиотеки на новую (не будет крашиться)

В связи со спецификой разработки навыков (обычно это пет-проекты) при ближайшем расширении API протокола некоторая часть навыков просто умрет навсегда

В результате

  • Повышение стабильности работы навыков на библиотеке aioalice (1)
  • Поддержка API основанных на API алисы (2,3)

End_session doesnt work

Не работает FSM для новых сессий.
Не работает выход из навыка.

Например, запустим навык, выберем игру, удалим сессию в Алисе, создадим новую - скрипт ответит старым состоянием.

Нажатие кнопки "прекрати" ничего не делает.

Состояния

Как сделать хэндлер, который будет доступен из любого состояния? Допустим на команду прекрати, навык должен незамедлительно устанавливать свою работу, но это работает, только на конкретном состоянии, то есть на другом уже не работает. В примере про машину состояний также не работает

Error when receive POST

изображение
изображение
Снимок экрана от 2022-04-17 13-45-25

That is my mistake, or problem in library/ngrok? IDK, I use simple example with Hello World, but it doesn't work. Use ngrok, run it by command ngrok http 3001

OS: Fedora 36 Beta
Library: aioalice 1.5.0
ngrok: 3.0.2
Python: 3.10.4

Error got Future <Future pending> attached to a different loop

Example

from aiohttp import web
from aioalice import Dispatcher, get_new_configured_app


WEBHOOK_URL_PATH = '/my-alice-webhook/'  # webhook endpoint

WEBAPP_HOST = 'localhost'
WEBAPP_PORT = 3001

dp = Dispatcher()


@dp.request_handler()
async def handle_all_requests(alice_request):
    return alice_request.response('Привет этому миру!')


if __name__ == '__main__':
    app = get_new_configured_app(dispatcher=dp, path=WEBHOOK_URL_PATH)
    web.run_app(app, host=WEBAPP_HOST, port=WEBAPP_PORT)

Error

======== Running on http://localhost:3001 ========
(Press CTRL+C to quit)
Error handling request
Traceback (most recent call last):
  File "/user/simple-alice/venv/lib/python3.11/site-packages/aiohttp/web_protocol.py", line 433, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/user/simple-alice/venv/lib/python3.11/site-packages/aiohttp/web_app.py", line 504, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/user/simple-alice/venv/lib/python3.11/site-packages/aiohttp/web_urldispatcher.py", line 954, in _iter
    resp = await method()
           ^^^^^^^^^^^^^^
  File "/user/simple-alice/venv/lib/python3.11/site-packages/aioalice/dispatcher/webhook.py", line 183, in post
    result = await self.process_request(request)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/user/simple-alice/venv/lib/python3.11/site-packages/aioalice/dispatcher/webhook.py", line 101, in process_request
    await waiter
RuntimeError: Task <Task pending name='Task-5' coro=<RequestHandler._handle_request() running at /user/simple-alice/venv/lib/python3.11/site-packages/aiohttp/web_protocol.py:433> cb=[Task.task_wakeup()]> got Future <Future pending> attached to a different loop

Json scheme change crashes parser

Example of changed request:

{'meta': {'client_id': 'MailRu-VC/1.0', 'locale': 'ru_RU', 'timezone': 'Europe/Moscow', 'interfaces': {'screen': {}}, '_city_ru': 'Москва'}, 'request': {'command': '', 'original_utterance': 'Включи навык лала, 'type': 'SimpleUtterance', 'nlu': {'tokens': ['включи', 'навык', 'лала'], 'entities': []}}, 'session': {'session_id': 'a6dcdc02-92b8-4076-9bae-fced146bb1b2', 'user_id': 'f67490185d2080870a55390310dcd14007ddad00eb330dd4e3356a8b0c77d13f', 'skill_id': 'cfe83c82-c63e-4135-afa4-80ebed097ad8', 'new': True, 'message_id': 0, 'user': {'user_id': 'bfe750f47d3548d13d46fa35a461dcdb49c5ab300e6f62097a77b2e023c7a4af'}, 'application': {'application_id': 'f67490185d2080870a55490310dcd14007ddad00eb330ad4e3356a8bac77d13f', 'application_type': 'mobile'}}, 'state': {'session': {}, 'user': {}}, 'version': '1.0'}

Traceback:

2021-02-24_19:57:42.53255 Traceback (most recent call last):
2021-02-24_19:57:42.53255 File "/usr/local/lib/python3.6/dist-packages/aioalice/dispatcher/webhook.py", line 60, in parse_request
2021-02-24_19:57:42.53257 return AliceRequest(self.request, **data)
2021-02-24_19:57:42.53257 TypeError: init() got an unexpected keyword argument 'state'
2021-02-24_19:57:42.53334 Error handling request
2021-02-24_19:57:42.53335 Traceback (most recent call last):
2021-02-24_19:57:42.53335 File "/usr/local/lib/python3.6/dist-packages/aiohttp/web_protocol.py", line 418, in start
2021-02-24_19:57:42.53335 resp = await task
2021-02-24_19:57:42.53336 File "/usr/local/lib/python3.6/dist-packages/aiohttp/web_app.py", line 458, in _handle
2021-02-24_19:57:42.53336 resp = await handler(request)
2021-02-24_19:57:42.53336 File "/usr/local/lib/python3.6/dist-packages/aiohttp/web_urldispatcher.py", line 892, in _iter
2021-02-24_19:57:42.53337 resp = await method()
2021-02-24_19:57:42.53337 File "/usr/local/lib/python3.6/dist-packages/aioalice/dispatcher/webhook.py", line 169, in post
2021-02-24_19:57:42.53337 request = await self.parse_request()
2021-02-24_19:57:42.53337 File "/usr/local/lib/python3.6/dist-packages/aioalice/dispatcher/webhook.py", line 60, in parse_request
2021-02-24_19:57:42.53338 return AliceRequest(self.request, **data)
2021-02-24_19:57:42.53338 TypeError: init() got an unexpected keyword argument 'state'

Upgrade attrs version

There’s a backward-incompatible change in attrs 19.2.0 (2019-10-01): Removed deprecated Attribute attribute convert per scheduled removal on 2019/1.
https://www.attrs.org/en/stable/changelog.html

Now 18.1.0 is used

So we need to upgrade version and all dependent code that uses convert keyword
Tests may require an upgrade too (needs investigation)
More tests are welcome

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.