API を呼び出す
キーを Vault に置いたまま、認証付きの API を呼び出します。
API クライアントは Function として書くのに向いています。チームが GitHub や請求システム、自社のバックエンドに対して行う呼び出しを、一度コードに書いておけばそのまま使えます。ただし API クライアントにはキーが必要です。そしてキーは、コードにも、Agent のコンテキストにも、モデルが口にしうるどこにも置いてはいけません。
Subako では、Function はキーをいっさい持ちません。キーは、API の Origin 用の HTTP header として Vault に保管します。Function がその Origin にリクエストを送ると、Subako が外に出ていくリクエストに Header を付けます。Function のコードも、モデルも、Session のファイルも、Header を目にすることはありません。
このページでは、サンプルの Package github を使って、GitHub 向けにこの設定を行います。リポジトリについての質問に読み取り専用で答える Package で、プライベートリポジトリにはトークンを使います。
1. トークンを Vault に保管する
まず GitHub の personal access token を作成します。コードについての質問に答えるだけなら、Contents の読み取り権限だけを持つ fine-grained token で十分です。次に、コンソールで Vault を開いて Credential を追加 を選び、HTTP header を選んで次のように入力します。
- Origin:
https://api.github.com。Scheme、Host、Port だけを指定し、それ以外は含めません。 - Header authorization に、値
Bearer <your token>を設定します。

追加した値は、コンソールでもほかのどこでも、二度と表示されません。
2. Origin を指定して Package を付与する
Package をアップロードし (手順は クイックスタート を参照)、Agent のバージョンの編集画面で付与します。トークンを使って GitHub に接続するには、次の 2 つを設定します。
- ネットワーク: 許可した Host のみ を選び、
api.github.comとcodeload.github.comを指定します。codeload.github.comは、GitHub がダウンロードをリダイレクトする先です。 - Credential: Origin
https://api.github.comを指定します。

Agent config では、同じ Grant を次のように書きます。
{
"name": "github",
"source": { "type": "workspace", "function_id": "<function-id>", "version": { "type": "latest" } },
"default_policy": "allow",
"network": { "type": "allowlist", "hosts": ["api.github.com", "codeload.github.com"] },
"http_credentials": ["https://api.github.com"]
}
3. Vault を指定して Session を開始する
Credential は、Session の開始時に指定した Vault から取り出されます。Vault は、コンソールでは 新しい Session の Vault で、API では vault_ids で指定します。そのため、同じ Agent のバージョンを、ある Session ではある顧客のトークンで、次の Session では別の顧客のトークンで実行できます。
コードはキーを送らない
Function の中では、authorization Header のない普通のリクエストを送るだけです。
use subako_function_sdk::http::{self, Request};
let response = http::request(&Request::get("https://api.github.com/repos/subako-ai/subako-function-examples"))?;const response = await fetch("https://api.github.com/repos/subako-ai/subako-function-examples");resp, err := http.Get("https://api.github.com/repos/subako-ai/subako-function-examples")Subako はリクエストを Grant のネットワーク設定と照合し、Session にある https://api.github.com 用の Credential を見つけて、その Header を付けて送ります。その Origin の Credential がなければ、リクエストはそのまま送られます。そのため Package「github」は、トークンがなくても公開リポジトリについての質問には答えられます。ただし、匿名のリクエストに適用される GitHub の低いレート制限の範囲内です。
知っておきたいルール
- 1 つの Credential が適用されるのは 1 つの Origin だけで、さらに Grant がその Origin を指定しているリクエストに限られます。ほかの Host へのリクエストには何も付きません。
- 別の Origin にリダイレクトされると、
authorizationHeader と Cookie の Header は外されます。トークンがリダイレクトをたどって API の外に漏れることはありません。 - Function が Credential の Header のどれかを自分で設定すると、リクエストは拒否されます。どちらかの値が黙って優先されることはありません。
- 1 つの Vault に保管できる Credential は、Origin ごとに 1 つです。Session の複数の Vault に同じ Origin の Credential がある場合、Subako はどれを使うかを推測せず、その Origin へのリクエストは失敗します。
- リクエストは
httpsでのみ、公開アドレスにのみ送られます。
Function を書かずに API を呼び出す
Platform package の http も同じルールに従います。ネットワークと Credential を設定して付与すれば、Agent が自分で API へのリクエストを組み立てられます。その場合もキーはモデルには見えず、Subako が付けます。ただ、呼び出す内容が決まっているなら、自分の Package を書くほうが適しています。入力を検証し、回答を整え、大きなレスポンスを Session Volume に置いておけるからです。