{"id":16122315,"url":"https://github.com/uezo/minette-python","last_synced_at":"2025-03-17T19:31:14.028Z","repository":{"id":57441737,"uuid":"97154537","full_name":"uezo/minette-python","owner":"uezo","description":"Minette is a minimal and extensible chatbot framework.","archived":true,"fork":false,"pushed_at":"2020-11-03T02:58:34.000Z","size":580,"stargazers_count":28,"open_issues_count":2,"forks_count":0,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-14T17:08:06.140Z","etag":null,"topics":["bot","bot-framework","chatbot","clova","janome","line","mecab","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/uezo.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-07-13T18:43:55.000Z","updated_at":"2024-12-18T11:36:25.000Z","dependencies_parsed_at":"2022-09-19T14:41:44.736Z","dependency_job_id":null,"html_url":"https://github.com/uezo/minette-python","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uezo%2Fminette-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uezo%2Fminette-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uezo%2Fminette-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uezo%2Fminette-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/uezo","download_url":"https://codeload.github.com/uezo/minette-python/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244096784,"owners_count":20397480,"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":["bot","bot-framework","chatbot","clova","janome","line","mecab","python"],"created_at":"2024-10-09T21:10:31.526Z","updated_at":"2025-03-17T19:31:13.677Z","avatar_url":"https://github.com/uezo.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Minette for Python\n[![Downloads](https://pepy.tech/badge/minette)](https://pepy.tech/project/minette)\n\nMinette はチャットボットを開発するための軽量で拡張可能なフレームワークです。とても簡単に開発できる上に、スパゲッティコードになることなく複雑なBOTにまで拡張していくことができます。\n\n[🇬🇧README in English](https://github.com/uezo/minette-python/blob/master/README.md)\n\n# 🎉 version 0.4.3 is available\n\n- 0.4.3 Sep 5, 2020\n    - 共有オブジェクトのサポート: 生成コストの高いオブジェクトなどをDialogService/DialogRouterに共有できるようになりました 👉 [PR #38](https://github.com/uezo/minette-python/pull/38)\n    - 形態素解析のスキップ: リクエスト文字列が最大長（設定可能、デフォルト1000文字）を超過した場合に形態素解析処理を行わないようにしました。0に設定することで常にスキップし、必要に応じてDialog内で手動で実行することもできます 👉 [PR #42](https://github.com/uezo/minette-python/pull/42)\n    - 形態素解析結果のジェネレーターのサポート: Taggerの戻り値を従来のlistではなくgeneratorでも受け取れるようになりました 👉 [PR #35](https://github.com/uezo/minette-python/pull/35)\n\n- 0.4.2 Aug 26, 2020\n    - [Janome 0.4](https://mocobeta.github.io/janome/)に対応しました\n\n- 0.4.1 Aug 7, 2020\n    - SQLAlchemyをサポートしました（試験的）。利用方法は [examples/todo.py](https://github.com/uezo/minette-python/blob/master/examples/todo.py) を参照ください。\n\n\n# 🚀 クイックスタート\n\nテスト用のおうむ返しであれば一瞬で試すことができます。\n\n```python\nfrom minette import Minette, EchoDialogService\n\n# ビルトインされたおうむ返し部品を使ってBOTを起動\nbot = Minette(default_dialog_service=EchoDialogService)\n\n# コンソール入出力でやりとり\nwhile True:\n    req = input(\"user\u003e \")\n    res = bot.chat(req)\n    for message in res.messages:\n        print(\"minette\u003e \" + message.text)\n```\n\n```\n$ python echo.py\nuser\u003e hello\nminette\u003e You said: hello\n```\n\nLINEBOTを作るのも同じくらい簡単です。\n\n```python\nfrom flask import Flask, request\nfrom minette import Minette, EchoDialogService\nfrom minette.adapter.lineadapter import LineAdapter\n\n# LINE接続部品を使ってBOTを起動\nbot = LineAdapter(default_dialog_service=EchoDialogService)\n\n# WebサーバとAPIエンドポイントの設定\napp = Flask(__name__)\n\n@app.route(\"/\", methods=[\"POST\"])\ndef handle_webhook():\n    bot.handle_http_request(request.data, request.headers)\n    return \"ok\"\n\n# Webサーバの起動\napp.run(port=12345)\n```\n\nその他の例については[examples.ja.md](https://github.com/uezo/minette-python/blob/master/examples.ja.md)を参照してください。\n\n\n# 📦 インストール\n\n```\n$ pip install minette\n```\n\n\n# ✅ 対応プラットフォーム\n\nPython 3.5以上。開発は主に3.7.7（on Mac OSX）で行なっています。\n\n## メッセージングサービス\n\n- LINE\n- Clova\n- Symphony\n\n`minette.Adapter`を拡張した独自クラスを作成することで、FacebookやSlackなど他のサービスに接続することもできます。\n\n## データベース\n\n- SQLite\n- Azure SQL Database\n- Azure Table Storage\n- MySQL (Tested on 8.0.13)\n\n`minette.datastore` パッケージ内の Context / User / MessageLog の各クラスを拡張することで、上記以外のお好みのデータベースを利用することもできます。また、SQLAlchemyがサポートしているデータベースであれば、Engineの接続文字列を指定するだけで利用できる可能性があります。\n\n## 形態素解析エンジン\n\n- MeCab\n- Janome\n\nクラウドサービスとして提供されているものや他の言語の形態素解析エンジンも `minette.Tagger` を拡張したクラスを実装することで利用できるようになります。\nMeCabやJanomeのインストール方法についてはページ下部にAppendixとしてまとめましたので必要に応じて参照してください。\n\n# 📚 依存ライブラリ\n\n(必須)\n- pytz \u003e= 2018.9\n- schedule \u003e= 0.6.0\n\n(オプション)\n- line-bot-sdk \u003e= 1.12.1 (for LINE)\n- clova-cek-sdk \u003e= 1.1.1\n- sym-api-client-python \u003e= 0.1.16 (for Symphony)\n- pyodbc \u003e= 4.0.26 (for Azure SQL Databsae)\n- azure-cosmosdb-table \u003e= 1.0.5 (for Azure Table Storage)\n- MySQLdb (for MySQL)\n- SQLAlchemy (for SQLAlchemyStores)\n- mecab-python3 \u003e= 1.0.1 (for MeCabTagger)\n- Janome \u003e= 0.3.8 (for Janome Tagger)\n\n# ✨ 特長\n\n`DialogService(s)` と `DialogRouter` という2つの部品を実装するだけでチャットボットを開発することができます。\n\n- DialogService: 対話シナリオに剃ってビジネスロジックを処理し、その結果に応じた応答メッセージを組み立てる\n- DialogRouter: 発話からインテント（BOTへの指示内容）とエンティティ（指示の関連情報）を抽出し、それに応じて適切な`DialogService`を呼び出す\n\n[![Architecture](http://uezo.net/img/minette_architecture.png)](http://uezo.net/img/minette_architecture.png)\n\n上記以外の共通機能（コンテキスト管理など）はフレームワークによって行われるため、開発者はアプリケーションに集中することができます。\n\n## コンテキスト管理\n\n文脈を意識した会話を行えるようにするため、Minetteはコンテキスト管理の機能を提供しています。WebシステムでいうところのHTTPセッションに相当する機能です。これを利用することで、以前の発話における処理結果を利用することができます。\n\nデータの格納\n```python\n# `context.topic.keep_on`に`True`を設定することで、次回のリクエストで格納したデータを利用することができます\ncontext.data[\"pizza_name\"] = \"Seafood Pizza\"\ncontext.topic.keep_on = True\n```\n\nデータの取得\n```python\npizza_name = context.data[\"pizza_name\"]\n```\n\n## ユーザー管理\nユーザーはチャネルとチャネル(e.g LINE, FB Messanger etc)におけるユーザーIDの2つをキーに一意に管理されます。初回アクセス時に自動的にユーザーが登録され、また、アプリケーションロジック内で修正したユーザー情報は自動的に保存されます。\n\n```python\n# 変更したユーザー情報は自動的に保存されます。コンテキストとは異なり、明示的に削除するまで情報は維持されます\nrequest.user.nickname = \"uezo\"\nrequest.user.data[\"horoscope\"] = \"cancer\"\n```\n\n## 形態素解析\n`Tagger`は形態素解析のための部品で、解析結果はリクエスト情報に自動的に格納され各`DialogService`（アプリケーション）で利用することができます。\nMinetteには`MeCabTagger`、`JanomeTagger`の2つのTaggerが最初から組み込まれています。\n\nJanomeTaggerを利用するには、まずはJanome（ピュアパイソンな形態素解析エンジン）をインストールします。\n\n```bash\n$ pip install janome\n```\n\n続いて動作確認をしてみましょう。以下の通り1つめの単語についての解析結果を表示してみます。\n\n```python\n\u003e\u003e\u003e from minette.tagger.janometagger import JanomeTagger\n\u003e\u003e\u003e tagger = JanomeTagger()\n\u003e\u003e\u003e words = tagger.parse(\"今日は良い天気です\")\n\u003e\u003e\u003e words[0].to_dict()\n{'surface': '今日', 'part': '名詞', 'part_detail1': '副詞可能', 'part_detail2': '', 'part_detail3': '', 'stem_type': '', 'stem_form': '', 'word': '今日', 'kana': 'キョウ', 'pronunciation': 'キョー'}\n```\n\nDialogServiceでの利用例は以下の通り。Minetteオブジェクトを生成するときに`tagger`として`JanomeTagger`クラスを指定すれば、自動的にリクエスト本文の形態素解析が行われます。\n\n```python\n# bot = Minette(tagger=JanomeTagger) \u003c- Note: create bot with JanomeTagger\n\ndef process_request(self, request, context, connection):\n    # result of parsing morph is set in `request.words` automatically\n    nouns = [w.surface for w in request.words if w.part == \"名詞\"]\n```\n\n\n## タスクスケジューラー\n定期実行のためのタスクのスケジューラーが利用可能です。\n\n```python\nclass MyTask(Task):\n    # `do`メソッドに定期実行したい処理内容を実装します\n    def do(self, arg1, arg2):\n        # スケジューラーのロガーが各タスクの中でも利用することができます\n        self.logger.info(\"Task started!: {} / {}\".format(arg1, arg2))\n\n# スケジューラーオブジェクトの生成\nsc = Scheduler()\n# 3秒ごとに`MyTask`の処理内容を実行するように登録\nsc.every_seconds(MyTask, seconds=3, arg1=\"val1\", arg2=\"val2\")\n# 定期実行の開始\nsc.start()\n```\n\n## メッセージログ\nリクエスト、応答、コンテキストの対話ログが保存されます。デバッグやリリース後の改善活動にお役立てください。\n\n## 対話のテスト\nMinetteは対話クラスのテストを支援するための機能を提供しています。\n\n- テストケース毎（テスト関数毎）に異なる `channel_user_id` を自動でセットします。\n- `chat` メソッドに `Message` オブジェクトの生成に必要な引数を渡すことができます。`bot.chat(Message(text=\"hello\", intent=\"HelloIntent\"))` のかわりに `bot.chat(\"hello\", intent=\"HelloIntent\")` と呼び出すことができるため、テストコードをよりスッキリさせることができます。\n- `chat` からも戻り値の `Response` オブジェクトに `response.messages[0].text` の値をセットした `text` アトリビュートを追加します。\n\npytestでの利用例は以下の通り。\n\n```python\nimport pytest\nfrom minette import Message, DialogService, Priority, Payload\nfrom minette.test.helper import MinetteForTest\n\n# dialogs to test\nclass FooDialog(DialogService):\n    def compose_response(self, request, context, connetion):\n        return \"foo:\" + request.text\n\nclass BarDialog(DialogService):\n    def compose_response(self, request, context, connetion):\n        context.topic.keep_on = True\n        return \"bar:\" + request.text\n\nclass PayloadDialog(DialogService):\n    def compose_response(self, request, context, connetion):\n        return \"payload:\" + str(request.payloads[0].content)\n\n# bot created for each test functions\n@pytest.fixture(scope=\"function\")\ndef bot():\n    # use MinetteForTest instead of Minette\n    return MinetteForTest(\n        intent_resolver={\n            \"FooIntent\": FooDialog,\n            \"BarIntent\": BarDialog,\n            \"PayloadIntent\": PayloadDialog\n        },\n    )\n\n# test cases function using bot\ndef test_example(bot):\n    # trigger intent\n    assert bot.chat(\"hello\", intent=\"FooIntent\").text == \"foo:hello\"\n    # empty response without intent\n    assert bot.chat(\"hello\").text == \"\"\n    # trigger other intent\n    assert bot.chat(\"hello\", intent=\"BarIntent\").text == \"bar:hello\"\n    # context and topic is kept by dialog service\n    assert bot.chat(\"hi\", intent=\"FooIntent\").text == \"bar:hi\"\n    assert bot.chat(\"yo\").text == \"bar:yo\"\n    # update topic by higher priority request\n    assert bot.chat(\"hello\", intent=\"FooIntent\", intent_priority=Priority.High).text == \"foo:hello\"\n\ndef test_payload(bot):\n    # use Message to test your dialog with payloads, channel_message and so on\n    assert bot.chat(Message(\n        intent=\"PayloadIntent\",\n        type=\"data\",\n        text=\"hello\",\n        payloads=[Payload(content={\"key1\": \"value1\"})]\n    )).text == \"payload:\" + str({\"key1\": \"value1\"})\n```\n\n# 💝 コントリビューション\n\n[コントリビューションガイド](https://github.com/uezo/minette-python/blob/master/CONTRIBUTING.md)を参照してください🙏\n\n# ⚖️ ライセンス\nApache v2 License\n\n# Appendix. MeCabTaggerのセットアップ\n\n## MeCabのインストール\n\n- Ubuntu 16.04\n\n```\n$ sudo apt-get install mecab libmecab-dev mecab-ipadic\n$ sudo apt-get install mecab-ipadic-utf8\n```\n\n- Mac OSX\n\n```\n$ brew install mecab mecab-ipadic git curl xz\n```\n\n## Pythonバインディングのインストール\n\n```\n$ pip install mecab-python3==1.0.1\n```\n\n~~0.996.1時点では`surface`が想定通りにならないバグ？があるため、0.7のインストールをお勧めします。~~ 解決済み\n\n\n## 使い方\n\n```python\nfrom minette.tagger.mecabtagger import MeCabTagger\nbot = Minette(\n    tagger=MeCabTagger\n)\n```\n\n# Appendix2 version 0.3からの移行について\n\n- いくつかのパッケージが変更になっており、特定ベンダーに依存しない全てのクラスは `minette` からインポートするようになりました。\n- `Minette` インスタンスの生成方法。コンストラクターで直接生成するようになりました。\n- `Session` から `Context` に名称を変更しています。また、`session` という引数をとるものもすべて `context` に変更しました。\n- `minette.user.User#save()` を廃止しました。アプリロジックでユーザー情報を保存するには、 `UserStore` インスタンスを生成してください。\n- `SessionStore` -\u003e `ContextStore`, `UserRepository` -\u003e `UserStore`, `MessageLogger` -\u003e `MessageLogStore`\n- `LineAdapter` のHTTPリクエストを受け取るメソッドは、`chat` から `handle_http_request` に変更しました。\n\nもし version 0.3 をインストールしたい場合、Githubのリリースパッケージから入手してください。\n\n```\n$ pip install git+https://github.com/uezo/minette-python.git@v0.3\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuezo%2Fminette-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuezo%2Fminette-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuezo%2Fminette-python/lists"}