SDKs

Python SDK

The official Python library for Connect with rNet and AI requests. The repository includes a Flask example.

PyPIrnet-oauth· Python 3.11 or later

Install

bash
pip install rnet-oauth

Create the clients

Use the Client ID and secret from your registered app. The model is chosen when you create the ModelClient.

python
import os
from rnet_oauth import RNetOAuthClient, ModelClient

auth = RNetOAuthClient(
    client_id=os.environ["RNET_CLIENT_ID"],
    client_secret=os.environ["RNET_CLIENT_SECRET"],
    redirect_uri="https://yourapp.com/callback",
)

ai = ModelClient("gemini-2.5-flash-lite")

Start Connect with rNet

python
import secrets

pkce = auth.generate_pkce()
state = secrets.token_urlsafe(16)
session["rnet"] = {"verifier": pkce["verifier"], "state": state}

return redirect(auth.get_authorization_url(pkce["challenge"], state=state))

Exchange the code for tokens

python
# GET /callback?code=...&state=...
saved = session.pop("rnet")
if request.args.get("state") != saved["state"]:
    abort(400)

tokens = auth.exchange_code_for_token(request.args["code"], saved["verifier"])
session["rnet"] = {
    "access_token": tokens["access_token"],
    "refresh_token": tokens.get("refresh_token"),
}

Refresh the access token

python
tokens = auth.refresh_access_token(session["rnet"]["refresh_token"])
session["rnet"]["access_token"] = tokens["access_token"]
session["rnet"]["refresh_token"] = tokens["refresh_token"]  # keep the new one

Get the user profile

python
user = auth.get_user_info(access_token)
print(user["email"], user["name"])

Call a model

python
response = ai.chat({
    "contents": [{"role": "user", "parts": [{"text": "Write a haiku about credits."}]}]
}, access_token)

print(response)

Stream a response

python
for chunk in ai.chat_stream(payload, access_token):
    print(chunk, end="")

Handle errors

python
import re

try:
    response = ai.chat(payload, access_token)
except RuntimeError as err:
    # SDK errors look like: "Request failed: 402 - Insufficient funds"
    match = re.search(r"Request failed: (\d{3})", str(err))
    status = int(match.group(1)) if match else None

    if status == 401:
        ...  # refresh the access token and retry once
    elif status == 402:
        ...  # out of credits: ask the user to top up at rnetai.org/user-home
    elif status == 429:
        ...  # too many requests: wait and retry
    else:
        raise