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.0

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.0
File Size Uploaded
backloop_sdk-0.1.0.tar.gz 35.0 kB Details

Built distribution (wheel)

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

Total release size: 62.8 kB

Release files / backloop_sdk-0.1.0.tar.gz

Download URL backloop_sdk-0.1.0.tar.gz
Size 35.0 kB
Tags Source
SHA-256 checksum
How to use checksums
708d79bcab9e8dfd73f69d612ebbdfb4bc85e9f1537cf08ab9e668cb2905eeca
BLAKE2b-256 checksum
How to use checksums
b83343bd595899aea17452de35a564ba31d598c3e6d86336dad381f9dbc72282
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.0-py3-none-any.whl

Download URL backloop_sdk-0.1.0-py3-none-any.whl
Size 27.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8fcd2ef761ddb788412b659a4d499f1be81835fc15537eb75fe12200db9f221b
BLAKE2b-256 checksum
How to use checksums
46a156b3d2a5135ca4c4fb896feaa5c9c48839da8003c7a7394b34c215ed5585
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

0.1.1

2 release files

This release

0.1.0 This release

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