1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/didiopensource-MEEP

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 9.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 22:59 ebaf03d

Внешние API

Они должны возвращать список словарей с ключами «name» и «value», которые будут использоваться во внешнем интерфейсе. Значения словаря могут быть произвольно вложенными с дополнительными словарями «имя-значение».

Значения ошибок должны содержать верхний уровень с ключом «error».

compare_numbers/compare_numbers_provider.py

class CompareNumbersProvider():
    def compare(self, num1, num2):
        try:
            num1 = float(num1)
            num2 = float(num2)
        except ValueError:
            raise ValueError('numbers must be parsable by python `float`')

        if num1 == num2:
            result = "equal to"
        elif num1 > num2:
            result = "greater than"
        else:
            result = "less than"
        return [{'name': 'comparison', 'value': result}]

    def end_dialog(self):
        return []

    def __repr__(self) -> str:
        '''Return an executable initialization for this class for executable logs'''
        return 'CompareNumbersProvider()'
## Реализовать интерфейсы для обработки параметров
Интерфейсы обрабатывают запросы внешнего интерфейса для провайдеров. Они должны быть достаточно прозрачными, но должны реализовывать логирование и управление переменными.

Декоратор `@route` назначает HTTP-конечные точки вашим API.
Помощник `api_call` оборачивает вызов логированием и сохранением состояния переменных.

[compare_numbers/compare_numbers_interface.py](./compare_numbers/compare_numbers_interface.py)
```python
from apis.compare_numbers.compare_numbers_provider import CompareNumbersProvider
from apis.base import BaseInterface
from apis.utils import load_parameter, route, completes_dialog

class CompareNumbersInterface(BaseInterface):
    def __init__(self, *args, **kwargs):
        super().__init__()
        self.provider = CompareNumbersProvider()

    # bind an HTTP endpoint to this function
    @route('/compare_numbers/compare', methods=['POST'])
    def compare(self, request_params):
        number1 = load_parameter(request_params, "number1")
        number2 = load_parameter(request_params, "number2")
        return self.api_call(self.provider.compare,
                             request_params, number1, number2)

    @route('/end_dialog', methods=['POST'])
    @completes_dialog(success=True, confirmation_type='rate_satisfaction')
    def end_dialog(self, request_params):
        return self.api_call(self.provider.end_dialog, request_params)
## Создание остальной части домена
Создайте новую папку в ../gui/backend/domains с именем вашего домена, например,

[../gui/backend/domains/compare_numbers](../gui/backend/domains/compare_numbers) и файл [`config.py`](../gui/backend/domains/compare_numbers/config.py)
```python
# Config file for the compare_numbers domain

import os
import sys
from keys import keys
from domains.domain import Domain

sys.path.append(
    os.path.dirname(
        os.path.dirname(
            os.path.dirname(
                os.path.dirname(
                    os.path.dirname(
                        os.path.abspath(__file__)))))))  # for loading apis

from apis.compare_numbers.compare_numbers_interface import CompareNumbersInterface

# Initialize interfaces
interfaces = [
    CompareNumbersInterface(),
]

# Create a Domain object, which will be used from this file
domain_dir = os.path.dirname(os.path.abspath(__file__))

compare_numbers_domain = Domain(
    'compare_numbers',
    interfaces,
    initialization=domain_dir + '/initialization.json',
    apis=domain_dir + '/apis.json',
    agent_templates=domain_dir + '/agent_templates.txt',
)

Этот конфигурационный файл должен инициализировать интерфейсы с любыми необходимыми ключами и указателями на следующие файлы:

  • apis.json: указывает имена API и параметры для загрузки в пользовательском интерфейсе агента
  • initialization.json: набор начальных переменных для агента
  • agent_templates.txt: список шаблонов NLG для агента Коммуникация с фигурными скобками {} в качестве заполнителей. В фигурные скобки можно поместить подсказки, например: {num1} is {comparator} {num2}
### ДОПОЛНИТЕЛЬНАЯ НАСТРОЙКА ДЛЯ ДОПОЛНИТЕЛЬНЫХ ФУНКЦИЙ

Для включения исполняемых журналов и новых тестовых случаев требуется немного больше настроек.

Исполняемые журналы

Добавьте любых новых провайдеров в apis/__init__.py

from apis.compare_numbers.compare_numbers_provider import CompareNumbersProvider

Тесты

Добавьте вашу конфигурацию в test.py

from domains.compare_numbers.config import compare_numbers_domain

Запустите новый домен

Перезапустите серверную часть с помощью команды --domain=$NAME

cd ../gui/backend
python main.py --port=8081 --domain=compare_numbers --num_rooms=1 --log_dir=logs/tutorial

Перезагрузите интерфейс (важно!)

cd ../gui/frontend
./run.sh 8081 8082

Обновите URL-адреса интерфейса. Теперь ваш новый API должен быть виден, и вы можете начать сбор данных между людьми.

Создание чат-бота-агента

Вы можете захотеть взаимодействовать с автоматическим чат-ботом вместо человеческого агента. Вы можете реализовать своего собственного пользовательского агента, следуя agents/README.md. Существует пример простой реализации на основе правил, которая использует эти интерфейсы в compare_numbers_agent.py.

Чтобы запустить этого агента, перезапустите серверную часть с этой командой:

cd ../gui/backend
python main.py --port=8081 --domain=compare_numbers --num_rooms=1 --log_dir=logs/tutorial \
    --agent_class_name=agents.compare_numbers_agent.CompareNumbersAgent

Приложение: Подробная архитектура API

          интерфейс - провайдер
        /
менеджер               провайдер
        \           /
          интерфейс
                    \ провайдер

Менеджер управляет всеми службами API. Он поддерживает:

  • Общие переменные для интерфейса
  • Счётчики переменных для ведения журнала

Интерфейсы абстрагируют доступ к API и могут использоваться для абстрагирования различий между внешними службами API, такими как GoogleMaps и MicroworldMaps. Каждый должен наследовать от BaseInterface и вызывать api_call. Интерфейсы выполняют следующие действия:

  • Ведение журнала
  • Сохранение состояния
  • Анализ запросов

Провайдеры фактически реализуют логику API. Это может включать вызов внешних служб, запрос к базе данных и другую сложную логику.

Пример:

          CompareNumbersInterface - CompareNumbersProvider
        /
менеджер
        \                 GMapsProvider
         \              /
          MapsInterface
                        \
                          MicroworldMapProvider
  • Интерфейс, которому необходимо поддерживать состояние и вести журнал, обращается к менеджеру и интерфейсам.
  • Агенты, которым на каждом шагу передаются переменные, обращаются только к интерфейсам.
  • Службы, которые не требуют ведения журнала, такие как воспроизведение журналов, должны обращаться только к провайдерам.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/didiopensource-MEEP.git
git@api.gitlife.ru:oschina-mirror/didiopensource-MEEP.git
oschina-mirror
didiopensource-MEEP
didiopensource-MEEP
master