Task Interface

1つのエンドポイント。自然な言葉。あとはすべてエージェントが処理します。


何が変わるのか

従来のインテグレーションでは、エンドポイントを学び、フィールドをマッピングし、スキーマをバージョン管理し、あらゆるエッジケースに対処する必要がありました。チャットエージェントゲートウェイはそのすべてをエージェント型コミュニケーションに置き換えます。必要なことを説明してください。SOIS 自身のエージェントが意図を解釈し、詳細を調整し、ワークスペース全体で実行し、結果を返信します。これは、自前の AI を持たない呼び出し元のための入り口です。すでにエージェントをお持ちの場合は、代わりに MCP サーバー経由で直接接続してください。

コネクターも、ミドルウェアも、サードパーティの自動化レイヤーも不要です。


認証

すべてのメッセージには2つの認証情報が必要です。

ヘッダー 役割
Authorization Bearer <token> あなたが誰であるかを証明します
X-Api-Key sois_... 予算、Webhook、署名を制御します

なぜ2つなのか。 トークンは身元を証明し、キーは支出を制御します。どちらか一方だけが漏えいしても、もう一方がなければ役に立ちません。1人のユーザーが、インテグレーションごとに異なる予算を持つ複数のキーを保有できます。

両方とも Sois AI ワークスペースの Settings から取得します。


メッセージを送信する

POST /api/agent

Headers

Authorization: Bearer <your_token>
X-Api-Key: sois_...
Content-Type: application/json

Body

フィールド 必須 説明
message string はい 必要なことをエージェントに伝えます。自然な言葉で、最大10,000文字
context.entity_type string いいえ ヒント。contacttaskdocumentinbox など
context.entity_id string いいえ 操作対象となる特定のレコード
context.action string いいえ ヒント。createupdatesearchsummarize
metadata object いいえ エージェント向けの任意のキーと値の追加データ

curl -X POST "https://your-workspace.sois.ai/api/agent" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "X-Api-Key: sois_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Create a contact for John Smith at Acme Corp, [email protected], +44 7700 900000",
    "context": { "entity_type": "contact", "action": "create" }
  }'

レスポンス 202 Accepted

{
    "conversation_uuid": "6cafd8ba-dd51-4411-808e-671d1dd59561",
    "status": "accepted",
    "message": "Your request has been queued."
}

メッセージはゲートウェイに入りました。ここから先はエージェントが引き受けます。


返信を受け取る

選択肢は2つです。Webhook を待つ か、会話をポーリングする かです。

オプション1: Webhook(推奨)

キーに response_url がある場合、完了するとエージェントが結果を直接配信します。署名済みで、検証済みで、ポーリングは不要です。

POST https://your-app.com/webhook
Content-Type: application/json
X-Signature: <hmac_sha256>
X-Conversation-UUID: 6cafd8ba-...

Resolved:

{
    "conversation_uuid": "6cafd8ba-...",
    "status": "resolved",
    "response": "Contact created: John Smith, Acme Corp, [email protected], +44 7700 900000."
}

Failed:

{
    "conversation_uuid": "6cafd8ba-...",
    "status": "failed",
    "error": "An error occurred while processing your request."
}

オプション2: 会話をポーリングする

GET /api/agent/{conversation_uuid}
Authorization: Bearer <your_token>
X-Api-Key: sois_...

レスポンス 200 OK:

{
    "conversation_uuid": "6cafd8ba-...",
    "status": "resolved",
    "turns": [
        {
            "role": "user",
            "payload": { "message": "Find all contacts from London" },
            "timestamp": "2026-02-12T01:07:03+00:00"
        },
        {
            "role": "agent",
            "payload": {
                "content": "I found 12 contacts based in London..."
            },
            "timestamp": "2026-02-12T01:07:13+00:00"
        }
    ],
    "webhook": {
        "status": "delivered",
        "delivered_at": "2026-02-12T01:07:14+00:00"
    },
    "resolved_at": "2026-02-12T01:07:13+00:00",
    "expires_at": "2026-02-13T01:07:03+00:00",
    "created_at": "2026-02-12T01:07:03+00:00"
}

会話のステータス

ステータス 状態
open ゲートウェイ内。エージェントを待っています
processing エージェントが処理中です
resolved 完了。返信は最後の turn にあります
failed 再試行後も完了できませんでした

Webhook 署名の検証

すべての Webhook は、キーの signing secret を使って HMAC-SHA256 で署名されます。処理の前に必ず検証してください。

Python:

import hmac, hashlib

expected = hmac.new(
    key=your_signing_secret.encode(),
    msg=raw_request_body.encode(),
    digestmod=hashlib.sha256
).hexdigest()

assert expected == request.headers['X-Signature']

Node.js:

const crypto = require('crypto');
const expected = crypto
    .createHmac('sha256', signingSecret)
    .update(rawBody)
    .digest('hex');

if (expected !== req.headers['x-signature']) {
    throw new Error('Invalid signature');
}

PHP:

$expected = hash_hmac('sha256', $rawBody, $signingSecret);
if (!hash_equals($expected, $request->header('X-Signature'))) {
    abort(403, 'Invalid signature');
}

会話の例

エージェントは Sois AI ワークスペースに完全にアクセスできます。たとえば次のようなことを頼めます。

検索:

{ "message": "Find all contacts from London" }

作成:

{
    "message": "Create a contact: Jane Doe, CEO of Acme Corp, [email protected]",
    "context": { "entity_type": "contact", "action": "create" }
}

メール:

{
    "message": "Send an email to [email protected] introducing our new product line",
    "context": { "entity_type": "inbox", "action": "compose" }
}

タスク:

{
    "message": "Create a task: Research competitor pricing for Q1 2026",
    "context": { "entity_type": "task", "action": "create" }
}

要約:

{
    "message": "Give me a full summary of this contact",
    "context": { "entity_type": "contact", "entity_id": "abc-123", "action": "summarize" }
}

複数ステップ:

{ "message": "Find the Q1 report, summarise it, and email the summary to the sales team" }

エージェントは曖昧さを調整します。動作する前に検索が必要なら検索します。複数のレコードが一致する場合は、最適なものを選び、その理由を伝えます。厳格なスキーマはなく、あるのは意図だけです。


キーの管理

キーは Sois AI ワークスペースの Settings > API Keys から、またはプログラムから管理します。

キーを作成する

POST /api/api-keys
{
    "label": "My CRM Integration",
    "response_url": "https://your-app.com/webhook",
    "budget_usd_cents": 5000,
    "budget_period": "monthly"
}

レスポンスには、キー(1回だけ 表示されるので、すぐにコピーしてください)と、Webhook 検証用の signing secret が含まれます。

フィールド 必須 説明
label string いいえ このキーの名前
response_url url いいえ Webhook の返信を配信する先
budget_usd_cents integer いいえ 米ドルセント単位の上限額
budget_period string いいえ dailymonthlytotal

キーを管理する

メソッド エンドポイント 説明
GET /api/api-keys すべてのキーを一覧表示
POST /api/api-keys 新しいキーを作成
GET /api/api-keys/{id} キーの詳細と使用統計
PUT /api/api-keys/{id} ラベル、Webhook URL、予算を更新
DELETE /api/api-keys/{id} キーを失効

予算の制御

従来のインテグレーションは、恣意的なレート制限であなたを抑制しました。毎分100リクエスト、1日10,000件などです。チャットエージェントゲートウェイはドルを使います。

キーごとに予算を設定します。エージェントはアクションごとに credit を請求します。各インテグレーションの価値はあなたが決めます。

フィールド 説明
budget_usd_cents 米ドルセント単位の上限(例: 5000 = 50 $)。null = 無制限。
budget_period daily は深夜にリセット、monthly は1日にリセット、total はリセットなし

予算を超過すると、メッセージは 429 を、難解なエラーコードではなく明確な説明とともに返します。


エラー

すべてのエラーは同じ形式に従います。

{
    "error": {
        "code": "ERROR_CODE",
        "message": "A clear, human-readable explanation."
    }
}
HTTP コード 発生した事象
401 UNAUTHENTICATED アクセストークンが欠落、または無効
401 INVALID_API_KEY キーが欠落、または無効
403 KEY_OWNER_MISMATCH キーがあなたのものではありません
403 KEY_REVOKED このキーは失効しています
404 NOT_FOUND 会話が見つからない、または期限切れ
422 - 検証エラー(メッセージを確認してください)
429 BUDGET_EXCEEDED 予算を使い切りました。チャージするか、リセットを待ってください

制限

項目 制限
メッセージの長さ 10,000文字
会話の有効期限 24時間
予算 キーごと、あなたが決めます