GPTs + Actions + 簡易APIサーバーの基本(with GPT4先生）

### GPTs + Actions + 簡易APIサーバーの基本(with GPT4先生）
～GPTs+ActionsのハマりどころをGPT4先生といっしょに回避する～

# Actionsとは？
GPTsのActionsはネット経由でクラウドサーバー上のAPIにアクセスし、
そのGPTsがサーバーと情報をやりとりできる仕組みです。
GPTsは、Actionsを使わなくてもインターネットの情報にアクセスできますが、
基本的にBing等を経由してのweb上のテキストデータへのアクセスのみですので、
時間がかかり、途中で中断したりすることも多く、今後の改善が期待されます。
Actionsでは、気温や、天気、株価などの刻々と変わる情報を公開されているAPI
サーバーから取得できたり、独自のサーバーを使って情報のやりとりができます。
特にknowledge(知識源）に入りきれない膨大な情報にアクセスする必要がある場合、Actionsを使ってのクラウドサーバーとの情報のやりとりが必須になります。

# 簡易API
　先ず、APIサーバーですが、仕組みを理解するための実験なので、どのサーバーを提供している会社でも使えるPHPで作ってみます。
以下のインストラクション(プロンプト）をGPT4(plu以上）に入力します。
 
 ```
クライアント側から番号が送られたら、その番号に一致するテキストをクライアントに返すPHPのAPIを書け、例として　001　>　桜,  002  >  梅 , 003　> 松　とする
 ```

すると、以下のようなコードが出力されます。

```
<?php
// エラーがある場合は表示する（開発時のみ推奨）
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// 番号とそれに対応するテキストのマッピング
$textMap = [
    '001' => '桜',
    '002' => '梅',
    '003' => '松',
];

// クライアントからの番号を取得（ここではGETリクエストを想定）
$number = isset($_GET['number']) ? $_GET['number'] : '';

// 番号に基づいてテキストを決定し、クライアントに返す
if (array_key_exists($number, $textMap)) {
    // 番号がマッピングに存在する場合、対応するテキストを返す
    $response = [
        'status' => 'success',
        'text' => $textMap[$number],
    ];
} else {
    // 番号がマッピングに存在しない場合、エラーメッセージを返す
    $response = [
        'status' => 'error',
        'message' => 'Invalid number provided',
    ];
}

// コンテンツタイプをJSONに設定
header('Content-Type: application/json');

// レスポンスをJSON形式で出力
echo json_encode($response);
?>
```
これを、例えば、testAPI.phpとファイル名にして、サーバー上に置きます。

### ActionsGPT

次に、以下のインストラクション(プロンプト）をActionsGPTというGPTsにに入力します。 ActionsGPT --> https://chat.openai.com/g/g-TYEliDU6A-actionsgpt

```
サーバー側のapiが以下のような場合、このAPIにデータを送るactionsのスキーマを書け　-------->　<?php
// エラーがある場合は表示する（開発時のみ推奨）
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// 番号とそれに対応するテキストのマッピング
$textMap = [
    '001' => '桜',
    '002' => '梅',
    '003' => '松',
];

// クライアントからの番号を取得（ここではGETリクエストを想定）
$number = isset($_GET['number']) ? $_GET['number'] : '';

// 番号に基づいてテキストを決定し、クライアントに返す
if (array_key_exists($number, $textMap)) {
    // 番号がマッピングに存在する場合、対応するテキストを返す
    $response = [
        'status' => 'success',
        'text' => $textMap[$number],
    ];
} else {
    // 番号がマッピングに存在しない場合、エラーメッセージを返す
    $response = [
        'status' => 'error',
        'message' => 'Invalid number provided',
    ];
}

// コンテンツタイプをJSONに設定
header('Content-Type: application/json');

// レスポンスをJSON形式で出力
echo json_encode($response);
?>
```
 上のインストラクションの "-------->"　以下は、上の出力をコピペしたものです。
 すると、以下の出力を得ます。

 ```
 openapi: 3.0.0
info:
  title: TextMap API
  description: API to retrieve text based on provided number code.
  version: 1.0.0
servers:
  - url:http://your-server-url.com
    description: Main API server
paths:
  /getText:
    get:
      operationId: getTextByNumber
      summary: Retrieve text based on number code.
      parameters:
        - name: number
          in: query
          description: Number code to get corresponding text
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Successful response with text
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  text:
                    type: string
                    nullable: true
                  message:
                    type: string
                    nullable: true
        '400':
          description: Bad request when the number is not provided or invalid
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  message:
                    type: string
 ```
 これを、GPTs builderのConfigure -> ActionsのSchemaの欄にコピペし、
 仮にドメインがxxxx.comとし、testAPI.phpがwebのルートディレクトリに
 あるとすると、
 "http://your-server-url.com"の部分をhttps://xxxx.com/testAPI.php
 と書き換えます。（testAPi.phpは上で決めた任意のファイル名）

 ### ここで重要なのが、https です。httpではNGです。

 GPTsのインストラクションは以下のようにします。

 ```
 番号をサイトに送ると対応するテキストを得て表示する
 ```

 これで、Actions->TESTボタンをを押し、右のウィンドウのインストラクション欄に
 001を入力しリターンすると

 ```
001
[debug] Calling HTTP endpoint
[debug] Response received
Talked to dcf.jp
APIの呼び出しに成功しました。番号「001」に対応するテキストは「桜」です。

 ```

 と表示され、無事動作していることがわかります。