メインコンテンツまでスキップ

AI チャットウィジェット

単一の HTML 要素で、フル機能の AI チャット体験をウェブサイトに追加できます。​
Squid AI チャットウィジェットのスクリーンショット

AI チャットウィジェットを使用する理由​

サイト上で、ユーザーが AI agent とチャットできるようにしたいとします。agent はビジネスについて理解し、セキュリティモデルに従い、ブランドに合った見た目で、理想的には音声入力、事前定義プロンプト、chain-of-thought の可視化をサポートする必要があります。

これをゼロから構築するには、チャット UI の作成、ストリーミングの接続、履歴の処理、auth の統合、スタイリングが必要です。Squid AI チャットウィジェットは、これらすべてを単一の web component として提供します。

Client code
<script async src="https://widget.squid.cloud/widget.umd.js"></script>

<squid-chat-widget-with-fab-button
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-environment-id="prod"
squid-ai-agent-id="YOUR_AGENT_ID"
></squid-chat-widget-with-fab-button>

これで完全な AI チャット体験が実現します。入力ボックス、履歴、ストリーミングレスポンス、および開閉用の floating action button(FAB)が含まれます。

このページの右下にある FAB から、今すぐこのウィジェットを試すことができます。

概要​

Squid AI チャットウィジェットは、Squid AI agent(または Query with AI を介して Squid database integration と直接通信します。以下の例を参照してください)と通信する自己完結型の web component です。https://widget.squid.cloud/widget.umd.js でホストされる単一の UMD bundle として提供され、Shadow DOM 内にレンダリングされるため、サイトのスタイルと競合しません。

2 種類の要素バリアント​

要素動作
<squid-chat-widget>インラインのチャットブロック。ドキュメント内で配置した場所にレンダリングされます。サイズとレイアウトは自由に制御できます。
<squid-chat-widget-with-fab-button>右下隅の floating action button(FAB)。クリックするとチャットの開閉が切り替わります。

どちらの要素も、同じ属性セットを受け取ります。

チャットウィジェットを使用する場面​

ユースケース推奨
マーケティングサイトまたは web app に AI assistant を追加するチャットウィジェット
完全にカスタムなチャット UI を構築するAI agent SDK を直接使用
特定の database について質問するチャットを埋め込むsquid-ai-query="true" および squid-ai-integration-id を指定したチャットウィジェット
UI なしでプログラムによる AI 呼び出しを実行するsquid.ai().agent() または executeAiQuery

クイックスタート​

前提条件​

  • Squid Console で作成した Squid application
  • application の Agent Studio タブで作成した AI agent
  • agent ID、Squid app ID、region(いずれも Squid Console の Backend Project にある Show env vars で確認可能)

ステップ 1: AI agent を作成する​

  1. Squid Console で application を開き、Agent Studio タブをクリックします
  2. Create New Agent をクリックします
  3. Agent ID(後から変更できません)と説明を入力します
  4. Create をクリックします

agent の作成後に、Instructions(agent の応答方法に関するルール)と Knowledge base 項目(背景コンテキスト)を追加します。Test chat ボタンを使用して、すぐに agent をテストできます。

注記

Squid では dev と prod の環境が分かれています。AI agent はこれらの間で共有されません。ウィジェットの squid-environment-id 属性が、agent を作成した環境と一致することを確認してください。environmentsを参照してください。

ステップ 2: ウィジェットスクリプトを読み込む​

ウィジェットの script tag を HTML の <head> または <body> に追加します。

Client code
<script async src="https://widget.squid.cloud/widget.umd.js"></script>

ステップ 3: ウィジェットをレンダリングする​

Client code
<squid-chat-widget-with-fab-button
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-environment-id="prod"
squid-ai-agent-id="YOUR_AGENT_ID"
header-title="Acme Assistant"
intro-text="Hi! Ask me anything about Acme."
></squid-chat-widget-with-fab-button>

YOUR_APP_ID、us-east-1.aws、および YOUR_AGENT_ID を application の値に置き換えます。

認証と設定​

Public agent と private agent​

Agent Studio(Agent Settings で Public agent までスクロール)では、agent を public または private に設定できます。

  • Public agents には誰でもアクセスできます。ウィジェットに auth credential は必要ありません。
  • Private agents では、Squid が呼び出し元を検証できるように auth provider が必要です。

Private agent を保護する​

  1. Squid に auth provider を接続します
  2. squid-auth-provider 属性を介して、auth provider の integrationId とユーザーの auth token を渡します。
Client code
<squid-chat-widget
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-environment-id="prod"
squid-ai-agent-id="YOUR_AGENT_ID"
squid-auth-provider='{"integrationId": "AUTH_INTEGRATION_ID", "token": "AUTH_TOKEN"}'
></squid-chat-widget>
  1. チャットを許可するユーザーを制御するため、backend に @secureAiAgent ルールを追加します。
Backend code
@secureAiAgent('chat')
allowAccessToAgent(): boolean {
return this.isAuthenticated();
}
注記

Public agent は @secureAiAgent ルールを完全にバイパスします。auth credential は引き続き AI function で利用可能なため、public agent 内でも特定の function 呼び出しを制限できます。AI functionsを参照してください。

See more

条件付きチェック、agent スコープのルール、および Agent API Keys については、AI agents と Agent API Keys の保護を参照してください。

認証フローの詳細については、authenticationを参照してください。

フレームワークで custom HTML elements を有効にする​

一部の frontend framework では、custom HTML elements を許可するために追加のセットアップが必要です。

React(src/declarations.d.ts):

Client code
declare namespace JSX {
interface IntrinsicElements {
'squid-chat-widget': any;
'squid-chat-widget-with-fab-button': any;
}
}

Angular(src/app/app.module.ts):

Client code
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';

@NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}

その他の framework については、custom elements を有効にする方法に関する各 framework のドキュメントを参照してください。

コアコンセプト​

接続属性​

これらの属性は、Squid への接続方法と、通信する agent または integration をウィジェットに指定します。

属性型必須説明
squid-app-idstringはい(squid-ai-custom-api-url を使用する場合を除く)Squid application ID
squid-regionstringはい(squid-ai-custom-api-url を使用する場合を除く)application の AWS region(例: us-east-1.aws)
squid-environment-idstringいいえ(デフォルトは prod)dev または prod。agent が存在する環境と一致する必要があります。
squid-developer-idstringいいえDeveloper ID。backend をローカルで実行する場合にのみ必要です。
squid-api-keystringいいえSquid API key。信頼できる場所でのみ使用し、ユーザー向けページでは使用しないでください。
squid-ai-agent-idstringはい(squid-ai-query="true" または squid-ai-custom-api-url を使用する場合を除く)チャットする agent ID
squid-ai-profile-idstringいいえ(非推奨)squid-ai-agent-id の旧名称。非推奨の警告をログに出力します。代わりに squid-ai-agent-id を使用してください。
squid-ai-integration-idstringsquid-ai-query="true" の場合ははいQuery with AI mode でクエリする database integration ID
squid-ai-querybooleanいいえtrue の場合、agent ではなく Query with AI を介して database integration に対してウィジェットを実行します
squid-auth-providerJSONいいえ{ "integrationId": "...", "token": "..." }。private agent に必要です。
squid-ai-custom-api-urlstringいいえSquid を経由せずにチャットリクエストを処理するカスタム HTTP endpoint
squid-ai-custom-api-headersJSONいいえcustom API URL リクエストとともに送信する追加 header

チャット動作属性​

属性型説明
squid-ai-functionsstring有効にする AI function 名のカンマ区切りリスト
squid-ai-functions-jsonJSONオプションの name、context、predefinedParameters を持つ function object の配列
squid-ai-temperaturenumber[0, 1] の temperature。低いほど決定論的になります。
squid-ai-max-tokensnumberLLM response の最大 token 数
squid-ai-override-modelstringagent が使用する model をオーバーライドします(例: gpt-5.5)
squid-ai-context-metadata-filterJSONknowledge base lookup に適用する metadata filter。filtering contextを参照してください。
squid-ai-instructionsstringこのウィジェットインスタンス用に agent の system prompt に追加する Instructions
squid-ai-connected-agentsJSONagent が委譲できる connected agents 用の { agentId, description } 配列
squid-ai-agent-chat-optionsJSON高度な chat options object。Advanced chat optionsを参照してください。
squid-ai-enable-raw-resultsbooleansquid-ai-query="true" 使用時に、raw query result file をリクエストします
squid-ai-enable-code-interpreterbooleansquid-ai-query="true" 使用時に、chart と analysis 用の Python code interpreter を有効にします
disable-historybooleanメッセージ間の conversation memory を無効にします
chain-of-thoughtbooleanagent の reasoning step(tool call、query、function 実行)を表示します
show-status-tagsbooleanchain-of-thought の status update にタグラベルを表示します
observe-statusbooleanbackend からの live status update を監視します
include-referencebooleanagent response に source reference(citation)を表示します
enable-transcriptionbooleanユーザーがプロンプトを音声で入力できるよう、microphone button を表示します
predefined-promptsstringユーザーに表示する候補プロンプト。カンマまたは改行で区切るか、JSON stringified array を使用します。
enable-debug-logsbooleanbrowser console に debug log を出力します

表示とカスタマイズ属性​

属性型説明
header-titlestringチャット header のタイトルテキスト。デフォルトは SquidAI Chat です。
intro-textstringチャットを開いたときにユーザーに最初に表示されるメッセージ
avatar-image-urlstringAI メッセージの横に表示する avatar image の URL
chat-icon-urlstringfloating action button のカスタムアイコン
widget-widthstringCSS width 値(例: 400px)
widget-heightstringCSS height 値(例: 600px)
themestringlight または dark。デフォルトは light です。
rtl-modebooleanArabic や Hebrew などの言語向けに right-to-left layout を有効にします
use-maximize-buttonbooleanmaximize/minimize button を表示します。FAB mode でのみ意味があります。
open-on-loadbooleanページ読み込み時に FAB ウィジェットを自動で開きます
powered-by-textstring"Powered by Squid" footer text をオーバーライドします
menu-items-jsonJSONカスタム menu item を定義する { title, slotName } object の配列。Custom menu itemsを参照してください。
base-stylesheet-urlstringbase CSS file をオーバーライドします。デフォルトは https://widget.squid.cloud/style.css です。
stylesheet-urlstringbase stylesheet の上に読み込まれる追加 CSS file
error-formatterstring or function'generic-error'、'original-error'(デフォルト)、または JS function (error) => string

ローカリゼーション属性​

ウィジェットでは、組み込み UI 文字列を置き換えるための属性セットを公開しています。

属性デフォルト
text-placeholder"Type here and press enter..."
text-thinking"Thinking..."
text-thought-for"Thought for"
text-suggested-prompts"Suggested Prompts"
text-suggested-prompts-description"Explore what this agent can do with a few examples."
text-milliseconds"milliseconds"
text-seconds"seconds"
text-minutes"minutes"

高度な chat options​

squid-ai-agent-chat-options は、agent chat options interface にマッピングされる JSON object を受け取ります。一般的な field は以下のとおりです。

Field説明
agentContextすべての AI function call に渡される object。passing context to AI functionsを参照してください。
instructionsこのウィジェットインスタンス用に agent の system instructions に追加する文字列
contextMetadataFilterForKnowledgeBase使用する knowledge base entry を制限する object。filtering contextを参照してください。
functionsオプションの predefinedParameters および function ごとの context を持つ function descriptor の配列
memoryOptionsConversation memory の設定: memoryId、memoryMode
temperatureSampling temperature
modelこのウィジェットインスタンスが使用する model をオーバーライドします

例:

Client code
<squid-chat-widget
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-ai-agent-id="YOUR_AGENT_ID"
squid-ai-agent-chat-options='{
"agentContext": { "tenantId": "acme" },
"instructions": "Always reply in Spanish.",
"contextMetadataFilterForKnowledgeBase": {
"product-docs": { "version": "v2" }
},
"memoryOptions": { "memoryMode": "read-write", "memoryId": "session-123" }
}'
></squid-chat-widget>

カスタム menu items​

menu-items-json は、チャット header menu の追加 entry を定義します。各 entry には title と slotName があります。子要素の標準 slot= 属性を使用して、各 slot のコンテンツを提供します。

Client code
<squid-chat-widget
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-ai-agent-id="YOUR_AGENT_ID"
menu-items-json='[
{ "title": "Documentation", "slotName": "docs" },
{ "title": "Contact us", "slotName": "contact" }
]'
>
<div slot="docs">
<h3>Documentation</h3>
<p>Read our docs at <a href="https://docs.example.com">docs.example.com</a>.</p>
</div>
<div slot="contact">
<h3>Contact us</h3>
<p>Email <a href="mailto:hello@example.com">hello@example.com</a></p>
</div>
</squid-chat-widget>

CSS variables​

ウィジェットは Shadow DOM 内にレンダリングされます。host element に CSS custom properties を設定して外観をオーバーライドします。各 variable はウィジェットのデフォルト theme にフォールバックします。

Variable制御対象
--squid-widget-header-background-colorHeader background
--squid-widget-header-title-colorHeader title text color
--squid-widget-header-menu-button-background-colorMenu button background
--squid-widget-header-menu-button-icon-urlMenu button icon image URL
--squid-widget-header-menu-item-colorMenu item text color
--squid-widget-header-menu-item-hover-background-colorMenu item hover background
--squid-widget-menu-item-back-icon-urlsub-menu の back button icon
--squid-widget-body-background-colorChat body background
--squid-widget-ai-message-background-colorAI message bubble background
--squid-widget-ai-message-text-colorAI message text color
--squid-widget-user-message-background-colorUser message bubble background
--squid-widget-user-message-colorUser message text color
--squid-widget-textarea-background-colorInput textarea background
--squid-widget-textarea-border-colorInput textarea border
--squid-widget-textarea-text-colorInput textarea text color
--squid-widget-textarea-submit-image-urlSubmit button icon image URL
--squid-widget-inline-code-background-colorInline code block background
--squid-widget-inline-code-border-colorInline code block border
--squid-widget-link-colorHyperlink color
--squid-widget-powered-by-color"Powered by" footer text color
--squid-widget-fab-background-colorFAB button background
--squid-widget-fab-image-urlFAB button icon(closed state)
--squid-widget-fab-close-image-urlFAB button icon(open state)

インライン style を使用した例:

Client code
<squid-chat-widget
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-ai-agent-id="YOUR_AGENT_ID"
style="
--squid-widget-header-background-color: #1a73e8;
--squid-widget-ai-message-background-color: #e8f0fe;
--squid-widget-user-message-background-color: #1a73e8;
--squid-widget-user-message-color: #ffffff;
"
></squid-chat-widget>

class 属性を使用して、独自の external stylesheet rule を適用することもできます。

event をリッスンする​

チャット履歴または status update が変更されるたびに、ウィジェットは change CustomEvent を dispatch します。2 種類の payload shape がサポートされています。

Client code
const widget = document.querySelector('squid-chat-widget')!;

widget.addEventListener('change', (event: CustomEvent) => {
if (event.detail.type === 'history') {
// event.detail.history is an array of ChatMessage objects
console.log('History updated:', event.detail.history);
} else if (event.detail.type === 'status') {
// event.detail.status is an array of AiStatusMessage objects
console.log('Status updated:', event.detail.status);
}
});

React では、代わりに onChange callback prop を渡します。

Client code
<SquidChatWidgetWithFabButtonEntryPoint
squidAppId="YOUR_APP_ID"
squidRegion="us-east-1.aws"
squidAiAgentId="YOUR_AGENT_ID"
onChange={(event) => {
console.log(event.detail);
}}
/>

コード例​

AI function の parameter をオーバーライドする​

特定の parameter を固定し、AI が選択しないようにするには、squid-ai-functions-json を介して predefinedParameters を使用します。対応する backend pattern については、overriding parameter valuesを参照してください。

Client code
<squid-chat-widget
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-ai-agent-id="YOUR_AGENT_ID"
squid-ai-functions-json='[
{ "name": "saveSection", "predefinedParameters": { "sectionId": "introduction" } }
]'
></squid-chat-widget>

agent context を backend function に渡す​

squid-ai-agent-chat-options の agentContext field を使用して、すべての AI function call が backend で読み取れる値を添付します。対応する backend pattern は、passing context to AI functionsに記載されています。

Client code
<squid-chat-widget
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-ai-agent-id="YOUR_AGENT_ID"
squid-ai-agent-chat-options='{
"agentContext": { "documentId": "doc-42" },
"functions": [
{ "name": "saveSection", "context": { "codenameList": ["LITANIA", "LEOPARD"] } }
]
}'
></squid-chat-widget>

Query with AI を使用して database とチャットする​

squid-ai-query="true" を設定し、agent ID の代わりに database integration ID を指定します。基盤となる機能については、Query with AIを参照してください。

Client code
<squid-chat-widget
squid-app-id="YOUR_APP_ID"
squid-region="us-east-1.aws"
squid-ai-query="true"
squid-ai-integration-id="postgres"
squid-ai-enable-code-interpreter="true"
predefined-prompts='[
"How many users signed up last week?",
"Show me a chart of orders per region.",
"Which products had no sales this month?"
]'
></squid-chat-widget>

カスタム backend webhook​

squid-ai-custom-api-url を使用して、独自の backend 経由でチャットをルーティングします。ウィジェットはその URL に prompt を POST し、response は自身で処理します。

Client code
<squid-chat-widget
squid-ai-custom-api-url="https://YOUR_APP-prod.us-east-1.aws.squid.cloud/webhooks/chat?projectId=YOUR_PROJECT_ID"
></squid-chat-widget>
Backend code
import { webhook, SquidService, WebhookRequest } from '@squidcloud/backend';

interface ChatRequest {
prompt: string;
}

interface ChatResponse {
response: string;
}

export class ChatService extends SquidService {
@webhook('chat')
async chat(request: WebhookRequest<ChatRequest>): Promise<ChatResponse> {
const userPrompt = request.body.prompt;
const projectId = request.queryParams['projectId'];

// Custom logic to handle the user prompt and project ID.
return { response: `Echo: ${userPrompt}` };
}
}

JavaScript でのプログラムによる作成​

Client code
const widget = document.createElement('squid-chat-widget');
widget.setAttribute('squid-app-id', 'YOUR_APP_ID');
widget.setAttribute('squid-region', 'us-east-1.aws');
widget.setAttribute('squid-ai-agent-id', 'YOUR_AGENT_ID');
widget.setAttribute('header-title', 'Acme Assistant');
widget.setAttribute('squid-ai-agent-chat-options', JSON.stringify({ memoryOptions: { memoryMode: 'read-write', memoryId: 'session-1' } }));

// Function-typed props are set as DOM properties, not attributes.
(widget as any)['error-formatter'] = (error: unknown) => `Something went wrong: ${error}`;

document.body.appendChild(widget);

エラー処理​

一般的なエラー​

エラー原因解決策
squid-app-id must be specifiedsquid-app-id 属性がないsquid-app-id を追加します(または squid-ai-custom-api-url を使用します)
squid-region must be specifiedsquid-region 属性がないsquid-region を追加します
squid-ai-agent-id must be specified or squid-ai-query must be trueagent ID がなく、query mode でもないsquid-ai-agent-id を追加するか、squid-ai-query="true" と squid-ai-integration-id を設定します
squid-ai-integration-id must be specified when using squid-ai-queryintegration ID を指定せずに squid-ai-query="true" を使用しているsquid-ai-integration-id を追加します
squid-ai-profile-id is deprecated, use squid-ai-agent-id insteadlegacy 属性名を使用しているsquid-ai-agent-id に名前を変更します
backend からの UNAUTHORIZEDprivate agent、auth provider 未設定、または @secureAiAgent による拒否squid-auth-provider を設定し、@secureAiAgent ルールを確認します
Custom HTML element が認識されないframework で custom element の登録が必要フレームワークで custom HTML elements を有効にするを参照してください

問題を診断する間は、enable-debug-logs="true" を使用して browser console に追加情報を出力します。

エラー表示をカスタマイズする​

error-formatter を使用して、ユーザーへのエラー表示方法を制御します。組み込み値は 'generic-error'(単一の共通メッセージ)と 'original-error'(実際のエラーメッセージ、デフォルト)です。function を渡すこともできます。

Client code
const widget = document.querySelector('squid-chat-widget')!;
(widget as any)['error-formatter'] = (error: unknown) => {
if (error instanceof Error) return error.message;
return 'Something went wrong. Please try again.';
};

ベストプラクティス​

  1. squid-app-id と squid-region は HTML に保持し、API key は絶対に置かないでください。 チャットウィジェットは browser 上で実行されます。squid-api-key に設定したものは、ページを閲覧するすべての人に見えてしまいます。private agent では、代わりに squid-auth-provider と @secureAiAgent を使用してください。
  2. squid-ai-profile-id ではなく squid-ai-agent-id を使用してください。 前者は非推奨であり、警告をログに出力します。
  3. squid-environment-id を agent の環境と一致させてください。 dev で作成した agent は prod では表示されず、その逆も同様です。
  4. agent が public であっても、backend に**security rulesを適用してください**。Public agent は @secureAiAgent をスキップしますが、@secureAiQuery と AI function の auth check は引き続き実行されます。
  5. 開発中は chain-of-thought="true" を設定して、agent が何をしているかを正確に確認してください。エンドユーザー向けにはオフにするか、show-status-tags="false" を指定したままオンにしておきます。
  6. 複数のウィジェットインスタンスを同期させるため、CSS override は style= でインライン化するのではなく、独自の stylesheet にキャッシュしてください。
  7. ウィジェット外部に conversation history を永続化したい場合や、product analytics に渡したい場合は、change event をリッスンしてください。

関連項目​