Skip to main content

backloop-sdk

Python SDK for the Agent Feedback Protocol: AI agents POST structured feedback to /feedback on the services they use, so those services learn what agents were trying to do when they got stuck.

  • Standard library only (Python 3.9+). Optional FastAPI and Flask helpers.
  • Validates against the protocol's JSON Schemas.
  • Mirrors the TypeScript SDK (@backloop/sdk): same validation messages, error codes and redaction.
pip install backloop-sdk              # import backloop
pip install "backloop-sdk[fastapi]"   # or [flask]

Agents: send feedback

from backloop import FeedbackClient

client = FeedbackClient("https://api.example.com", api_key=API_KEY, session_id="task_42")

result = client.try_submit({  # never raises: feedback must not break the task
    "type": "missing_capability",
    "goal": "Find companies currently hiring GTM engineers",
    "endpoint": "/companies/search",
    "method": "GET",
    "message": "No hiring-role filter is available",
    "outcome": "blocked",
    "suggestion": "Add a hiring_role query parameter",
})
if result.ok and "known_issue" in result.ack:
    print("Already tracked:", result.ack["known_issue"]["title"])

submit() does the same but raises FeedbackError(message, code, status, details). Both redact secrets, card numbers and emails before sending, and retry once on 429/5xx. Use FeedbackClient.from_discovery(base_url) to find the endpoint through /.well-known/agent-feedback, or feedback_url_from_link(response.headers["link"], url) to read it from an error response.

Give your agent the tool and the instructions:

from backloop import AGENT_FEEDBACK_INSTRUCTIONS, feedback_tool

tools = [feedback_tool()]  # {"name": "submit_feedback", "description", "input_schema"}
# When the model calls it: client.try_submit(tool_use.input)

Services: receive feedback

from backloop import FeedbackHandler, forward_to, hash_account

handler = FeedbackHandler(
    on_record=forward_to("https://collector.example.com", ingest_key=INGEST_KEY),  # or your own callable
    service="acme-companies-api",
    identify=lambda request: hash_account(current_account_id(request), SECRET) if authenticated(request) else None,
)

FastAPI or Flask:

from backloop import fastapi_router, flask_blueprint

app.include_router(fastapi_router(handler))       # FastAPI
app.register_blueprint(flask_blueprint(handler))  # Flask

Both serve POST /feedback and GET /.well-known/agent-feedback. Any other framework calls the handler directly:

status, body, headers = handler.handle_submit(raw_body, content_type, account, client_ip)
document = handler.discovery("https://api.example.com")

on_record(record) stores or forwards each accepted record. Return {"known_issue": {...}} to pass a tracked issue back to the agent. If it raises, the agent gets 503. Add feedback_link_header() as a Link header on your API's error responses so agents find the endpoint.

Utilities

from backloop import validate_submission, format_issues, redact

result = validate_submission(payload)
if not result.valid:
    print(format_issues(result.issues))  # "goal: is required; type: must be one of: ..."

redact({"note": "auth failed with Bearer 9f8e7d6c5b4a", "password": "hunter2"})
# {"note": "auth failed with [REDACTED]", "password": "[REDACTED]"}

Development

python3 -m unittest discover -s tests -t .

The tests run the shared conformance suite in spec/conformance. src/backloop/_generated.py is generated from spec/ by scripts/sync-schema.mjs; don't edit it by hand.

License: Apache-2.0

Metadata

Release files for backloop-sdk 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for backloop-sdk 0.1.1
File Size Uploaded
backloop_sdk-0.1.1.tar.gz 35.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for backloop-sdk 0.1.1
File Interpreter ABI Platform
backloop_sdk-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 62.8 kB

Release files / backloop_sdk-0.1.1.tar.gz

Download URL backloop_sdk-0.1.1.tar.gz
Size 35.0 kB
Tags Source
SHA-256 checksum
How to use checksums
151a94d26d624f6448e293095cba6adf2de9f4f8bb72141fd74ca0f5ae2612c8
BLAKE2b-256 checksum
How to use checksums
9d0095541ac3dd40e77294d4acb14ac918fa1d1ff224773ccea22b1a10b5dd93
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.2

Release files / backloop_sdk-0.1.1-py3-none-any.whl

Download URL backloop_sdk-0.1.1-py3-none-any.whl
Size 27.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0322ca470babd5d19ad4579cae5d3cac31c380f8040945bf337f8481d1f79c2e
BLAKE2b-256 checksum
How to use checksums
d7f1b07007fe68b50e990759afd31323a14b628533135e28382da1309a1cede1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.2

Release history Release notifications | RSS feed

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page