関連ドキュメント

Perxona CallFunc デモ — API リファレンス

ベース URL(ローカル): http://localhost:8090 ベース URL(公開): ご利用の Cloudflare トンネル。例: https://<random>.trycloudflare.com

読みやすい HTML レイアウト 対象読者:リファレンス用のスキーマとペイロード
青いブロック console で行う具体的な操作。
オレンジのブロック よくある落とし穴・制限・注意点。
緑のブロック 正しく動いているか確かめるチェック。
紫のブロック AI ツールに渡せるプロンプト断片。

認証: すべての関数エンドポイントはヘッダー X-API-Key: <your key>.env に設定した値)を必要とします。 /health/docs/redoc/openapi.json は公開されています(キー不要)。

インタラクティブなドキュメントは FastAPI によって自動生成されます。

URL 内容
/docs Swagger UI(その場で試せる)
/redoc ReDoc リファレンス
/openapi.json 機械可読な OpenAPI 3.1 スペック

1. get_schedule — カンファレンスのセッション一覧

GET /get_schedule?day=&track=&speaker=

クエリパラメータ(すべて省略可能):

名前 説明
day string 日付ラベル "Day 1" / "Day 2"、または ISO 日付 "2026-06-24" / "2026-06-25"
track string トラックの部分文字列。例: "Leadership""Performance""Workshop"
speaker string 登壇者名の部分文字列。例: "Ohtani" または "Kumamon"

JSON スキーマ — クエリパラメータ(Perxona CallFunc › query params に貼り付けてください):

{
  "type": "object",
  "properties": {
    "day":     { "type": "string", "description": "Day label ('Day 1') or ISO date ('2026-06-24')." },
    "track":   { "type": "string", "description": "Track substring, e.g. 'Performance' or 'Workshop'." },
    "speaker": { "type": "string", "description": "Speaker name substring, e.g. 'Ohtani'." }
  }
}

curl -s "$BASE/get_schedule?day=Day%201&track=Performance" -H "X-API-Key: $KEY"
{
  "count": 1,
  "sessions": [
    { "id": "s2", "title": "Full-Stack Athlete: How to Pitch AND Hit in the Same Sprint", "speaker": "Shohei Ohtani",
      "track": "Performance", "room": "Room A", "day": "Day 1", "date": "2026-06-24",
      "start": "2026-06-24T11:00", "end": "2026-06-24T11:45" }
  ]
}

出力スキーマ(Perxona CallFunc › Output data に貼り付けてください):

フィールド 説明
count integer 返却されたセッション数。
sessions array of objects 一致したセッション。各項目は以下のフィールドを持ちます。
sessions[].id string セッション id。
sessions[].title string セッションのタイトル。
sessions[].speaker string 登壇者名。
sessions[].track string トラック。例: "Performance"
sessions[].room string 部屋名。
sessions[].day string 日付ラベル。例: "Day 1"
sessions[].date string ISO 日付 YYYY-MM-DD
sessions[].start string ローカルの開始日時。ISO 8601(オフセットなし)。
sessions[].end string ローカルの終了日時。ISO 8601(オフセットなし)。
{
  "type": "object",
  "properties": {
    "count": { "type": "integer", "description": "Number of sessions returned." },
    "sessions": {
      "type": "array",
      "description": "Matching sessions.",
      "items": {
        "type": "object",
        "properties": {
          "id":      { "type": "string", "description": "Session id." },
          "title":   { "type": "string", "description": "Session title." },
          "speaker": { "type": "string", "description": "Speaker name." },
          "track":   { "type": "string", "description": "Track, e.g. 'Performance'." },
          "room":    { "type": "string", "description": "Room name." },
          "day":     { "type": "string", "description": "Day label, e.g. 'Day 1'." },
          "date":    { "type": "string", "description": "ISO date YYYY-MM-DD." },
          "start":   { "type": "string", "description": "Local start datetime, ISO 8601 (no offset)." },
          "end":     { "type": "string", "description": "Local end datetime, ISO 8601 (no offset)." }
        }
      }
    }
  }
}

2. get_speaker — 登壇者の検索

GET /get_speaker?name=&id=

クエリパラメータ(どちらも省略可能。両方省略すると全員を一覧表示):

名前 説明
name string 登壇者名の部分文字列(大文字・小文字を区別しません)。
id string 登壇者 id の完全一致。例: "spk_ohtani"

JSON スキーマ — クエリパラメータ:

{
  "type": "object",
  "properties": {
    "name": { "type": "string", "description": "Speaker name to search for (substring)." },
    "id":   { "type": "string", "description": "Exact speaker id, e.g. 'spk_ohtani'." }
  }
}

curl -s "$BASE/get_speaker?name=ohtani" -H "X-API-Key: $KEY"
{
  "count": 1,
  "speakers": [
    { "id": "spk_ohtani", "name": "Shohei Ohtani", "title": "Two-Way Player — Pitcher & Designated Hitter",
      "company": "Los Angeles Dodgers", "bio": "The only engineer who is both the frontend AND the backend. Throws it at 100 mph, then hits it back even harder. Swears his real secret weapon is sleeping 10 hours a night — he calls it his cache layer.",
      "topics": ["peak performance", "two-way ops", "discipline"],
      "sessions": ["Full-Stack Athlete: How to Pitch AND Hit in the Same Sprint", "Batting Practice for Builders: Swinging at Every Pitch Life Throws"] }
  ]
}

出力スキーマ(Perxona CallFunc › Output data に貼り付けてください):

フィールド 説明
count integer 返却された登壇者数。
speakers array of objects 一致した登壇者。各項目は以下のフィールドを持ちます。
speakers[].id string 登壇者 id。例: "spk_ohtani"
speakers[].name string フルネーム。
speakers[].title string 役職。
speakers[].company string 会社・組織。
speakers[].bio string 略歴。
speakers[].topics array of strings その登壇者が扱うトピック。
speakers[].sessions array of strings その登壇者が担当するセッションのタイトル。
{
  "type": "object",
  "properties": {
    "count": { "type": "integer", "description": "Number of speakers returned." },
    "speakers": {
      "type": "array",
      "description": "Matching speakers.",
      "items": {
        "type": "object",
        "properties": {
          "id":       { "type": "string", "description": "Speaker id, e.g. 'spk_ohtani'." },
          "name":     { "type": "string", "description": "Full name." },
          "title":    { "type": "string", "description": "Job title." },
          "company":  { "type": "string", "description": "Company / organization." },
          "bio":      { "type": "string", "description": "Short biography." },
          "topics":   { "type": "array", "items": { "type": "string" }, "description": "Topics the speaker covers." },
          "sessions": { "type": "array", "items": { "type": "string" }, "description": "Titles of sessions this speaker presents." }
        }
      }
    }
  }
}

3. book_meeting — 登壇者との 1:1 を予約する(→ Google Calendar)

POST /book_meeting
Content-Type: application/json

ボディ

フィールド 必須 説明
attendee_name string ミーティングをリクエストする人。
speaker string 会う登壇者(get_speaker を参照)。例: "Shohei Ohtani" または "Tanjiro Kamado"
date string YYYY-MM-DD。デモのカンファレンスでは通常 2026-06-24 または 2026-06-25
start_time string HH:MM(24時間表記)。サーバーのタイムゾーンで解釈されます。
duration_minutes integer 5〜240、デフォルトは 30。
attendee_email string イベントの説明に追加されます。
topic string ミーティングのトピック。

JSON スキーマ — ペイロード(Perxona CallFunc › payload に貼り付けてください):

{
  "type": "object",
  "required": ["attendee_name", "speaker", "date", "start_time"],
  "properties": {
    "attendee_name":    { "type": "string", "description": "Name of the person requesting the meeting." },
    "speaker":          { "type": "string", "description": "Name of the speaker to meet, e.g. 'Shohei Ohtani'." },
    "date":             { "type": "string", "description": "Meeting date, YYYY-MM-DD (for the demo, usually 2026-06-24 or 2026-06-25)." },
    "start_time":       { "type": "string", "description": "Local start time, 24h HH:MM." },
    "duration_minutes": { "type": "integer", "minimum": 5, "maximum": 240, "default": 30 },
    "attendee_email":   { "type": "string", "description": "Optional attendee email." },
    "topic":            { "type": "string", "description": "Optional meeting topic." }
  }
}

curl -s -X POST "$BASE/book_meeting" \
  -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"attendee_name":"Sam Patel","speaker":"Shohei Ohtani","date":"2026-06-24","start_time":"16:00","duration_minutes":30,"topic":"Peak performance Q&A"}'
{
  "booking_id": "bk-1a2b3c4d5e",
  "status": "confirmed",
  "mode": "google_calendar",
  "summary": "1:1: Sam Patel ↔ Shohei Ohtani — Peak performance Q&A",
  "speaker": "Shohei Ohtani",
  "start": "2026-06-24T16:00:00+08:00",
  "end": "2026-06-24T16:30:00+08:00",
  "timezone": "Asia/Taipei",
  "event_link": "https://www.google.com/calendar/event?eid=…",
  "message": "Meeting confirmed and added to the calendar for 2026-06-24 16:00."
}

出力スキーマ(Perxona CallFunc › Output data に貼り付けてください):

フィールド 説明
booking_id string 一意の予約 id。例: "bk-1a2b3c4d5e"
status string 成功時は常に "confirmed"
mode string 実際のカレンダーに書き込まれた場合は "google_calendar"、それ以外は "mock"
summary string イベントのタイトル。
speaker string 解決された登壇者名。
start string イベント開始。タイムゾーンオフセット付きの ISO 8601。
end string イベント終了。タイムゾーンオフセット付きの ISO 8601。
timezone string IANA タイムゾーン。例: "Asia/Taipei"
event_link string | null Google Calendar のイベント URL(モックモードでは null)。
message string 人間が読める確認メッセージ。
{
  "type": "object",
  "properties": {
    "booking_id": { "type": "string", "description": "Unique booking id, e.g. 'bk-1a2b3c4d5e'." },
    "status":     { "type": "string", "description": "Always 'confirmed' on success." },
    "mode":       { "type": "string", "description": "'google_calendar' if written to a real calendar, else 'mock'." },
    "summary":    { "type": "string", "description": "Event title." },
    "speaker":    { "type": "string", "description": "Resolved speaker name." },
    "start":      { "type": "string", "description": "Event start, ISO 8601 with timezone offset." },
    "end":        { "type": "string", "description": "Event end, ISO 8601 with timezone offset." },
    "timezone":   { "type": "string", "description": "IANA timezone, e.g. 'Asia/Taipei'." },
    "event_link": { "type": ["string", "null"], "description": "Google Calendar event URL (null in mock mode)." },
    "message":    { "type": "string", "description": "Human-readable confirmation message." }
  }
}

エラー

ステータス 発生条件
401 X-API-Key が欠落または無効。
422 date/start_time の形式が不正、または必須のボディフィールドが欠落。
502 Google は設定済みだが、Calendar への挿入に失敗(詳細を含む)。