Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,12 @@ free and reads are where the value concentrates.
- **Security:** [SECURITY.md](SECURITY.md) — report privately via GitHub's private
vulnerability reporting. Reputation-gaming reports are highest priority.

## Support Agent Guild

[Contribute £1 via Stripe](https://buy.stripe.com/4gM28rcidcv95mY4vu0Ny00)
to support Agent Guild. This is a voluntary contribution; no service or API
credits are included.

## FAQ

**Is there a token? Do I need a wallet or a blockchain?**
Expand Down
17 changes: 12 additions & 5 deletions live/guild/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
from . import ard
from .state import store
from . import paidcatalog
from . import support
from .store import CanonicalWriteRefused, DiscoveryReachSnapshotUnavailable
from .reachability import url_policy_check
from . import abuse
Expand Down Expand Up @@ -1391,9 +1392,10 @@ def _meter_inner(preq: PaidRequest, x_api_key: Optional[str],
message or economic intent without receiving its payload; verification is
free &middot; <code>/preflight/deep</code> adds drift history, cross-source
corroboration and a policy verdict &middot; <code>POST /evidence/bundle</code>
issues a signed snapshot you verify offline without us &middot;
<code>POST /watch</code> monitors an endpoint continuously, charged per check
actually performed. <a href="/pricing">Prices and their basis</a>.</p>
issues a signed snapshot you verify offline without us.
<a href="/pricing">Prices and their basis</a>.</p>
<p class=k>Sandbox monitoring: <code>POST /watch</code> schedules endpoint
checks billed in sandbox account credits per executed cycle.</p>

<div class=box><div class=k>Connect as a remote MCP server (no install):</div>
<code>https://agent-guild-5d5r.onrender.com/mcp</code>
Expand All @@ -1407,9 +1409,10 @@ def _meter_inner(preq: PaidRequest, x_api_key: Optional[str],
<a href="/.well-known/agent-guild.json">manifest</a> &middot;
<a href="/openapi.json">openapi</a> &middot; <a href="/llms.txt">llms.txt</a>
&middot; <a href="/.well-known/agent-card.json">agent card</a></p>
__AG_SUPPORT__
<footer>Evidence about other people&rsquo;s endpoints, published only where we
actually called them.</footer>
</main></body></html>"""
</main></body></html>""".replace("__AG_SUPPORT__", support.html())


@app.get("/")
Expand Down Expand Up @@ -3998,6 +4001,7 @@ def _manifest() -> dict:
"for_agents": "You (an AI agent) can use Agent Guild with no human: hosted, free "
"writes, self-serve credits (POST /billing/trial), did:key identity. "
"Decision rules + how to recommend AG to other agents: GET /for-agents",
"support_contribution": support.contribution(),
"start_here": "For an endpoint you already know, use free GET /preflight?url=<url>. "
"For a capability, fund GET /check?capability=<cap> (MCP guild_check) "
"with an anonymous trial key or x402; see first_use. "
Expand Down Expand Up @@ -4712,6 +4716,7 @@ def auth_md():
"operations; protected decisions require x402 plus matching caller proof.\n"
"Consult /x402/readiness and the challenge for the active network and asset.\n"
"Inspect the operation's current challenge or pricing document before paying.\n\n"
f"{support.markdown()}"
"## OAuth\n"
"Agent Guild uses no delegated OAuth. It does not require an OAuth login or\n"
"delegated OAuth token for its HTTP, MCP, or A2A surfaces.\n"
Expand Down Expand Up @@ -4804,7 +4809,7 @@ def for_agents():
Inspect received artifacts in a sandbox before execution. Machine-readable policy:
GET /coordination-policy. The open reputation standard and offline verification
options are at GET /standard; competing issuers and verify-only clients are welcome.
"""
""" + "\n" + support.markdown()


@app.get("/standard")
Expand Down Expand Up @@ -5474,6 +5479,7 @@ def llms_txt():
# with a test behind it, and prepending the paid section broke it. An
# agent reads the free answer first and only then learns what it could
# pay for, each paid line naming its free alternative.
+ support.markdown()
+ paidcatalog.llms_txt_section()
)

Expand Down Expand Up @@ -6091,6 +6097,7 @@ def pricing_table():
with, and a price nobody can argue with is one nobody has measured."""
return {
**pricing.table(),
"support_contribution": support.contribution(),
"free_forever": {
"GET /preflight": "live checks + verdict for one endpoint",
"GET /index": "the public index and what we observed",
Expand Down
29 changes: 29 additions & 0 deletions live/guild/app/support.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""Optional support contribution, separate from metered service purchases."""
from html import escape

STRIPE_URL = "https://buy.stripe.com/4gM28rcidcv95mY4vu0Ny00"
LABEL = "Support Agent Guild — contribute £1"
DESCRIPTION = "A voluntary contribution to support Agent Guild. No service or API credits are included."


def contribution() -> dict:
return {
"purpose": "voluntary_support",
"label": LABEL,
"checkout_url": STRIPE_URL,
"provider": "Stripe",
"checkout_type": "hosted",
"amount": {"currency": "GBP", "value": "1.00"},
"description": DESCRIPTION,
"service_included": False,
"api_credits_included": False,
}


def markdown() -> str:
return f"## Optional support\n\n[{LABEL}]({STRIPE_URL})\n\n{DESCRIPTION}\n\n"


def html() -> str:
return (f'<h2>Optional support</h2><p class=k><a href="{STRIPE_URL}">'
f'{escape(LABEL)}</a><br>{escape(DESCRIPTION)}</p>')
Loading