Hane Platform
Agent と AgentRun
Agent の定義、ドライバー、Tool Gateway を通したツール、実行の中の承認、会話のコンテキスト、評価の仕組みを説明します。
このページでは、Hane の Agent がどう定義され、どう実行されるかを説明します。ドライバーごとの提供状況、ツールの呼び方、外への操作の承認、評価までを順に見ていきます。
Agent と AgentRun
Section titled “Agent と AgentRun”Agent は、目的・使ってよいツール・上限・入力と出力の Schema を持つ定義です。マニフェスト(agents/v1alpha1 の Agent)に書き、ほかの定義と同じく ReleaseBundle にまとめて有効化します。
AgentRun は、有効なバージョンの Agent を 1 回動かした記録です。入力・結果・ツールの呼出しの要約・使ったトークン・状態を持ちます。状態は queued・running から始まり、succeeded・failed・cancelled・limit_exceeded のどれかで終わります。
| 定義の項目 | 意味 |
|---|---|
purpose・examples |
何をする Agent か。受付が自由な文から Agent を選ぶときにも使います |
input・output |
入力の JSON Schema と、submit_result で返す結果の JSON Schema。結果には status を必ず持たせます |
driver |
どう動かすか(下の表) |
instructions・script |
モデルに渡す指示か、台本のドライバーの手順 |
tools |
呼んでよいツール。Tool Gateway は呼出しのたびにこの一覧を確かめます |
limits |
maxToolCalls・maxSeconds・maxModelTokens(1 回の実行のトークン。既定は 50,000) |
approval・handover |
外への操作の承認と、人への引き継ぎで Task を作る割り当ての規則 |
workflows・connections・toolExposures |
起動してよい Workflow、呼んでよい顧客の API |
apiVersion: agents/v1alpha1kind: Agentmetadata: name: vehicle-checkspec: purpose: 登録番号から、車両の車種・車検の満了日・走行距離を車両台帳で調べて答える input: type: object required: [vehicle] properties: vehicle: { type: string, title: 登録番号 } driver: opencode instructions: |- data.find_record で車両を探し、見つかったら submit_result で答える。 見つからなければ request_human_help で車両管理チームに引き継ぐ。台帳にない値を作らない。 tools: [data.find_record, request_human_help] handover: assignment: fleet-desk limits: maxToolCalls: 4 maxSeconds: 120 output: type: object required: [status, vehicle] properties: status: { type: string } vehicle: { type: string }ドライバーは、Agent を何で動かすかを決めます。どのドライバーも、同じ Tool Gateway を通してツールを呼び、submit_result で結果を返します。
driver |
動き方 | 動く場所と提供状況 |
|---|---|---|
scripted |
定義の script の手順どおりにツールを呼びます。モデルを使いません |
どの環境でも動きます |
llm |
モデルにツールを選ばせます | プレビュー 手元の開発環境では記録した応答で動きます。クラウド環境では、まだ有効にしていません |
opencode |
オープンソースのハーネス opencode を、サンドボックスのコンテナで起動します。モデルの呼出しは Model Gateway を通ります | プレビュー クラウド環境のサンドボックスで動きます。上流のモデルは Cloudflare Workers AI で確かめています |
codex・claude |
開発者の手元の Codex CLI・Claude Code を起動し、Hane の MCP のツールだけを使わせます | プレビュー 手元の開発環境での検証用です。クラウド環境では提供していません |
CLI のドライバー(opencode・codex・claude)は、cliProfile で CLI のバージョンとサンドボックスのイメージの組を選びます。書かなければ、ドライバーごとの基準の組を使います。どの組で動くかは ReleaseBundle で決まるので、CLI を上げるのも戻すのも、定義の評価と有効化の流れに乗ります。
ツールと Tool Gateway
Section titled “ツールと Tool Gateway”Agent がツールを呼ぶ先は、いつも Tool Gateway です。ドライバーは、実行ごとに発行される短命の RunToken を付けて呼びます。Tool Gateway は呼出しのたびに、定義の tools にあるか、実行が止められていないか、上限を超えていないかを確かめます。実行を取り消すと、RunToken の期限を待たずに次の呼出しから拒否します。
主なツールは次のとおりです。
| 区分 | ツールの例 |
|---|---|
| 台帳の読み取り | data.find_record・data.get_record・ontology.query・ontology.knowledge |
| 文書の読み取り | documents.search・documents.read_pages・documents.read_summary |
| 業務の進行 | workflow.start・workflow.get_case・tasks.create・request_human_help |
| 顧客の API | integration.describe・integration.read・integration.execute |
| 外への操作 | communication.send_email・communication.send_sms・communication.place_call・browser.run_flow |
| 結果 | submit_result(審査用の Agent は submit_review) |
顧客が公開した API の操作を Agent のツールにするときは、ToolExposure を定義します。ToolExposure から作ったツールの姿(ToolDefinition。入出力の Schema・影響区分・timeout など)は GET /v1/agents/tools で読めます。詳しくは 外部連携 を見てください。
ツールの結果、文書の本文、受け取ったメールの本文は、信頼できない入力として扱います。そこに書かれた命令を権限の根拠にはしません。
実行の中の承認
Section titled “実行の中の承認”メール・SMS・電話・顧客 API の更新のような外への操作は、Agent が呼んでもすぐには実行しません。宛先と内容を固定して digest を付けた ActionRequest にし、承認の Task を作ります。承認されると、実行台帳で一度だけ実行します。
- 誰が承認してよいかは、Agent の
approval.deciderが指す DeciderPolicy で、提案したときに決まります。書かなければ、すべての操作を人が決めます。 - 規則によっては、審査用の Agent が承認・却下・人への引き上げを返したり、事前のポリシーの承認で Task を作らずに承認したりできます。AI とポリシーの決定は、人の承認として数えません。
- 決定者の上書き(
POST /v1/agents/decider-overrides)で、ReleaseBundle を待たずにツールの承認を人だけに戻せます。 - 結果が分からなくなった操作は
unknownにし、送り直さずに人が照合します(POST /v1/agents/action-requests/{id}/reconcile)。
承認の流れの全体は 承認 にあります。
AgentRun は、次のどれかで始まります。
POST /v1/agents/runsに Agent の名前と入力を渡すPOST /v1/agents/requests(受付)に自由な文を渡し、Agent と入力を決めてもらう- Workflow の
agentのステップ、スケジュール、組み込みチャットのメッセージ
import { createHaneClient, unwrap } from "@hane/sdk";
const client = createHaneClient({ baseUrl, token: async () => accessToken });const run = await unwrap( client.POST("/v1/agents/runs", { body: { agent: "vehicle-check", input: { vehicle: "架空 300 あ 10-02" } }, }),);shadow: true を付けると、外への操作と人への引き継ぎをせず、記録だけを残します。
1 回の実行の上限は定義の limits で決めます。プロジェクトと環境の 1 日(UTC)の予算は platform/v1alpha1 の Budget で決めます。
apiVersion: platform/v1alpha1kind: Budgetmetadata: name: daily-budgetspec: agentRunsPerDay: 200 externalActionsPerDay: 50 modelTokensPerDay: 200000 alertAtPercent: 80モデルを使う実行を作るときは、maxModelTokens の分を 1 日の予算から先に予約します。残りが足りなければ起動しません。今日の使用量は GET /v1/agents/budget で読めます。
会話のコンテキスト
Section titled “会話のコンテキスト”組み込みチャットの会話では、メッセージ・実行の入力と結果・操作の状態を Hane が保存し、それをもとにモデルへ渡すコンテキストを組み立てます。CLI のセッションには依存しません。
/v1/agents/conversations/{id}/memory で、いまのコンテキストをバージョン付きの JSON として取得・保存し、保存した履歴から新しい会話を始められます。保存する JSON には RunToken・API キー・資格情報を含めません。取得した履歴で、いまの権限や実行台帳を上書きすることもありません。
agents/v1alpha1 の EvalSuite に、入力と期待する結果の組を最大 50 件書きます。POST /v1/agents/evals で、件ごとに Agent を shadow で動かし、結果の項目を比べます。GET /v1/agents/evals/compare で、同じ EvalSuite の 2 回の評価を件ごとに比べられます。
apiVersion: agents/v1alpha1kind: EvalSuitemetadata: name: lease-qa-evalspec: agent: lease-qa passRate: 1 cases: - name: 台帳にない契約 input: { contract_no: C-9999 } expect: { status: handed_over }