vishanth10
Update on fetch files and other search bug
1d27410
import streamlit as st
from carbon import Carbon
from decimal import Decimal
import requests
import json
# Constants
CARBON_API_KEY = "a38ee1fe5fef56fc8e1ae2afc881378804bb902882442e1554adae4f82ee23ea"
CUSTOMER_ID = "Candid"
# Initialize Carbon SDK
carbon = Carbon(api_key=CARBON_API_KEY, customer_id=CUSTOMER_ID)
# Authenticate and get OAuth URL for Google Drive
def get_google_drive_oauth(carbon):
get_oauth_url_response = carbon.integrations.get_oauth_url(
service="GOOGLE_DRIVE",
scope="https://www.googleapis.com/auth/drive.readonly",
connecting_new_account=True,
)
return get_oauth_url_response.oauth_url
# Authenticate and get OAuth URL for Dropbox
def get_dropbox_oauth(carbon):
get_oauth_url_response = carbon.integrations.get_oauth_url(
service="DROPBOX",
connecting_new_account=True,
)
return get_oauth_url_response.oauth_url
# Authenticate and get OAuth URL for Notion
def get_notion_oauth(carbon):
get_oauth_url_response = carbon.integrations.get_oauth_url(
service="NOTION",
connecting_new_account=True,
)
return get_oauth_url_response.oauth_url
# Get data source ID
def get_data_source_id(service):
response = carbon.data_sources.query_user_data_sources(
pagination={"limit": 100, "offset": 0},
order_by="created_at",
order_dir="desc",
filters={"source": service},
)
return response.results[0].id
# List files in the data source
def list_files(data_source_id):
response = carbon.integrations.list_data_source_items(
data_source_id=data_source_id,
filters={},
pagination={"limit": 250, "offset": 0},
)
return response.items
# List all data sources associated with the user
def list_user_data_sources():
response = carbon.data_sources.query_user_data_sources(
pagination={"limit": 100, "offset": 0},
order_by="created_at",
order_dir="desc",
)
return response.results
# List files uploaded by the user
def list_uploaded_files(data_source_id):
url = "https://api.carbon.ai/user_files_v2"
payload = {
"pagination": {
"limit": 100,
"offset": 0
},
"order_by": "created_at",
"order_dir": "desc",
"filters": {
"organization_user_data_source_id": [], #data_source_id organization level need to explore
"embedding_generators": ["OPENAI"],
"include_all_children": True,
},
"include_raw_file": True,
"include_parsed_text_file": True,
"include_additional_files": True
}
headers = {
"authorization": f"Bearer {CARBON_API_KEY}",
"customer-id": CUSTOMER_ID,
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
return response.json()['results']
# Search function
def search_documents(query, file_ids):
url = "https://api.carbon.ai/embeddings"
payload = {
"query": query,
"k": 2,
"file_ids": [],
"include_all_children": True,
"include_tags": True,
"include_vectors": True,
"include_raw_file": True,
"hybrid_search": False,
"hybrid_search_tuning_parameters": {
"weight_a": 0.5,
"weight_b": 0.5
},
"media_type": "TEXT",
"embedding_model": "OPENAI"
}
headers = {
"authorization": f"Bearer {CARBON_API_KEY}",
"customer-id": CUSTOMER_ID,
"Content-Type": "application/json"
}
#response = requests.post(url, json=payload, headers=headers)
response = requests.request("POST", url, json=payload, headers=headers)
#print(response.json())
return response.json()['documents']
# Streamlit UI
st.title("Data Connector using Carbon SDK")
# Authenticate with Carbon API
st.header("Authenticate with Carbon API")
# Connect to Data Source
st.subheader("Connect to Data Source")
data_source = st.selectbox("Select Data Source for OAuth", ["GOOGLE_DRIVE", "DROPBOX", "NOTION"])
if st.button("Get OAuth URL"):
if data_source == "GOOGLE_DRIVE":
oauth_url = get_google_drive_oauth(carbon)
elif data_source == "DROPBOX":
oauth_url = get_dropbox_oauth(carbon)
elif data_source == "NOTION":
oauth_url = get_notion_oauth(carbon)
st.write(f"OAuth URL for {data_source}: {oauth_url}")
st.markdown(f'<a href="{oauth_url}" target="_blank">Authenticate {data_source}</a>', unsafe_allow_html=True)
# List User Data Sources
st.subheader("List Data Sources")
if st.button("List Data Sources"):
data_sources = list_user_data_sources()
st.write("Data Sources associated with the user:")
for ds in data_sources:
st.write(f"ID: {ds.id}, External ID: {ds.data_source_external_id}, Type: {ds.data_source_type}, "
f"Sync Status: {ds.sync_status}, Created At: {ds.created_at}, Updated At: {ds.updated_at}")
# List Files in Data Source
st.subheader(f"List Files in {data_source}")
if st.button("List Files"):
data_source_id = get_data_source_id(data_source)
files = list_files(data_source_id)
st.write(f"Files in {data_source}:")
for file in files:
st.write(file.name)
# List Uploaded Files
st.subheader("Documents Uploaded Result")
# data_source_search = st.selectbox("Select Data Source for OAuth", ["GOOGLE_DRIVE", "DROPBOX", "NOTION"])
# if st.button("Submit"):
# data_source_search
file_ids = []
if st.button("Show Uploaded Files"):
data_source_id = get_data_source_id(data_source)
uploaded_files = list_uploaded_files(data_source_id)
st.write("Uploaded Files:")
#print(uploaded_files)
for file in uploaded_files:
st.write(f"ID: {file['id']}, Name: {file['name']}, Organization Supplied User ID: {file['organization_supplied_user_id']}, "
f"Organization User Data Source ID: {file['organization_user_data_source_id']}, External URL: {file['external_url']}")
file_ids.append(file['id'])
#print( file_ids)
# Search Documents
st.subheader("Search Documents")
query = st.text_input("Enter your search query:")
if st.button("Search"):
if query:
#print(file_ids)
search_results = search_documents(query, file_ids)
st.write("Search Results:")
for result in search_results:
st.write(f"Source: {result['source']}")
st.write(f"Title: {result['content']}")
st.write(f"Source URL: {result['source_url']}")
st.write(f"Source Type: {result['source_type']}")
st.write(f"Presigned URL: {result['presigned_url']}")
st.write(f"Tags: {result['tags']}")
st.write("-------------------------------------------------")
# # Add chat interface using custom HTML/CSS
# st.subheader("Chat Interface")
# chat_input = st.text_input("Enter your query:")
# if st.button("Send"):
# if chat_input:
# st.markdown(f'<div class="chat-bubble user">{chat_input}</div>', unsafe_allow_html=True)
# # Placeholder for bot response (add your processing logic here)
# bot_response = "This is a bot response."
# st.markdown(f'<div class="chat-bubble bot">{bot_response}</div>', unsafe_allow_html=True)
# Custom CSS for chat bubbles
st.markdown("""
<style>
.chat-bubble {
padding: 10px 15px;
border-radius: 10px;
margin: 5px 0;
max-width: 60%;
}
.user {
background-color: lightblue;
align-self: flex-end;
}
.bot {
background-color: darkgray;
align-self: flex-start;
}
</style>
""", unsafe_allow_html=True)