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.1.3.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.1.3-py3-none-any.whl (33.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: gfa_sdk-0.1.3.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.1.3.tar.gz
Algorithm Hash digest
SHA256 113313bebbd07b50db3839001b8568d345aea86141d23b46c3b535d07eca7bce
MD5 9bf1f36cf1db6985657e3758a21840d2
BLAKE2b-256 935d1fd990c99d7732992dc6062a54e982ecd7faa3c188f614baa461a09214d7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gfa_sdk-0.1.3-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.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 3caf491d35958e78bde56e36ea2651bf65ba6bedc80beb741dd6138cff6fd6f0
MD5 36b063ab2e21f292d443e17bb3b943bf
BLAKE2b-256 04a1f812bfd59c07c5c2f0e7060bb38fab516b247c93171ddab01f647ede7264

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