【もっと簡単に】LaravelでWatsonを使おう

過去に書いた[LaravelからWatson Assistantを使う](https://qiita.com/motuo/items/510b499c19d0c5c7be3e)をきっかけに`Watson Assistant`と`Watson Discovery Service`の呼び出しをラップするライブラリを作成しました。
ソースは[Github](https://github.com/motuo1201/call-watson-api)に置いてあります。
[packagist](https://packagist.org/packages/motuo/call-watson-api)はこちら。

## インストール方法
composer経由でインストール可能です。

``` bash
composer require motuo/call-watson-api
```

watson用の`config file`を下記のコマンドで生成します。

```bash
php artisan vendor:publish
```

上記のコマンドを実行すると、どのProviderのConfigを生成するか聞かれるので下記のパッケージを選択して下さい。

```
Provider: motuo\CallWatsonAPI\CallWatsonServiceProvider
```

最後に、`.env` ファイルにWatsonの認証情報やURLを追加しましょう。

```env
WATSON_ASSISTAN_API_URL="https://gateway-fra.watsonplatform.net/assistant/api"
WATSON_ASSISTANT_VERSION="2018-07-10"
WATSON_ASSISTANT_WORKSPACEID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
WATSON_ASSISTANT_USER_NAME=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
WATSON_ASSISTANT_PASSWORD=xxxxxxxxxxxx

WATSON_DISCOVERY_API_URL="https://gateway-fra.watsonplatform.net/discovery/api"
WATSON_DISCOVERY_VERSION="2018-10-15"
WATSON_DISCOVERY_ENV_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
WATSON_DISCOVERY_COLLECTION=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
WATSON_DISCOVERY_USER_NAME=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
WATSON_DISCOVERY_PASSWORD=xxxxxxxxxxxx
```

ちなみに、`Watson Assistant`のワークスペースIDや認証情報は下記をクリックする事で取得可能です。
![Assistant_Credentials1.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/54b77ca7-31cc-46d2-4d06-e2fa63c839e4.png)

Discoveryの`ENV_ID`及び`Collection Id`は**Manage data**のこちらから
![Discovery_Credentials1.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/b6b0477a-1fc6-8b9b-5892-11e344f89b22.png)

## 使い方

### Watson Assistant APIの呼び出し
簡単にメッセージを送る事が出来ます。
**Controllerの例**

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
//useを忘れずに！！！
use motuo\CallWatsonAPI\CallAssistant;

class TestContoller extends Controller
{
    public function index(Request $request,CallAssistant $CWA){
        //ここでWatson Assistantにメッセージを飛ばす。
        $response      = $CWA->postMessage('input message',session('context')?session('context'):[]);
        //必要に応じてjsonを配列にデコード
        $responseArray = json_decode($response,true);
        //連続した会話を実現するために、contextデータをsessionに可能する。
        $request->session()->put('context',$responseArray['context']);
        return view('welcome');
    }
}
```

### Watson Discovery APIの呼び出し方


```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use motuo\CallWatsonAPI\CallDiscovery;

class TestContoller extends Controller
{
    public function index(Request $request,CallDiscovery $CWD){
        //自分のCollection内の検索
        $query  = ['query'=>[
            'version'        => '2018-08-01',
            'deduplicate'    => 'false',
            'highlight'      => 'true',
            'passages'       => 'true',
            'passages.count' => '5'   ,
            'natural_language_query' => 'natural_language_query'
        ]];
        $CWD->queryCollection($query);
        //トレーニングデータ一覧の取得
        $CWD->listTrainingData();
        //質問文をキーにQueryIdを取得
        $CWD->getQueryIdByNLQ('natural_language_query');
        //質問文をトレーニング用のクエリとして追加
        $CWD->addQueryToTrainingData('document_id','natural_language_query',100);
        //トレーニング用のクエリを削除
        $CWD->deleteTrainingDataQuery('query_id');

        //既にクエリに紐づいている用例データの一覧を取得
        $CWD->listExamplesTrainingData('query_id');
        //既に該当のドキュメントがクエリに紐づいている場合、document_idを返却。
        $CWD->getExampleId('query_id','document_id');
        //トレーニング用データに用例と関連性(0～100)を追加
        $CWD->addExampleToTrainingData('query_id','document_id',100);
        //トレーニング用データから用例を削除
        $CWD->deleteExampleForTrainingDataQuery('query_id','document_id');
    }
}
```

初めてLaravel用のpackageを作りましたが、簡単・便利・その上楽しい:+1:
もっと早くやって置けばよかった…

## 参考文献
[パッケージ開発](https://readouble.com/laravel/5.5/ja/packages.html)
[Watson Assistant API リファレンス](https://console.bluemix.net/apidocs/assistant)
[Watson Discovery API リファレンス](https://console.bluemix.net/apidocs/discovery)