Skip to main content

This package is an SDK for building secure AI-powered applications using Auth0, Okta FGA and LlamaIndex.

Project description

Auth0 AI for LlamaIndex

auth0-ai-llamaindex is an SDK for building secure AI-powered applications using Auth0, Okta FGA and LlamaIndex.

Release Downloads License

Installation

⚠️ WARNING: auth0-ai-llamaindex is currently under development and it is not intended to be used in production, and therefore has no official support.

pip install auth0-ai-llamaindex

Async User Confirmation

Auth0AI uses CIBA (Client Initiated Backchannel Authentication) to handle user confirmation asynchronously. This is useful when you need to confirm a user action before proceeding with a tool execution.

Full Example of Async User Confirmation.

Define a tool with the proper authorizer specifying a function to resolve the user id:

from auth0_ai_llamaindex.auth0_ai import Auth0AI, set_ai_context
from auth0_ai_llamaindex.ciba import get_ciba_credentials
from llama_index.core.tools import FunctionTool

# If not provided, Auth0 settings will be read from env variables: `AUTH0_DOMAIN`, `AUTH0_CLIENT_ID`, and `AUTH0_CLIENT_SECRET`
auth0_ai = Auth0AI()

with_async_user_confirmation = auth0_ai.with_async_user_confirmation(
    scopes=["stock:trade"],
    audience=os.getenv("AUDIENCE"),
    binding_message=lambda ticker, qty: f"Authorize the purchase of {qty} {ticker}",
    user_id=lambda *_, **__: session["user"]["userinfo"]["sub"],
    # Optional:
    # store=InMemoryStore()
)

def tool_function(ticker: str, qty: int) -> str:
    credentials = get_ciba_credentials()
    headers = {
        "Authorization": f"{credentials["token_type"]} {credentials["access_token"]}",
        # ...
    }
    # Call API

trade_tool = with_async_user_confirmation(
    FunctionTool.from_defaults(
        name="trade_tool",
        description="Use this function to trade a stock",
        fn=tool_function,
        # ...
    )
)

# Set the thread ID to associate with the retrieved credentials
set_ai_context("<thread-id>")

CIBA with RAR (Rich Authorization Requests)

Auth0AI supports RAR (Rich Authorization Requests) for CIBA. This allows you to provide additional authorization parameters to be displayed during the user confirmation request.

When defining the tool authorizer, you can specify the authorization_details parameter to include detailed information about the authorization being requested:

with_async_user_confirmation = auth0_ai.with_async_user_confirmation(
    scopes=["stock:trade"],
    audience=os.getenv("AUDIENCE"),
    binding_message=lambda ticker, qty: f"Authorize the purchase of {qty} {ticker}",
    authorization_details=lambda ticker, qty: [
        {
            "type": "trade_authorization",
            "qty": qty,
            "ticker": ticker,
            "action": "buy"
        }
    ],
    user_id=lambda *_, **__: ensure_config().get("configurable", {}).get("user_id"),
    # Optional:
    # store=InMemoryStore()
)

To use RAR with CIBA, you need to set up authorization details in your Auth0 tenant. This includes defining the authorization request parameters and their types. Additionally, the Guardian SDK is required to handle these authorization details in your authorizer app.

For more information on setting up RAR with CIBA, refer to:

Authorization for Tools

The FGAAuthorizer can leverage Okta FGA to authorize tools executions. The FGAAuthorizer.create function can be used to create an authorizer that checks permissions before executing the tool.

Full Example of Authorization for Tools.

  1. Create an instance of FGA Authorizer:
from auth0_ai_llamaindex.fga import FGAAuthorizer

# If not provided, FGA settings will be read from env variables: `FGA_STORE_ID`, `FGA_CLIENT_ID`, `FGA_CLIENT_SECRET`, etc.
fga = FGAAuthorizer.create()
  1. Define the FGA query (build_query) and, optionally, the on_unauthorized handler:
def build_fga_query(tool_input):
    return {
        "user": f"user:{context.get("user_id")}",
        "object": f"asset:{tool_input["ticker"]}",
        "relation": "can_buy",
        "context": {"current_time": datetime.now(timezone.utc).isoformat()}
    }

def on_unauthorized(tool_input):
    return f"The user is not allowed to buy {tool_input["qty"]} shares of {tool_input["ticker"]}."

use_fga = fga(
    build_query=build_fga_query,
    on_unauthorized=on_unauthorized,
)

Note: The parameters given to the build_query and on_unauthorized functions are the same as those provided to the tool function.

  1. Wrap the tool:
from llama_index.core.tools import FunctionTool

async def buy_tool_function(ticker: str, qty: int) -> str:
        # TODO: implement buy operation
        return f"Purchased {qty} shares of {ticker}"

func=use_fga(buy_tool_function)

return FunctionTool.from_defaults(
    fn=func,
    async_fn=func,
    name="buy",
    description="Use this function to buy stocks",
)

Calling APIs On User's Behalf

The Auth0AI.with_federated_connection function exchanges user's refresh token for a Federated Connection API access token.

Full Example of Calling APIs On User's Behalf.

Define a tool with the proper authorizer specifying a function to resolve the user's refresh token:

from auth0_ai_llamaindex.auth0_ai import Auth0AI, set_ai_context
from auth0_ai_llamaindex.federated_connections import get_credentials_for_connection
from llama_index.core.tools import FunctionTool

# If not provided, Auth0 settings will be read from env variables: `AUTH0_DOMAIN`, `AUTH0_CLIENT_ID`, and `AUTH0_CLIENT_SECRET`
auth0_ai = Auth0AI()

with_google_calendar_access = auth0_ai.with_federated_connection(
    connection="google-oauth2",
    scopes=["https://www.googleapis.com/auth/calendar.freebusy"],
    refresh_token=lambda *_args, **_kwargs: session["user"]["refresh_token"],
    # Optional:
    # store=InMemoryStore()
)

def tool_function(date: datetime):
    credentials = get_credentials_for_connection()
    # Call Google API using credentials["access_token"]

check_calendar_tool = with_google_calendar_access(
    FunctionTool.from_defaults(
        name="check_user_calendar",
        description="Use this function to check if the user is available on a certain date and time",
        fn=tool_function,
        # ...
    )
)

# Set the thread ID to associate with the retrieved credentials
set_ai_context("<thread-id>")

RAG with FGA

The FGARetriever can be used to filter documents based on access control checks defined in Okta FGA. This retriever performs batch checks on retrieved documents, returning only the ones that pass the specified access criteria.

Full Example of RAG Application.

from llama_index.core import VectorStoreIndex, Document
from auth0_ai_llamaindex import FGARetriever
from openfga_sdk.client.models import ClientCheckRequest
from openfga_sdk import ClientConfiguration
from openfga_sdk.credentials import CredentialConfiguration, Credentials

# Define some docs:
documents = [
    Document(text="This is a public doc", doc_id="public-doc"),
    Document(text="This is a private doc", doc_id="private-doc"),
]

# Create a vector store:
vector_store = VectorStoreIndex.from_documents(documents)

# Create a retriever:
base_retriever = vector_store.as_retriever()

# Create the FGA retriever wrapper.
# If not provided, FGA settings will be read from env variables: `FGA_STORE_ID`, `FGA_CLIENT_ID`, `FGA_CLIENT_SECRET`, etc.
retriever = FGARetriever(
    base_retriever,
    build_query=lambda node: ClientCheckRequest(
        user=f'user:{user}',
        object=f'doc:{node.ref_doc_id}',
        relation="viewer",
    )
)

# Create a query engine:
query_engine = RetrieverQueryEngine.from_args(
    retriever=retriever,
    llm=OpenAI()
)

# Query:
response = query_engine.query("What is the forecast for ZEKO?")

print(response)

Auth0 Logo

Auth0 is an easy to implement, adaptable authentication and authorization platform. To learn more checkout Why Auth0?

This project is licensed under the Apache 2.0 license. See the LICENSE file for more info.

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

auth0_ai_llamaindex-1.0.0b3.tar.gz (12.9 kB view details)

Uploaded Source

Built Distribution

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

auth0_ai_llamaindex-1.0.0b3-py3-none-any.whl (14.6 kB view details)

Uploaded Python 3

File details

Details for the file auth0_ai_llamaindex-1.0.0b3.tar.gz.

File metadata

  • Download URL: auth0_ai_llamaindex-1.0.0b3.tar.gz
  • Upload date:
  • Size: 12.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for auth0_ai_llamaindex-1.0.0b3.tar.gz
Algorithm Hash digest
SHA256 0670a5517f540ff9c63a4e42e09826c0741869b228a8766e4a649d971be18d2d
MD5 1c29f0f70a0ccf8266bf75fcf65c2cc8
BLAKE2b-256 22d9b792b6107e92cbe44df6dcb35c8eff9f0e5ace6de73fc0ba01dd0674fb5a

See more details on using hashes here.

File details

Details for the file auth0_ai_llamaindex-1.0.0b3-py3-none-any.whl.

File metadata

File hashes

Hashes for auth0_ai_llamaindex-1.0.0b3-py3-none-any.whl
Algorithm Hash digest
SHA256 a94594849c0c678e99c94be550c0b66405fd19abb6c75ecf5854e920d00879bd
MD5 2d77b85f2dd3740cffd697e6959a8905
BLAKE2b-256 c92fa5ff30039e5aa545d1aa78533ef63fa7fd7d829129c7ea24ad787c59c6d5

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