Skip to main content

Opinionated Python client for gfa (Git for Agents) — smart routing, session cache, profile-aware hints.

Project description

gfa-sdk — Python SDK for gfa (Git for Agents)

Opinionated Python client for gfa. Picks the right endpoint for the access pattern, caches what is safe to cache, and emits hints when a strategy change would help. Designed for AI agents reading, mutating, and forking gfa-hosted repos.

Install

pip install gfa-sdk

Python >= 3.10 required.

Quickstart

import os
import gfa

client = gfa.Client(
    endpoint=os.environ["GFA_ENDPOINT"],
    token=os.environ["GFA_JWT"],
)

# Profile a repo (cheap, cached for the session)
profile = client.profile_repo("myrepo")
print(f"{profile.file_count_at_head} files, {profile.storage_bytes} bytes")

# Read one file
src = client.read_file("myrepo", "src/main.go")

# Read many files — SDK picks /file vs /files/batch vs partial-clone
files = client.read_files("myrepo", ["a.go", "b.go", "c.go"])

# Create a commit
sha = client.create_commit(
    "myrepo",
    branch="main",
    message="agent: refactor",
    files=[gfa.FileChange(path="a.go", content=b"// rewritten\n")],
)

# Workspace for isolated changes
with client.create_workspace("myrepo", base_ref="main", ttl_hours=2) as ws:
    ws.create_commit(branch="main", message="WIP", files=[...])
    ws.merge()

Smart routing

client.read_files(repo, paths) auto-routes by len(paths):

Count Surface
1 GET /file
2–200 POST /files/batch
> 200 (default) SuggestPartialCloneError — opt into auto_clone=True for automatic partial clone

Threshold tuning:

from gfa import Client, ClientConfig
client = Client(
    endpoint,
    token,
    config=ClientConfig(batch_read_threshold=500),
)

Hints

The SDK emits structured hints when access patterns suggest a strategy change. The default handler writes to stderr; override with a logging hook:

def my_handler(hint):
    logger.info("gfa hint", extra={"code": hint.code, "repo": hint.repo})

client = gfa.Client(endpoint, token, hint_handler=my_handler)

Silence entirely:

client = gfa.Client(endpoint, token, hint_handler=lambda _: None)

Auth

Either a pre-minted JWT string, or a TokenProvider that mints per-call:

provider = gfa.FileKeyTokenProvider("/path/to/preview-jwt-priv.pem", ttl_hours=1)
client = gfa.Client(endpoint, provider)

FileKeyTokenProvider mints ES256 JWTs with sub=<repo>, iat=now, exp=now + ttl_hours. Mirrors the Go tools/mint-token binary.

Diagnostics

client.read_file("myrepo", "x.go")
client.read_files("myrepo", ["a.go", "b.go"])
print(client.stats)
# ClientStats(request_count=2, cache_hit_rate=0.0, ...)

Partial clone

with client.partial_clone("myrepo", filter="blob:none", depth=1) as repo:
    content = repo.read("src/foo.go")

Requires git binary on PATH.

Troubleshooting

Symptom Likely cause
UnauthorizedError Token missing, malformed, or expired
ForbiddenError JWT sub does not match the repo being accessed
SuggestPartialCloneError Asked for too many files; pass auto_clone=True or use partial_clone
GitBinaryMissingError partial_clone needs git on PATH
ConflictError on merge Workspace and source diverged — inspect via conflict_surface()

License

MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gfa_sdk-0.3.0.tar.gz (43.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gfa_sdk-0.3.0-py3-none-any.whl (33.3 kB view details)

Uploaded Python 3

File details

Details for the file gfa_sdk-0.3.0.tar.gz.

File metadata

  • Download URL: gfa_sdk-0.3.0.tar.gz
  • Upload date:
  • Size: 43.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for gfa_sdk-0.3.0.tar.gz
Algorithm Hash digest
SHA256 0a4b4ef17fd3e800a36ba4f68487d00c648ee5dcc1a3668decd51abb3375c3ba
MD5 7ca70789193404d97e93137aa8c854cd
BLAKE2b-256 04ecaa6353169bef595e9dee2a228fe2319dace15040e27998bf4c167c4e6134

See more details on using hashes here.

File details

Details for the file gfa_sdk-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: gfa_sdk-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 33.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for gfa_sdk-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 68f02d8372636436a9e61d0e0168adb35b66a2878e6b386cb1c356eb464e5f7a
MD5 400d4ef94f87222f1808b8911b993fff
BLAKE2b-256 9409828806c9f66eb095beaf18ce583e32f8325dfb7ccc1085c797c5ba65b3cd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page