10.3.3.1. チャットサンプル¶
スクリプト開発モデルのAPI「ChatAction」を使った基本的な実装例を紹介します。
コラム
「ChatAction」のAPI仕様は以下を参考にしてください:
10.3.3.1.1. テキスト入力サンプル¶
システムプロンプトとユーザプロンプトを含むメッセージをもとに、アシスタントメッセージを取得します。
function run(input) {
var action = new ChatAction();
var generalAffairsRules = {
"名刺発注": "名刺は毎月15日までに社内ポータルの申請フォームから依頼してください。上長の承認が必要です。",
"備品購入": "備品は総務部のSlackチャンネルにて申請してください。月末締めでまとめて発注します。",
"勤怠修正": "勤怠修正は人事システムから申請し、所属長の承認を得てください。",
"出張申請": "出張は出張申請書を提出し、部門長と経理部の承認を得る必要があります。",
"社内イベント": "社内イベントの企画は、総務部に事前相談のうえ、稟議申請を行ってください。"
};
var systemPrompt = "あなたは総務担当です。以下の社内ルールに基づき、質問に対して簡潔かつ明瞭に回答してください。\n\n";
for (var key in generalAffairsRules) {
if (generalAffairsRules.hasOwnProperty(key)) {
systemPrompt += "- " + key + ": " + generalAffairsRules[key] + "\n";
}
}
var messages = [
{
role: 'system',
content: systemPrompt
},
{
role: 'user',
content: '名刺発注の方法を教えてください。'
}
];
var result = action.execute(messages);
if (!result.error) {
var lastMessage = result.data[result.data.length - 1];
// コンテンツフィルタ: AIサービスの不適切コンテンツ検出機能
// 入力違反時はAPI実行時にエラーが発生、出力違反時はcontentFilterプロパティで検出可能
if (lastMessage.contentFilter && lastMessage.contentFilter.output === 'blocked') {
// 必要に応じて出力違反時の処理を記載
}
var assistantMessage = lastMessage.content;
return {
message: assistantMessage,
error: false
};
} else {
return {
message: null,
error: true
};
}
}
10.3.3.1.2. 画像入力サンプル¶
システムプロンプトとユーザプロンプト、画像を含むメッセージをもとに、アシスタントメッセージを取得します。
function run(input) {
var action = new ChatAction();
var storage = new PublicStorage('product_A_v1.jpg');
var dataUrl = ChatMessage.convertToImageDataUrl(storage.openAsBinary()).data;
var messages = [
{
role: 'system',
content: '製品画像を評価してください。デザイン、色、パッケージ、ロゴの配置などの視覚的な部分を分析してください。また、魅力的に見えるかも教えてください。'
},
{
role: 'user',
content: [
{
type: 'text',
text: '次の製品画像を分析してください。'
},
{
type: 'image_url',
image_url: {
url: dataUrl
}
}
]
}
];
var result = action.execute(messages);
if (!result.error) {
var lastMessage = result.data[result.data.length - 1];
var assistantMessage = lastMessage.content;
return {
message: assistantMessage,
error: false
};
} else {
return {
message: null,
error: true
};
}
}
10.3.3.1.3. ツール呼び出しサンプル¶
ユーザプロンプト、ツール定義、およびツール呼び出し結果を含むメッセージをもとに、アシスタントメッセージを取得します。
function run(input) {
// 1. ChatAction の取得
var action = new ChatAction();
// 2. ツール定義の作成(プレーンオブジェクトとして定義)
var inventoryTool = {
name: 'check_inventory',
description: '商品の在庫数を確認します',
parameters: {
type: 'object',
properties: {
productCode: {
type: 'string',
description: '商品コード'
},
warehouseCode: {
type: 'string',
description: '倉庫コード(省略時は全倉庫)'
}
},
required: ['productCode'],
additionalProperties: false
}
};
// 3. ツール設定の作成
var toolConfig = {
toolDefinitions: [inventoryTool],
toolChoice: {type: 'auto'}
};
// 4. 初回メッセージの作成
var messages = [];
var userMessage = new ChatMessage();
userMessage.role = 'user';
userMessage.content = '商品コード P-001 の在庫数を教えてください。';
messages.push(userMessage);
// 5. ChatOption の設定
var option = new ChatOption();
option.temperature = 0.0;
// 6. AI の応答を取得(ツール呼び出しを含む)
var response = action.executeWithTool(messages, option, toolConfig);
var lastMessage = response.data[response.data.length - 1];
messages.push(lastMessage);
// 7. ツール呼び出しの処理
if (lastMessage.toolCalls && lastMessage.toolCalls.length > 0) {
var chatTextContents = [];
lastMessage.toolCalls.forEach(function(toolCall) {
Debug.console('ツール呼び出し: ' + toolCall.name);
Debug.console('引数: ' + toolCall.arguments);
// 実際のツール実行(ここでは模擬的な在庫確認)
var result = executeInventoryCheck(toolCall);
Debug.console('ツール実行結果: ' + result);
var chatTextContent = {
type: "text", // 固定で "text"
toolCallId: toolCall.id,
text: result
};
chatTextContents.push(chatTextContent);
});
// ツール実行結果を1つのメッセージにまとめて追加
var toolMessage = new ChatMessage();
toolMessage.role = 'tool'; // ツール結果は "tool" ロールで送信します
toolMessage.content = chatTextContents;
messages.push(toolMessage);
// 8. ツール実行結果を踏まえた最終応答を取得
var finalResponse = action.executeWithTool(messages, option, toolConfig);
// 最終応答を出力
if (!finalResponse.error) {
var finalResponseMessage = finalResponse.data[finalResponse.data.length - 1];
var assistantMessage = finalResponseMessage.content;
return {
message: assistantMessage,
error: false
};
}
}
return {
message: null,
error: true
};
}
/**
* 在庫確認の実行(模擬実装)
* @param {Object} toolCall - ツール呼び出し情報
* @returns {string} 在庫確認結果
*/
function executeInventoryCheck(toolCall) {
try {
// バリデーション用のスキーマ定義(inventoryToolと同じ内容)
var schema = {
type: 'object',
properties: {
productCode: {
type: 'string',
description: '商品コード'
},
warehouseCode: {
type: 'string',
description: '倉庫コード(省略時は全倉庫)'
}
},
required: ['productCode'],
additionalProperties: false
};
// JsonSchemaValidatorを使用したバリデーション実行
var validator = new JsonSchemaValidator(schema);
var validResult = validator.isValidJson(toolCall.arguments);
if (!validResult.data) {
// バリデーションエラーがある場合、詳細を取得
var errors = validator.validateJson(toolCall.arguments);
var errorMessages = [];
if (errors.data && errors.data.length > 0) {
errors.data.forEach(function(error) {
errorMessages.push(error.propertyName + ': ' + error.message);
});
}
return 'バリデーションエラー:\n- ' + errorMessages.join('\n- ');
}
// JSON 引数をパース
var params = JSON.parse(toolCall.arguments);
// 実際の在庫確認処理(ここでは固定値を返す)
var stockQuantity = 150; // 実際はデータベースなどから取得
return '商品コード ' + params.productCode + ' の在庫数: ' + stockQuantity + ' 個';
} catch (e) {
return '在庫確認エラー: ' + e.message;
}
}