---
title: Subako Functions
description: 自分で書いた Tool を、Subako が WebAssembly で実行します。
sidebar:
  label: 概要
---

Agent がどれだけ役に立つかは、何にアクセスできるかで決まります。既存のシステムには MCP サーバーでつなげますが、**Subako Functions** は、まだどこにもない Tool を用意するためのものです。たとえば、このファイルを解析する、あのスプレッドシートを作る、チームと同じ手順で請求 API を呼び出す、注文を自社のルールで検証する、といった Tool です。

**Function package** は、WebAssembly Module と短い Manifest からなります。Workspace にアップロードして Agent のバージョンに付与すれば、Module が提供する Tool はすべて Agent から呼び出せるようになります。Subako は呼び出しのたびに、Session のそばにある専用の Sandbox でそれを実行します。Session のファイルはすぐ手の届くところにあり、ネットワークには許可した範囲でしか接続できません。

![Session の会話: アップロードされた四半期レビューについて質問され、Agent が Function「anydoc」の convert_to_markdown を呼び出し、ドキュメントをもとに回答しています](/blume-assets/content/docs/_images/ja/session-function-calls.webp)

## Function を使う理由

- **サーバーの運用が不要。** デプロイもスケールも保守も要りません。Subako が呼び出しのたびに Module を起動し、終われば停止します。
- **好きな言語で書ける。** [Rust](/ja/functions/rust)、[TypeScript](/ja/functions/typescript)、[Go](/ja/functions/go) の SDK を使えば、普通の関数がそのまま Tool になり、入力 Schema も型から生成されます。ほかの言語でも、WASI preview 1 向けにビルドできれば [ABI](/ja/functions/abi) を直接使えます。
- **デフォルトで隔離。** Grant でネットワークを与えない限り、呼び出しはネットワークを使えません。与えた場合も、接続できるのは許可した公開 `https` Host だけです。Credential は外向きのリクエストに Session の [Vault](/ja/console/vaults) から付与されるので、Module の目に触れることはありません。
- **データをコンテキストに載せない。** Function は Session の [Session Volume](/ja/functions/runtime#session-volume) にあるファイルを直接扱うので、大きなドキュメントやエクスポートをモデルに通す必要がありません。詳しくは次の節で説明します。
- **独自のファイルを同梱できる。** Package には、テンプレート、フォント、参照データなどの [Asset](/ja/functions/runtime#package-の-asset) を含められます。Asset はどの呼び出しからも `/package` で読めます。
- **Agent と一緒にバージョン管理。** アップロードするたびに、変更できない新しいバージョンが作られます。Agent のバージョンからは、特定のバージョンに固定することも、常に最新を使うこともできます。修正を公開しても、実行中の Session には影響しません。

## コンテキストを埋めずにデータを扱う

Tool が返したものは、すべてモデルの前に置かれます。モデルのコンテキストには限りがあり、しかもトークン単位で課金されます。200 ページの契約書や 1 年分の注文のエクスポート、リポジトリ全体をコンテキストに読み込む Agent は、すぐに余地を使い果たすか、一度見れば十分だったデータを何度も読み直して予算の大半を使ってしまいます。

Function は、データをファイルのまま扱うことでこの問題を避けます。Function を使う Session には、必ず **Session Volume** があります。Session の Function が共有するファイルシステムで、アプリやコンソールの利用者も読み書きできます。Function は入力を Volume から読み、出力を Volume に書き戻します。モデルが受け取るのは、パス、件数、要約、重要な 3 行など、次の一手を決めるのに必要な情報だけです。

- anydoc は長い PDF を Volume 上の Markdown ファイルに変換します。Agent はそのファイルを `files` で検索し、該当するセクションだけを読みます。
- Function が 50 MB のエクスポートを `/volume/tmp` に直接ダウンロードして集計し、合計だけを返します。エクスポートそのものは会話に入りません。
- ある Function の出力ファイルを次の Function の入力にできます。取得、変換、分析、レンダリングと処理が続いても、データはモデルを介さずに Tool から Tool へ渡ります。

ファイルは呼び出しが終わっても残ります。人は Session の **Session Volume** タブから結果をダウンロードでき、アプリは API で読み取れます。

## Function か Sandbox か

[Sandbox](/ja/sandboxes) は Agent に Linux マシンを丸ごと与え、Agent が書いたコマンドを何でも実行します。一方 Function は、自分で書いたコードを呼び出しごとに新しい Sandbox で実行します。ネットワークは Grant しない限り使えず、Credential は Vault に保管されたままです。Function のほうが安全で、費用も抑えられます (課金されるのは呼び出しの実行中だけです)。結果は Session Volume に置かれるので、ほかのどの Tool からも使えます。Sandbox は、コードベースのビルドやテストのように本物の Linux ユーザーランドが必要な作業に限って使ってください。[Sandbox](/ja/sandboxes#まず-function-を検討する) のページでは両者を比較し、Python、シェルスクリプト、JavaScript、ドキュメントをすでに扱える Function を紹介しています。

## 全体の流れ

1. **Package をビルドする**

    SDK で Tool を書いて `module.wasm` にビルドし、Package の名前を記した `subako-package.json` と並べて置きます。[サンプル](/ja/functions/examples) のどれかをビルドしてもかまいません。[独自の Package を書く](/ja/functions/write-a-function) では、各言語のテンプレートから始める方法を説明しています。

2. **Workspace にアップロードする**

    コンソールの **Function** ページから、または `subako function create` でアップロードします。Subako は Module を一度実行して提供される Tool を読み取り、Parameter とともに表示します。

3. **Agent に付与する**

    Agent のバージョンの編集画面にある **Function package** で、使うバージョン、1 回の呼び出しの実行時間の上限、接続できる Host、渡す Credential、呼び出し前に承認を求めるかどうかを設定します。詳しくは [Function の付与](/ja/functions/granting) を参照してください。

4. **Agent が呼び出す**

    モデルは各 Tool の名前、説明、入力 Schema を受け取り、ほかの Tool と同じように呼び出します。Session の会話には、呼び出しとその引数、返された結果が表示されます。

## Platform package

次の 2 つの Package は Subako に付属しており、アップロードは不要です。

| Package | 機能 |
| --- | --- |
| `files` | Session Volume のファイルを一覧、読み取り、検索、書き込み、移動、削除します。読み込んだ画像はモデルに見せます。 |
| `http` | Grant で許可したネットワークと Credential の範囲で HTTP リクエストを送ります。リクエストやレスポンスのボディに Volume のファイルを使えます。 |

付与のしかたは自分の Package と同じです。詳しくは [Platform package](/ja/functions/platform-packages) を参照してください。

## はじめに

**[クイックスタート](/ja/functions/quickstart)**

Package「anydoc」を使って、Agent が Word や PDF のファイルを読めるようにします。

**[サンプル](/ja/functions/examples)**

Python、Bash、JavaScript、Typst、Excel、PowerPoint などを扱う Package。

**[API を呼び出す](/ja/functions/calling-apis)**

キーを Vault に置いたまま使う API クライアントを、GitHub を例に説明します。

**[Function の付与](/ja/functions/granting)**

バージョン、Timeout、ネットワーク、Credential、承認。

**[ABI リファレンス](/ja/functions/abi)**

C、Zig、AssemblyScript など、どんな言語でも Package を書けます。
