関数呼び出しスキーマ生成

モデルに道具を渡すには、引数をJSON Schemaで書く必要があります。手で書くと必須の項目を落としたり、入れ子のオブジェクトに型を書き忘れたりしがちで、その誤りはモデルが違う引数を渡してきて初めて分かります。欲しい引数の例を書けば、そこからスキーマを導きます。

{
  "name": "get_weather",
  "description": "都市の天気を取得します",
  "input_schema": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": ""
      },
      "days": {
        "type": "integer",
        "description": ""
      },
      "unit": {
        "type": "string",
        "description": ""
      }
    },
    "required": [
      "city",
      "days",
      "unit"
    ],
    "description": ""
  }
}

見本にあるものはすべて必須として印を付けます — 消すほうが足すより楽だからです。説明は空けてありますのでご自身で埋めてください。見本に無い任意の引数は拾えません。

例のJSONが骨組みになります

一番外側は波括弧で包んだオブジェクトでなければなりません — 配列や値一つは受け付けません。キー一つがプロパティ一つになり、値の形が type になります。小数点の無い数は integer、あれば number です。オブジェクトは中まで降りて自分の required を持ち、配列は最初の要素の形を items にします。null は ["null", "string"] になります。

三つのタブが出すもの

Anthropic は name・description・input_schema、OpenAI は type: "function" の下の function に name・description・parameters を入れた形です。「スキーマのみ」は包んでいない JSON Schema そのものです。名前の欄を空にすると my_tool になり、説明の欄の一文は三つのタブに同じように入ります。

標本から推測することの限界

例から読めるのは名前と type だけです。"unit": "celsius" を入れても enum にはならず、範囲や format も付きません。配列に種類が混ざっていれば最初の要素だけを見て、空の配列は string のままにします。

ブラウザの中で読みます

JSON は JSON.parse で読むので、末尾のカンマやコメントがあれば、パーサーの言葉をそのまま表示します。入れた例はサーバーへ行きません。

よくある質問

OpenAIとAnthropicで何が違うのですか

包み方だけです。OpenAIは定義を type と function の下に入れて parameters と呼び、Anthropicは階層が一つ少なく input_schema と呼びます。中のJSON Schemaは同じなので、両方まとめて出しています。

descriptionが空なのはなぜですか

人が書くべきものだからです。その一文をもとにモデルはいつこの道具を呼ぶかを決めるので、空のままだと呼ばれません。自動で作れば、もっともらしく的外れなものが出てきて、そのほうが厄介です。

任意の引数はどう扱われますか

例にあるものはすべて必須から始めます — 消すほうが、抜けに気づくより簡単だからです。例に無い引数はそもそも拾えないので、手で足してください。

3.0 を入れたのに integer になります

JSON には整数と実数の区別が無く、3.0 は読んだ瞬間に 3 になります。number にしたければ 3.5 のように 0 でない小数を書いてください。

値がまだ分からない引数はどう書けばいいですか

せめて形の合う値を入れてください。空の配列は items が string になるので、数の配列なら [1] のように一つでも入れれば items が integer になります。

貼り付けたものはサーバへ送られますか

送られません。すべてブラウザの中で動き、送信も保存もしません。だからこそ、ふつうならウェブページに貼り付けない社内の設定ファイルや本番のクエリにも使えます。通信を切ったままでも動きます。