はじめに
GPTs Actionsの構築は、今日のデジタル世界における重要なスキルの一つです。特に、GPTsに特化した「ActionsGPT」は、この分野での作業を劇的に簡素化します。この記事では、GPTs Actionsを構築するための簡単な方法と、ActionsGPTの利用方法を詳しく解説します。
この辺りのGPTsもこちらのワークフローで作成してます
GPTs Actions Schemaの構築方法
GPTs Actions Schemaを構築する際、まず理解するべきは、ActionsGPTがどのようにしてこのプロセスを容易にするかという点です。このツールは、GPTs Actionsの内容を深く学習しており、ユーザーが参考サイトのSchemaを提供するだけで、高精度なSchemaを生成できます。
SchemaからGASへの変換
GPTs Actionsを利用する際の一つの利点は、SchemaからGoogle Apps Script(GAS)を作成できることです。これにより、ユーザーは独自のスクリプトを書くことなく、効率的にGPTs Actionsを実装できます。
GASからSchemaの生成
逆に、既存のGASを持っている場合、ActionsGPTはこれを分析し、適切なSchemaを生成することが可能です。これにより、GPTs Actionsの構築プロセスがさらにスムーズになります。
たたき台の作成
Person:
function myFunction() {
let response = UrlFetchApp.fetch("https://arxiv.org/list/cs/new");
let content = response.getContentText("utf-8");
var items = Parser.data(content).from('<dt>').to('</dd>').iterate();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// シートの内容をクリア
sheet.clear();
// 列名を設定
sheet.getRange(1, 1).setValue("Title");
sheet.getRange(1, 2).setValue("Abstract");
sheet.getRange(1, 3).setValue("Authors");
sheet.getRange(1, 4).setValue("Paper URL");
sheet.getRange(1, 5).setValue("GitHub URL");
sheet.getRange(1, 6).setValue("Full Text");
items.forEach(function(item, index) {
// タイトルの抽出
// ...
// Googleシートに書き込む
// 2行目からデータを書き込む(1行目は列名)
sheet.getRange(index + 2, 1).setValue(title);
sheet.getRange(index + 2, 2).setValue(abstract);
sheet.getRange(index + 2, 3).setValue(authors);
sheet.getRange(index + 2, 4).setValue(paperUrl);
sheet.getRange(index + 2, 5).setValue(githubUrl);
sheet.getRange(index + 2, 6).setValue(item); // 全文データ
});
}
上記の処理を踏まえて、下記のIDを入れると検索するコードから、任意の数字を受け取ったら、上からその数字の論文の数の内容を返すようにして
function doGet(e) {
// リクエストからパラメータを取得
console.log("start GPTs Custom Actions API test");
console.log("e: " + JSON.stringify(e));
var searchQuery = e.parameter.id;
console.log("e.parameter.id: " + e.parameter.id);
// 4桁の数字かどうかをチェック
if (!searchQuery || !/^\d{4}$/.test(searchQuery)) {
console.log("bad format: " + searchQuery);
return ContentService.createTextOutput(
JSON.stringify({ "error": "Invalid request. Please provide a 4-digit number." })
).setMimeType(ContentService.MimeType.JSON);
}
// スプレッドシートの準備
var sheet = SpreadsheetApp.openById('17WqvBLUb1VTgIjFl4LG6kYzepQAeqk1y2hVVoKglnOc').getSheetByName('シート1');
var data = sheet.getDataRange().getValues();
console.log("format OK");
// スプレッドシートを検索
for (var i = 1; i < data.length; i++) { // 2行目から開始
if (data[i][0].toString() === searchQuery) {
console.log("hit: " + i);
console.log("Food Name: " + data[i][1]);
// 見つかった場合、JSONとして返す
return ContentService.createTextOutput(
JSON.stringify({ "Food Name": data[i][1] })
).setMimeType(ContentService.MimeType.JSON);
}
}
console.log("not found");
// 一致するデータが見つからない場合
return ContentService.createTextOutput(
JSON.stringify({ "error": "No data found for the provided number." })
).setMimeType(ContentService.MimeType.JSON);
}
ChatGPT:
- このスクリプトの修正を行うには、以下のステップに従います。
-
パラメータの解釈 :
doGet
関数で、クエリパラメータとしてid
を受け取ります。このid
パラメータは、スプレッドシートから取得したい論文の数を示します。 -
バリデーションの変更 :
現在のバリデーションでは4桁の数字のみを受け付けていますが、これを任意の正の整数に変更します。 -
指定された数の論文を返す :
スプレッドシートから、指定された数の論文を取得し、それらをJSON形式で返します。
修正後のコードは次のようになります。
function doGet(e) {
// リクエストからパラメータを取得
console.log("start GPTs Custom Actions API test");
console.log("e: " + JSON.stringify(e));
var numberOfPapers = e.parameter.id;
console.log("e.parameter.id: " + e.parameter.id);
// パラメータが正の整数かどうかをチェック
if (!numberOfPapers || !/^\d+$/.test(numberOfPapers)) {
console.log("bad format: " + numberOfPapers);
return ContentService.createTextOutput(
JSON.stringify({ "error": "Invalid request. Please provide a positive integer." })
).setMimeType(ContentService.MimeType.JSON);
}
// スプレッドシートの準備
var sheet = SpreadsheetApp.openById('17WqvBLUb1VTgIjFl4LG6kYzepQAeqk1y2hVVoKglnOc').getSheetByName('シート1');
var data = sheet.getDataRange().getValues();
console.log("format OK");
// 指定された数の論文を返す
var papers = [];
for (var i = 1; i <= Math.min(data.length - 1, Number(numberOfPapers)); i++) {
var paperData = {
"Title": data[i][0],
"Abstract": data[i][1],
"Authors": data[i][2],
"Paper URL": data[i][3],
"GitHub URL": data[i][4],
"Full Text": data[i][5]
};
papers.push(paperData);
}
// 結果をJSONとして返す
return ContentService.createTextOutput(
JSON.stringify(papers)
).setMimeType(ContentService.MimeType.JSON);
}
この修正により、id
パラメータに指定された数だけ、スプレッドシート上の論文情報を返すようになります。パラメータが正の整数でない場合は、適切なエラーメッセージが返されます。
スクリプトの微調整
Person:
- Full Textはデバッグ用なので不要です。
上記の最新論文を取得するコードをもとに、下記のコードを修正して
{
"openapi": "3.1.0",
"info": {
"title": "Get name data",
"description": "Get lastname and firstname by id",
"version": "v1.0.0"
},
"servers": [
{
"url": "https://script.google.com"
}
],
"paths": {
"/macros/s/AKfycbyRbbQjj7A0gUGXlIzkhHcn1ohpX4KlT6D61Pf_L1YrzDLJN-4YCEVLQyS5C29OMIfO/exec": {
"get": {
"description": "Get lastname and firstname by id",
"operationId": "GetNameByid",
"parameters": [
{
"name": "id",
"in": "query",
"description": "ID No.",
"required": true,
"schema": {
"type": "string"
}
}
],
"deprecated": false
}
}
},
"components": {
"schemas": {
"NameResponse": {
"type": "object",
"properties": {
"Name": {
"type": "string"
}
}
}
}
}
}
ChatGPT:
- このスクリプトは、OpenAPI 3.1.0 スペックを使用してAPIの仕様を定義しています。この仕様を修正して、最新の論文を取得する機能を反映させるには、以下のステップを実行します。
-
エンドポイントの説明を更新する :
現在の説明は「IDによって姓と名を取得する」となっていますが、これを「指定された数の最新論文を取得する」という説明に変更します。 -
パラメータの定義を更新する :
現在のid
パラメータは文字列型として定義されていますが、これを正の整数を受け入れるように変更します。 -
レスポンスのスキーマを更新する :
現在のスキーマは単一の名前を返すように設定されていますが、これを論文のリストを返すように変更します。
修正後のOpenAPIスペックは以下のようになります。
openapi: "3.1.0"
info:
title: "Get latest papers"
description: "Get a list of the latest papers by the specified number"
version: "v1.0.0"
servers:
- url: "https://script.google.com"
paths:
/macros/s/AKfycbyRbbQjj7A0gUGXlIzkhHcn1ohpX4KlT6D61Pf_L1YrzDLJN-4YCEVLQyS5C29OMIfO/exec:
get:
description: "Get a list of the latest papers by the specified number"
operationId: "GetLatestPapers"
parameters:
- name: "id"
in: "query"
description: "Number of papers to retrieve"
required: true
schema:
type: "integer"
format: "int32"
minimum: 1
deprecated: false
components:
schemas:
PapersResponse:
type: "object"
properties:
Papers:
type: "array"
items:
type: "object"
properties:
Title:
type: "string"
Abstract:
type: "string"
Authors:
type: "string"
PaperURL:
type: "string"
GitHubURL:
type: "string"
この変更により、APIは指定された数の最新論文を取得し、そのタイトル、アブストラクト、著者、論文URL、GitHub URLを含むリストを返すようになります。また、パラメータid
は正の整数として定義されており、少なくとも1の値が必要です。
ドキュメントからSchemaの生成
ベースとなるPOSTリクエストの生成
まず、POSTリクエストを実施するサンプルのSchemaを生成してもらいます。
Person:
- POSTする例を日本語でください
ChatGPT:
- もちろんです。OpenAPI 3.0の仕様を使って、POSTリクエストの例を日本語で説明します。ここでは、ユーザーを作成するためのAPIエンドポイントを想定しています。このエンドポイントは、ユーザー名とパスワードをJSON形式で受け取り、新しいユーザーを作成します。
openapi: 3.0.0
info:
title: ユーザー管理API
description: ユーザー情報を管理するためのAPIです。
version: 1.0.0
servers:
- url: http://api.example.com/v1
description: 本番サーバー
paths:
/users:
post:
operationId: createUser
summary: ユーザーを作成します。
description: 新しいユーザーを作成するためのエンドポイントです。
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
username:
type: string
description: ユーザー名
password:
type: string
description: パスワード
responses:
'201':
description: ユーザー作成成功
'400':
description: 不正なリクエスト
この仕様では、/users
パスに対してPOSTリクエストを送ることでユーザーを作成できます。リクエストボディには username
と password
が必要です。このAPIは成功時にステータスコード201を返し、不正なリクエストの場合は400を返します。
このような仕様では、必要なパラメータやリクエストの形式が明確になり、ユーザーは簡単にAPIを利用できます。
LINE Messaging API Schemaの生成
次に、ベースとなるPOST Schemaを参考にLINE Messaging APIのドキュメントを考慮したSchemaを生成してもらいます。
Person:
- 下記の情報を用いてGPTsからlineに情報を展開して
POST https://api.line.me/v2/bot/message/broadcast
curl -v -X POST https://api.line.me/v2/bot/message/broadcast \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-H 'X-Line-Retry-Key: {UUID}' \
-d '{
"messages":[
{
"type":"text",
"text":"Hello, world1"
},
{
"type":"text",
"text":"Hello, world2"
}
]
}'
ChatGPT:
- 以下は、提供された情報を基に、LINE Messaging APIの
broadcast
エンドポイントに対するOpenAPI 3.0仕様を作成したものです。この仕様は、指定したメッセージをLINEのボットから全ユーザーにブロードキャストするために使用されます。
openapi: 3.0.0
info:
title: LINE Messaging API
description: LINE Messaging APIを通じてメッセージを送信する。
version: 1.0.0
servers:
- url: https://api.line.me/v2/bot
description: LINE Messaging APIサーバー
paths:
/message/broadcast:
post:
operationId: broadcastMessage
summary: メッセージを全ユーザーにブロードキャストする。
description: LINEボットが指定したメッセージを全ユーザーにブロードキャストします。
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
messages:
type: array
description: 送信するメッセージの配列。
items:
type: object
properties:
type:
type: string
description: メッセージのタイプ。
text:
type: string
description: 送信するテキストメッセージ。
responses:
'200':
description: メッセージ送信成功
'400':
description: 不正なリクエスト
security:
- lineAuth:
- channelAccessToken
securitySchemes:
lineAuth:
type: http
scheme: bearer
bearerFormat: JWT
この仕様には、リクエストボディでメッセージのタイプとテキストを指定する必要があります。また、セキュリティスキームとしてBearer認証を使用し、Authorization
ヘッダーにチャネルアクセストークンを含める必要があります。このエンドポイントは、正常にメッセージが送信された場合にステータスコード200を返し、不正なリクエストの場合は400を返します。
この仕様では、メッセージのタイプやテキスト、セキュリティスキームなどが定義されており、ユーザーはLINEのボットから効果的にメッセージを送信できます。
結論
GPTs Actionsの構築は、ActionsGPTのようなツールを活用することで、非常に簡単かつ効率的になります。この記事で紹介したような例は、GPTs Actionsの構築を始める際の素晴らしい出発点となるでしょう。