|
|
import json |
|
|
from json.decoder import JSONDecodeError |
|
|
|
|
|
from google.auth.exceptions import RefreshError |
|
|
from google.oauth2.credentials import Credentials |
|
|
from langchain_google_community import GoogleDriveLoader |
|
|
|
|
|
from langflow.custom import Component |
|
|
from langflow.helpers.data import docs_to_data |
|
|
from langflow.inputs import MessageTextInput |
|
|
from langflow.io import SecretStrInput |
|
|
from langflow.schema import Data |
|
|
from langflow.template import Output |
|
|
|
|
|
|
|
|
class GoogleDriveComponent(Component): |
|
|
display_name = "Google Drive Loader" |
|
|
description = "Loads documents from Google Drive using provided credentials." |
|
|
icon = "Google" |
|
|
|
|
|
inputs = [ |
|
|
SecretStrInput( |
|
|
name="json_string", |
|
|
display_name="JSON String of the Service Account Token", |
|
|
info="JSON string containing OAuth 2.0 access token information for service account access", |
|
|
required=True, |
|
|
), |
|
|
MessageTextInput( |
|
|
name="document_id", display_name="Document ID", info="Single Google Drive document ID", required=True |
|
|
), |
|
|
] |
|
|
|
|
|
outputs = [ |
|
|
Output(display_name="Loaded Documents", name="docs", method="load_documents"), |
|
|
] |
|
|
|
|
|
def load_documents(self) -> Data: |
|
|
class CustomGoogleDriveLoader(GoogleDriveLoader): |
|
|
creds: Credentials | None = None |
|
|
"""Credentials object to be passed directly.""" |
|
|
|
|
|
def _load_credentials(self): |
|
|
"""Load credentials from the provided creds attribute or fallback to the original method.""" |
|
|
if self.creds: |
|
|
return self.creds |
|
|
msg = "No credentials provided." |
|
|
raise ValueError(msg) |
|
|
|
|
|
class Config: |
|
|
arbitrary_types_allowed = True |
|
|
|
|
|
json_string = self.json_string |
|
|
|
|
|
document_ids = [self.document_id] |
|
|
if len(document_ids) != 1: |
|
|
msg = "Expected a single document ID" |
|
|
raise ValueError(msg) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
token_info = json.loads(json_string) |
|
|
except JSONDecodeError as e: |
|
|
msg = "Invalid JSON string" |
|
|
raise ValueError(msg) from e |
|
|
|
|
|
|
|
|
loader = CustomGoogleDriveLoader( |
|
|
creds=Credentials.from_authorized_user_info(token_info), document_ids=document_ids |
|
|
) |
|
|
|
|
|
|
|
|
try: |
|
|
docs = loader.load() |
|
|
|
|
|
except RefreshError as e: |
|
|
msg = "Authentication error: Unable to refresh authentication token. Please try to reauthenticate." |
|
|
raise ValueError(msg) from e |
|
|
except Exception as e: |
|
|
msg = f"Error loading documents: {e}" |
|
|
raise ValueError(msg) from e |
|
|
|
|
|
if len(docs) != 1: |
|
|
msg = "Expected a single document to be loaded." |
|
|
raise ValueError(msg) |
|
|
|
|
|
data = docs_to_data(docs) |
|
|
|
|
|
self.status = data |
|
|
return Data(data={"text": data}) |
|
|
|