DSAIL について
DSAILは、文書化されたポリシーを再現可能なチェックに変換するホステッドサービスのクライアントです。ルールセットはコンテンツハッシュで識別され、モデルは値を抽出しますが判定は行いません。
主な機能
- 01ポリシーを形式的なルールセットにコンパイル
- 02アサーションごとに4種類の判定を返却
- 03利用者のモデル向けプロンプトパックを生成
- 04承認済みルールセットをコンテンツハッシュで識別
- 05PythonクライアントとレビューUIを提供
活用シーン
- 01契約条項を既定のポリシーと照合
- 02規制手順に沿って通知を検証
- 03情報不足をUNKNOWNとして保持
MCP 対応
`dsail mcp`のstdioプロキシでMCPクライアントからDSAILを利用でき、`dsail_open_review`でルールのレビューUIを起動できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://agents.jaxon.ai/mcpclaude mcp add --transport http ai-jaxon-dsail https://agents.jaxon.ai/mcp{"mcpServers":{"ai-jaxon-dsail":{"type":"http","url":"https://agents.jaxon.ai/mcp"}}}Cursor で開く{"servers":{"ai-jaxon-dsail":{"type":"http","url":"https://agents.jaxon.ai/mcp"}}}VS Code で開く{"mcpServers":{"ai-jaxon-dsail":{"type":"http","url":"https://agents.jaxon.ai/mcp"}}}{"mcpServers":{"ai-jaxon-dsail":{"serverUrl":"https://agents.jaxon.ai/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
dsail
pip install dsail — Jaxon のホスト型サービス向けシンクライアントです。
すでに文書で定められているルールもあります。下請契約にどの条項が必要か、ガイドラインでどの条件が失格と見なされ、どの条件が緩和要因となるか、派生文書で何をどのフィールドに引用する必要があるか、輸出ライセンスの判定がどの基準に基づくか、といったルールです。こうしたことについて、モデルの意見は必要ありません。必要なのは、書面で定められた条件を目の前の値に適用し、誰がいつ尋ねても同じ結果を得ることです。
DSAIL はまさにそのためのものです。書面によるポリシーをプログラムで確認できるルールに変換し、毎回同じ結果を得られます。すでに決定済みのポリシーに基づいてルールセットを作成すると、サービスがそれをコンテンツハッシュで識別される形式的なルールセットにコンパイルします。モデルがクレームの値を抽出し、サービスがすべてのルールのすべてのアサーションを評価します。
結果はアサーションごとに返されます — TRUE、FALSE、UNKNOWN、AMBIGUOUS のいずれかです。全体としての判定、重大度、合否評価はありません。FALSE をどの程度重く扱うかは、あなたが決めます。各結果にはアサーション名とソーステキストが含まれるため、判定の根拠となったルールを示せます。モデルが特定できなかった値は "unknown" として渡します。それを必要とするアサーションは UNKNOWN と回答します。未知は回答であり、推測ではありません。
こちら側の処理にモデルは関与しません。 サービスがドキュメントを受け取ることも、言語モデルを呼び出すこともありません。クレームごとの抽出用質問、クレームの JSON スキーマ、検証ルールを含むプロンプトパックを生成します。これを使って、独自のモデルで処理してください。チェック時に送信されるのは、スキーマで制約されたクレーム辞書です。
自分でこの設計を考えたことがあるなら、おそらく次のようなものでしょう。書面のポリシーからコンパイルしたルールはコンテンツハッシュで識別されるため、数か月後にチェックを実行しても、承認者が承認したものと同一のバイト列を評価できます。毎回同じ結果が得られ、すべての結果に判定したルールが明記され、モデルは抽出を行いますが、判定はしません。これがホスト型サービスの仕組みであり、コードベース内でエンジンを作成し、保守する必要がありません。
適さない用途:書面で定められていない判断が必要な呼び出し(重大度やリスクの評価、競合する 2 つのルールを組み合わせた場合の解釈など)、数値の計算やしきい値の監視、リクエスト時に誰が何に対して操作できるかの決定です。
このパッケージにはパーサー、コンパイラー、ソルバーは含まれていません。形式的な処理はすべてホスト型サービスで実行されます。提供されるのは dsail.Client、dsail mcp の stdio プロキシ、dsail serve のレビュー UI、リポジトリ向けの dsail init です。ドキュメントはすべて、各ページを Markdown 形式でも提供しています:https://docs.agents.jaxon.ai
インストール
pip install dsail
dsail version
Python 3.10 以降が必要です。REST クライアント自体は標準ライブラリのみで動作します。mcp 依存関係は dsail mcp 用で、そのコマンドを使用する場合にのみインポートされます。
エンドツーエンドの 60 秒ガイド
dsail init # once per repository; commit what it writes
cat > policies/expenses.dsail <<'EOF'
version 1.3;
// @ask amount What is the total amount of this expense claim, in USD?
// @unit amount USD
declare amount as numeric;
// @ask has_receipt Is an itemised receipt attached?
declare has_receipt as boolean;
assert receipt_over_75 { Implies(amount > 75 "USD", has_receipt) };
assert within_cap { amount <= 5000 "USD" };
EOF
dsail compile policies/expenses.dsail --review # what a person would be signing
dsail prompt-pack policies/expenses.dsail --render
echo '{"amount": "120 USD", "has_receipt": false}' > claims.json
dsail check policies/expenses.dsail --claims claims.json --summary
dsail serve policies/expenses.dsail # hand the reviewer the printed link
本番サービスでのクライアント
import dsail
client = dsail.Client() # DSAIL_URL, DSAIL_CREDENTIAL honoured
compiled = client.compile(open("policies/expenses.dsail").read())
pack = client.prompt_pack(ruleset_hash=compiled.ruleset_hash)
claims = pack.empty_claims() # every claim "unknown" to start
for prompt in pack.prompts: # run each on YOUR model
claims[prompt.claim] = my_model.extract(document, prompt.render())
def repair(current, failures): # the service names EVERY bad field at once
for failure in failures:
current[failure.field] = my_model.re_extract(document, failure.field, failure.expected)
return current
result = client.check_with_repair(claims, repair, ruleset_hash=compiled.ruleset_hash)
for assertion in result.assertions:
print(assertion.name, assertion.check, assertion.source)
violated = result.where(dsail.FALSE) # your system decides what a FALSE costs
エラーは分岐処理に使える例外として発生します:ValidationRejected(.failures を含む)、CompileFailed(.diagnostics と .hint を含む)、BudgetExceeded、RulesetNotFound、BadRequest、EvaluationLimitReached、ServiceUnreachable。どの例外にも、サービスから返されたエラー全体のエンベロープが .payload に含まれています。
例
examples/expense_service.py— 本番環境を想定した統合例です。リポジトリのポリシーをコンパイルし、プロンプトパックを取得して、お使いのモデルで抽出を実行します(モデルがなくても実行できるよう、代替の抽出器も含まれています)。修復を試みながらチェックし、FALSE または UNKNOWN のコストを判断します。DSAIL_URLに対してpython examples/expense_service.pyを実行します。test/test_examples.pyでテストされています。examples/adverse_action.py— 規制手続きに同じ形式を適用した例です。Regulation B(12 CFR 1002.9)に基づく不利な措置の通知を扱います。examples/policies/adverse_action.dsailでは条項ごとにルールを設け、それぞれ適用対象の条項にちなんだ名前を付けています。FALSE の場合は通知を差し戻し、UNKNOWN の場合は保留します。手順の解説はこちらです:https://docs.agents.jaxon.ai/guides/adverse-action-reasons.md。こちらもtest/test_examples.pyでテストされています。examples/typescript/— 同梱の OpenAPI ドキュメントからopenapi-typescriptで型を生成する TypeScript クライアントです。評価用の認証情報を自動取得し、正しい結果を返すデモも含まれています。examples/typescript/run.sh <url>を実行すると、リポジトリの Node イメージ内で生成、型チェック、デモを実行します。生成されたクライアントには、ワイヤーから手作業で型を入力した箇所はありません。
コーディングエージェントによるレビュー
Claude Code も Codex もレビューウィジェットを表示しないため、プロキシにはホスト型サービスにはないツール dsail_open_review が用意されています。エージェントは、コンパイルしたソース(またはファイルパス、保存済みの名前)を渡してこのツールを呼び出します。エージェントがシェルのサンドボックス外でセッション中に実行するプロキシが、マシン上でレビュー UI を起動してブラウザーを開き、リンクを返します。そのリンクをエージェントがユーザーに伝えます。そこでの承認は、完全に一致するハッシュとともにサービスに記録されます。dsail serve は同じページをコマンドとして開くもので、MCP レイヤーがない場合に使用します。エージェントには、サンドボックス化されたシェルからこのコマンドを実行するのではなく、ユーザーに渡すよう指示されています。
ネットワークがブロックされている場合
シェルからの外向き通信がブロックされている環境(現在の Claude Code クラウドセッションや Codex クラウドタスクなど)では、すべての呼び出しが EgressBlocked を発生させます。そのメッセージは、そのまま人に伝えられるように書かれています。実行中のエージェント環境に応じた解決策を、該当するものだけ示します。
- Claude Code: claude.ai で DSAIL コネクターを有効にします(Team 管理者はワークスペース全体で有効にできます。コネクターはサンドボックスの外向き通信経路ではなく、プラットフォームのインフラストラクチャを通じて提供されます)。または、DSAIL API ドメインをワークスペースのネットワーク許可リストに追加します。
- Codex: DSAIL API ドメインをクラウド環境のインターネットアクセス許可リストに追加します。Codex クラウドタスクには MCP レイヤーがないため、REST 経路だけが利用できます。
検出では環境を読み取ります(CODEX_* 変数は Codex、CLAUDECODE または CLAUDE_CODE_* は Claude Code を示します)。DSAIL_AGENT_ENV=codex|claude で上書きできます。この場合、CLI は 3 で終了し、同じメッセージを表示します。
Codex
dsail init は Claude Code と同様に Codex にも対応しています。スキルは .agents/skills/dsail/SKILL.md にも書き込まれ、マーカー付きの [mcp_servers.dsail] テーブルが .codex/config.toml に追加されます。Codex CLI、IDE 拡張機能、ChatGPT デスクトップアプリは MCP 設定を共有するため、プロキシは一度登録すれば 3 つすべてで利用できます。--no-codex を指定すると、両方の処理をスキップします。
dsail codex-plugin [DIR] [--app-id ID](または ./release.sh codex-plugin)は、プラグインバンドルをビルドします。.agents/plugins/marketplace.json に加えて、.codex-plugin/plugin.json、.mcp.json、スキル、および --app-id を指定した場合に限り、OpenAI が割り当てた ID で ChatGPT コネクターを指定する .app.json を含む plugins/dsail/ が作成されます。codex plugin marketplace add <DIR> と /plugins を使ってインストールします。現段階では非公開のため、ディレクトリーとして提出しないでください。
Codex クラウドタスクでは MCP レイヤーが一切ありません。CLI と dsail.Client がワークフロー全体を REST 経由で実行し、その旨は AGENTS.md の記述でエージェントに伝えられます。環境のインターネットアクセス許可リストに DSAIL API ドメインを追加する必要があります。
利用規約、プライバシー、データの取り扱い
ホステッドサービスは、バージョン管理された利用規約に基づいて提供されます:
https://docs.agents.jaxon.ai/legal/terms.md。https://docs.agents.jaxon.ai/legal/privacy.md と
https://docs.agents.jaxon.ai/legal/data-handling.md には、保存される情報(ルールのテキストと DSAIL ソース。ドキュメントは保存しません)、それらを使って一切行わないこと、そして派生フィールドは 1 つだけ(公開された語彙から、ユーザー自身のモデルが生成するカテゴリラベル)であり、そのフィールドから誰かのポリシーを特定できないようにする方法が記載されています。
dsail whoami(または Client.account())は、terms ブロックで、認証情報のティアに適用される利用規約のバージョンを報告します。
認証情報
サインアップは不要です。初回のアクセス時、ホステッドサービスは 評価用認証情報 を発行するルートを返し、クライアントが取得して保存し(~/.config/dsail/credential。読み取り可能なのはユーザー本人のみ)、再試行します。コマンド 1 つで最初の結果が得られ、人的な審査もありません。評価用認証情報ではコンパイルとチェックができますが、1 日あたりおよび有効期間全体で上限があり、期限も切れます。サービスは、生成するすべての結果に x-jaxon-credential-grade: evaluation を付与し、dsail whoami には上限に対する現在の使用状況が表示されます。
保存、一覧表示、承認、単位コンバーターの追加などの操作と、本番環境での利用には フル認証情報 が必要です。フル認証情報は Jaxon が発行します。dsail credential set <token> で保存すると、プロキシとレビュー UI でも使用できます。評価用認証情報で保存を要求すると CredentialScopeExceeded が発生し、上限を超えると EvaluationLimitReached が発生します。どちらのメッセージも、そのままユーザーに表示することを想定したアップグレード案内です。
サインインと、チームで認証情報だけでは不十分な理由
認証情報は ワークスペース を示します。コンパイル、チェック、保存、読み込み、承認にはこれが適切であり、上記の利用開始手順で誰も関与せずに認証情報を発行できるのもこのためです。
チームに関わるのは 人 です。この同僚を招待し、あのメンバーを削除し、誰かを管理者にするといった操作があります。認証情報には操作の実行者を特定する情報も、漏えいした場合に責任を負う人も紐づいていません。そのため、これらの操作にはサインインしたユーザーが必要です:
dsail login # one browser round trip; stores ~/.config/dsail/session
dsail signed-in # whether this terminal has a person behind it
dsail logout # leaves your credential exactly where it is
dsail login は、プロセスが必要な数秒間だけ開くループバックリスナーを通じて、ホステッドサービス独自の OAuth フローを実行します。API キーには手を加えません。サインインではキーを置き換えず、その横にユーザー ID を追加します。キーとユーザー ID は異なる問いに答えるため、すべての呼び出しで両方が送信されます。作成したプログラムで引き続き使うのはキーです。こうしたプログラムは実行時に人が関与しないため、まさにキーが適しています。
チームでの作業:
dsail workspaces # where you may work, and where you are
dsail team create compliance # starts empty
dsail team invite team-abc123 [email protected] # a single-use link you pass on
dsail copy cap-policy --to compliance --from personal
dsail use personal # switch back
チームのルールセットはすべてのメンバーと共有され、チームは独立した請求アカウントです。チームのルールセットに対するチェックは、どこで作業していてもそのチームに請求されます。詳しい手順は、ポリシールールセットを同僚と共有するをご覧ください。
設定
| 変数 | 意味 |
|---|---|
DSAIL_URL | サービス(デフォルト:ホステッド環境) |
DSAIL_CREDENTIAL | 送信する認証情報。それ以外の場合は ~/.config/dsail/credential(dsail credential set) |
DSAIL_SESSION | 送信するセッショントークン。それ以外の場合は ~/.config/dsail/session(dsail login) |
DSAIL_CONFIG_DIR | 両方のファイルを保存する場所 |
Client(auto_credential=False) | 評価用認証情報を取得せず、代わりに 401 をそのまま返す |
配布
dsail は PyPI に公開されており、このリポジトリは Jaxon のプライベートソースリポジトリの読み取り専用ミラーです。正本はプライベートソースリポジトリです。ここにあるすべてのコミットは、そちらのコミットからミラー自動化によって作成されたものです。このリポジトリに手動でコミットされることはなく、プルリクエストをマージすることもできません。変更が実際にどのように反映されるかについては、CONTRIBUTING.md を参照してください。
PyPI の特定のバージョンと、対応する v タグのこのリポジトリは、同じソースコミットから1つのリリースアクションによって作成されるため、同一のバイト列です。定期的なドリフトチェックでこれを検証しており、一致しなくなるとエラーを明示して失敗します。
pip install dsail # the published package
pip install dsail==1.0.0 # a pinned version
このリポジトリは、Claude Code と Codex のプラグインマーケットプレイスでもあります。.claude-plugin/marketplace.json と .agents/plugins/marketplace.json は、どちらも plugins/dsail/ を参照しています。このプラグインには DSAIL スキルと dsail MCP サーバーが含まれます。Claude のマニフェストはホストされたサーバーを指定し、Codex のマニフェストは dsail mcp プロキシを起動します。Claude Code では、/plugin marketplace add JaxonAI/dsail に続いて /plugin install dsail@jaxon を実行します。Codex では、codex plugin marketplace add https://github.com/JaxonAI/dsail を実行します。バンドルは dsail plugin-bundle によって生成され、すべてのビルドでパッケージとの整合性がチェックされます。
ホストされた MCP サーバーは、公式 MCP Registry に ai.jaxon/dsail として登録されています(このファイルの先頭にある mcp-name コメントは、このパッケージがその登録に属することをレジストリが検証するために使われます)。
このミラーをチェックアウトした状態からビルドする方法がサポートされており、公開済みの成果物を再現できます。
python -m build --sdist --wheel .
コントラクトバンドルは生成されます
src/dsail/contract/ はサービス独自の API 定義から生成されるもので、手動で編集することはありません。プライベートソースリポジトリで再生成され、チェックインされます。リリースでは、バンドルが古い状態でのビルドが拒否されるため、インストールするバンドルは常に、そのビルドの基準となったワイヤーコントラクトと一致します。どのバージョンかは dsail.contract.versions() で確認できます。
テスト
scripts/test.sh # the unit suite
DSAIL_TEST_URL=https://... scripts/test.sh # and the live tests, against a running service
ユニットテストは CI が変更のたびに実行するテストスイートで、認証情報もネットワークも必要ありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。