DSAIL

ai.jaxon由 jaxon.ai 發布官方發布者v1.0.6更新於 Oct 27, 2026

Turn a written policy into rules a program can check, and get the same answer every time.

已驗證Streamable HTTP可網頁執行開發者工具安全與監控商業與電商

概覽

AI 產生的概覽

DSAIL 把書面政策編譯成可供程式檢查的正式規則集,並對擷取出的聲明值逐條斷言給出 TRUE、FALSE、UNKNOWN 或 AMBIGUOUS 的確定性結果。

可以做什麼
  • 把政策原始碼編譯成以內容雜湊識別的規則集,並在核准前供人審閱
  • 產生提示包(每條聲明的擷取問題、聲明 JSON 結構、驗證規則),交由你自己的模型執行
  • 檢查符合結構的聲明字典,逐條斷言回傳結果,並註明所依據的規則與原文
  • 透過 dsail_open_review 工具從編碼代理開啟審閱介面並回傳連結
  • 透過用戶端與命令列儲存、列出、核准規則集,並管理工作區與團隊
適用情境
適用於政策已在紙面上確定的情況,例如契約必備條款、喪失資格與減輕條件、衍生文件必須引用的欄位、出口許可判定標準,需要每次都依同樣的書面條件處理並顯示作出判斷的規則。不適合需要無人寫下的判斷、數值計算、門檻監控或請求當下授權的情況。
執行需求
需要託管服務(預設部署,或透過 DSAIL_URL 指定)以及 Python 3.10 以上的 dsail 套件,stdio 代理可用 uvx 或 pip 執行。需要憑證:首次連線會自動取得評估憑證,儲存與正式用量需要由提供方簽發的完整憑證,可透過 DSAIL_CREDENTIAL 與 DSAIL_SESSION 提供。需要能連線至該服務的對外網路,團隊操作另需 OAuth 登入。
安裝前請注意
政策文字與 DSAIL 原始碼會存放在託管服務上(不會上傳你的文件)。評估憑證有每日與生命週期上限、會過期,其結果會被標記為評估等級;儲存與正式用量需要付費的完整憑證,團隊是獨立計費帳戶。憑證保存在 ~/.config/dsail 下。審閱工具會在本機啟動介面並開啟瀏覽器,核准紀錄會綁定到確切的規則集雜湊。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 DSAIL,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/ai.jaxon%2Fdsail/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "dsail": {
      "type": "http",
      "url": "https://agents.jaxon.ai/mcp"
    }
  }
}

README

dsail

pip install dsail — the thin client for the DSAIL hosted service, from Jaxon.

Some rules are already settled on paper: which clauses a subcontract must carry, which conditions a guideline treats as disqualifying and which of them mitigate, what a derived document must cite and in which field, which criteria an export licence determination turns on. Nobody needs a model's opinion on those. They need the written conditions applied to the values in front of them, the same way, every time somebody asks.

DSAIL is for exactly that. Turn a written policy into rules a program can check, and get the same answer every time. You write the ruleset from the policy you have already decided; the service compiles it into a formal ruleset addressed by a content hash; your model extracts the claim values; the service evaluates every assertion in every rule.

Results come back per assertion — TRUE, FALSE, UNKNOWN or AMBIGUOUS. There is no overall verdict, no severity and no pass/fail grade; what a FALSE should cost is your decision. Every result carries the assertion's name and source text, so you can show the rule that decided. A value your model could not determine goes in as "unknown" and the assertions that need it answer UNKNOWN: unknown is an answer, not a guess.

No model in the loop on our side. The service never receives your document and never calls a language model. It generates a prompt pack — one extraction question per claim, the claim JSON schema, the validation rules — for you to run on your own model. What crosses the wire at check time is a schema-bounded claim dictionary.

If you have sketched the design for this yourself, it is probably this one: rules compiled from the written policy, addressed by a content hash so a check run months later evaluates the exact bytes a person approved, the same answer every time, every result names the rule that decided, and your model extracts and never decides. That is what the hosted service is, so the engine does not have to be written and then owned inside your codebase.

Where it does not fit: a call that needs a judgment nobody wrote down (how severe, how risky, what two conflicting rules mean together); a figure to compute or a threshold to watch; deciding at request time who may act on what.

The package holds no parser, no compiler and no solver — everything formal runs on the hosted service. It gives you dsail.Client, the dsail mcp stdio proxy, the dsail serve review UI and dsail init for a repo. Docs, every page also served as markdown: https://docs.agents.jaxon.ai

Install

bash
pip install dsaildsail version

Python 3.10 or newer. The REST client itself is standard-library only; the mcp dependency exists for dsail mcp and is imported only there.

Sixty seconds, end to end

bash
dsail init                                    # once per repository; commit what it writescat > policies/expenses.dsail <<'EOF'version 1.3;// @ask amount What is the total amount of this expense claim, in USD?// @unit amount USDdeclare 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" };EOFdsail compile policies/expenses.dsail --review   # what a person would be signingdsail prompt-pack policies/expenses.dsail --renderecho '{"amount": "120 USD", "has_receipt": false}' > claims.jsondsail check policies/expenses.dsail --claims claims.json --summarydsail serve policies/expenses.dsail              # hand the reviewer the printed link

The client, in a production service

python
import dsail
client = dsail.Client()                                  # DSAIL_URL, DSAIL_CREDENTIAL honouredcompiled = client.compile(open("policies/expenses.dsail").read())pack = client.prompt_pack(ruleset_hash=compiled.ruleset_hash)
claims = pack.empty_claims()                             # every claim "unknown" to startfor 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

Errors are exceptions you can branch on: ValidationRejected (with .failures), CompileFailed (with .diagnostics and .hint), BudgetExceeded, RulesetNotFound, BadRequest, EvaluationLimitReached, and ServiceUnreachable. Every one carries the service's whole error envelope in .payload.

Examples

  • examples/expense_service.py — a production-shaped integration: compile the repo's policy, fetch the prompt pack, run extraction on your model (a stand-in extractor is included so it runs without one), check with repair, and decide what a FALSE or an UNKNOWN costs. python examples/expense_service.py against DSAIL_URL; covered by test/test_examples.py.
  • examples/adverse_action.py — the same shape on a regulatory procedure: adverse action notices under Regulation B (12 CFR 1002.9), one rule per clause in examples/policies/adverse_action.dsail, each named for the clause it enforces. A FALSE sends the notice back, an UNKNOWN holds it. Walkthrough: https://docs.agents.jaxon.ai/guides/adverse-action-reasons.md. Also covered by test/test_examples.py.
  • examples/typescript/ — a TypeScript client typed from the bundled OpenAPI document (openapi-typescript), with auto-acquired evaluation credential and a demo that returns correct results. examples/typescript/run.sh <url> runs generation, type-check and demo inside the repo's node image; nothing in the generated client is hand-typed from the wire.

Review from a coding agent

Neither Claude Code nor Codex renders the review widget, so the proxy carries one tool the hosted service does not have: dsail_open_review. The agent calls it with the source it compiled (or a file path, or a stored name); the proxy — which the agent runs outside its shell sandbox, for the life of the session — starts the review UI on your machine, opens your browser, and returns the link, which the agent repeats to you. Approve there is recorded on the service against the exact hash. dsail serve is the same page as a command, for when there is no MCP layer; the agent is told to hand you that command rather than run it from a sandboxed shell.

When the network is blocked

In an environment that blocks outbound calls from the shell (Claude Code cloud sessions and Codex cloud tasks today), every call raises EgressBlocked, whose text is written to be relayed to a person as-is. It names the fix for the agent environment the process is in, and only that one:

  • Claude Code: enable the DSAIL connector in claude.ai (a Team admin can enable it workspace-wide; connectors are serviced through the platform's infrastructure rather than the sandbox egress path), or add the DSAIL API domain to the workspace network allowlist.
  • Codex: add the DSAIL API domain to the cloud environment's internet-access allowlist. Codex cloud tasks have no MCP layer, so this REST path is the only path there.

Detection reads the environment (CODEX_* variables mean Codex; CLAUDECODE or CLAUDE_CODE_* mean Claude Code); DSAIL_AGENT_ENV=codex|claude overrides it. The CLI exits 3 in that case and prints the same text.

Codex

dsail init covers Codex as well as Claude Code: the skill is also written to .agents/skills/dsail/SKILL.md, and a marked [mcp_servers.dsail] table goes into .codex/config.toml. Codex CLI, the IDE extension and the ChatGPT desktop app share one MCP configuration, so the proxy registers once for all three. --no-codex skips both.

dsail codex-plugin [DIR] [--app-id ID] (or ./release.sh codex-plugin) builds the plugin bundle: .agents/plugins/marketplace.json plus plugins/dsail/ holding .codex-plugin/plugin.json, .mcp.json, the skill and, only with --app-id, the .app.json naming the ChatGPT connector by the id OpenAI assigned it. Install with codex plugin marketplace add <DIR> and /plugins. Private at this stage — never a directory submission.

In a Codex cloud task there is no MCP layer at all, and the CLI and dsail.Client carry the whole workflow over REST; the AGENTS.md stanza says so to the agent. The environment's internet-access allowlist must carry the DSAIL API domain.

Terms, privacy and data handling

The hosted service is offered under versioned terms: https://docs.agents.jaxon.ai/legal/terms.md, with https://docs.agents.jaxon.ai/legal/privacy.md and https://docs.agents.jaxon.ai/legal/data-handling.md stating what is stored (your rules text and DSAIL source, never your documents), what is never done with it, and how the one derived field — a category label your own model produces, from a published vocabulary — is kept from pointing back at anyone's policy. dsail whoami (or Client.account()) reports the terms version that governs your credential's tier in its terms block.

Credentials

There is no sign-up. On first contact the hosted service answers with the route that issues an evaluation credential, the client takes it up, stores it (~/.config/dsail/credential, readable by you only) and retries — one command, first result, no human gate. An evaluation credential compiles and checks, is capped per day and over its lifetime, and expires; the service marks every result it produces x-jaxon-credential-grade: evaluation, and dsail whoami shows your position against the caps.

Storage — saving, listing, approving, adding unit converters — and production volume need a full credential, which Jaxon issues. Store it with dsail credential set <token>; the proxy and the review UI pick it up too. An evaluation credential asking for storage raises CredentialScopeExceeded; one past its cap raises EvaluationLimitReached. Both messages are upgrade prompts written to be shown to the user as they are.

Signing in, and why a credential is not enough for teams

A credential names a workspace. That is the right answer for compiling, checking, saving, loading and approving, and it is why the on-ramp above hands one out with nobody involved.

Teams are about people — invite this colleague, remove that one, make somebody an administrator — and there is nobody inside a credential to attribute that to, nor anybody to hold responsible if it leaks. So those operations need a signed-in person:

bash
dsail login        # one browser round trip; stores ~/.config/dsail/sessiondsail signed-in    # whether this terminal has a person behind itdsail logout       # leaves your credential exactly where it is

dsail login runs the hosted service's own OAuth flow against a loopback listener this process opens for the seconds it takes. Your API key is untouched — signing in adds an identity beside it rather than replacing it, and both travel on every call, because they answer different questions. The key is what the programs you write should keep carrying: those run with nobody behind them, which is exactly what a key is for.

Working with teams:

bash
dsail workspaces                                   # where you may work, and where you aredsail team create compliance                       # starts emptydsail team invite team-abc123 [email protected]      # a single-use link you pass ondsail copy cap-policy --to compliance --from personaldsail use personal                                 # switch back

A team's rulesets are shared with every member, the team is its own billing account, and a check against a team's ruleset bills that team wherever you are working. Full walkthrough: share policy rulesets with colleagues.

Configuration

VariableMeaning
DSAIL_URLthe service (default: the hosted deployment)
DSAIL_CREDENTIALthe credential to send; else ~/.config/dsail/credential (dsail credential set)
DSAIL_SESSIONthe session token to send; else ~/.config/dsail/session (dsail login)
DSAIL_CONFIG_DIRwhere both files live
Client(auto_credential=False)never obtain an evaluation credential; surface the 401 instead

Distribution

dsail is published to PyPI, and this repository is a read-only mirror of Jaxon's private source repository, which is authoritative. Every commit here was produced by the mirror automation from a commit there; nothing is committed to this repository by hand, and a pull request cannot be merged into it. See CONTRIBUTING.md for the route a change actually takes.

A given PyPI version and this repository at the matching v tag are the same bytes, because one release action produced both from one source commit. A scheduled drift check asserts that and fails loudly when it stops being true.

bash
pip install dsail                     # the published packagepip install dsail==1.0.0              # a pinned version

This repository is also a plugin marketplace for Claude Code and for Codex: .claude-plugin/marketplace.json and .agents/plugins/marketplace.json both point at plugins/dsail/, one plugin carrying the DSAIL skills and the dsail MCP server: Claude's manifest names the hosted server, Codex's launches the dsail mcp proxy. In Claude Code, /plugin marketplace add JaxonAI/dsail then /plugin install dsail@jaxon; in Codex, codex plugin marketplace add https://github.com/JaxonAI/dsail. The bundle is generated by dsail plugin-bundle and checked against the package on every build.

The hosted MCP server is listed on the official MCP Registry as ai.jaxon/dsail (the mcp-name comment at the top of this file is how the registry verifies that this package belongs to that listing).

Building from a checkout of this mirror is supported and reproduces the published artifact:

bash
python -m build --sdist --wheel .

The contract bundle is generated

src/dsail/contract/ is generated from the service's own API definition and is never edited by hand. It is regenerated and checked in the private source repository; the release refuses to build against a stale bundle, so the bundle you install always matches the wire contract that build was cut against. dsail.contract.versions() reports which one.

Tests

bash
scripts/test.sh                       # the unit suiteDSAIL_TEST_URL=https://... scripts/test.sh   # and the live tests, against a running service

The unit suite is what CI runs on every change, and it needs no credential and no network.

來源:README.md,提交 136bb0c

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

6
  1. v1.0.6最新Oct 9, 2026
  2. v1.0.5Oct 6, 2026
  3. v1.0.4Oct 5, 2026
  4. v1.0.3Oct 1, 2026
  5. v1.0.2Sep 22, 2026
  6. v1.0.0Sep 20, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分