Create a Streamlit app which contain a UI to conect ChatGPT Team with Sharepoint
To upload files, please first save the app
import streamlit as st
import os
from office365.runtime.auth.client_credential import ClientCredential
from office365.sharepoint.client_context import ClientContext
from openai import OpenAI
import pandas as pd
from datetime import datetime
# Page config
st.set_page_config(page_title="SharePoint-ChatGPT Connector", layout="wide")
# Initialize session state
if 'authenticated' not in st.session_state:
st.session_state.authenticated = False
if 'messages' not in st.session_state:
st.session_state.messages = []
# Sidebar for SharePoint configuration
with st.sidebar:
st.title("Configuration")
# SharePoint credentials
st.subheader("SharePoint Settings")
sharepoint_site = st.text_input("SharePoint Site URL")
client_id = st.text_input("Client ID", type="password")
client_secret = st.text_input("Client Secret", type="password")
# OpenAI API key
st.subheader("OpenAI Settings")
openai_api_key = st.text_input("OpenAI API Key", type="password")
# Connect button
if st.button("Connect"):
try:
# Initialize SharePoint client
client_credentials = ClientCredential(client_id, client_secret)
ctx = ClientContext(sharepoint_site).with_credentials(client_credentials)
# Test connection
web = ctx.web
ctx.load(web)
ctx.execute_query()
# Initialize OpenAI client
client = OpenAI(api_key=openai_api_key)
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "system", "content": "Connection test"}],
max_tokens=5
)
st.session_state.authenticated = True
st.session_state.ctx = ctx
st.session_state.client = client
st.success("Successfully connected!")
except Exception as e:
st.error(f"Connection failed: {str(e)}")
st.session_state.authenticated = False
# Main content
st.title("SharePoint-ChatGPT Connector")
if st.session_state.authenticated:
# Create tabs for different functionalities
tab1, tab2 = st.tabs(["Document Chat", "List Management"])
with tab1:
st.header("Chat with SharePoint Documents")
# Document library selection
try:
lists = st.session_state.ctx.web.lists
st.session_state.ctx.load(lists)
st.session_state.ctx.execute_query()
document_libraries = [lst for lst in lists if lst.is_document_library]
selected_library = st.selectbox(
"Select Document Library",
options=[lib.title for lib in document_libraries]
)
if selected_library:
# Get documents from selected library
selected_lib = next(lib for lib in document_libraries if lib.title == selected_library)
items = selected_lib.items
st.session_state.ctx.load(items)
st.session_state.ctx.execute_query()
# Display documents in a dataframe
docs_df = pd.DataFrame(
[(item.properties['Title'], item.properties['Modified'])
for item in items],
columns=['Title', 'Modified']
)
st.dataframe(docs_df)
# Chat interface
if prompt := st.chat_input("Ask about the documents"):
st.session_state.messages.append({"role": "user", "content": prompt})
# Display user message
with st.chat_message("user"):
st.write(prompt)
# Get AI response
with st.chat_message("assistant"):
response = st.session_state.client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant that helps users understand SharePoint documents."},
*st.session_state.messages
]
)
assistant_response = response.choices[0].message.content
st.write(assistant_response)
st.session_state.messages.append({"role": "assistant", "content": assistant_response})
except Exception as e:
st.error(f"Error accessing SharePoint: {str(e)}")
with tab2:
st.header("SharePoint List Management")
# List selection
try:
lists = st.session_state.ctx.web.lists
st.session_state.ctx.load(lists)
st.session_state.ctx.execute_query()
selected_list = st.selectbox(
"Select List",
options=[lst.title for lst in lists if not lst.is_document_library]
)
if selected_list:
# Get items from selected list
selected_lst = next(lst for lst in lists if lst.title == selected_list)
items = selected_lst.items
st.session_state.ctx.load(items)
st.session_state.ctx.execute_query()
# Display items in a dataframe
list_df = pd.DataFrame(
[(item.properties['Title'], item.properties['Modified'])
for item in items],
columns=['Title', 'Modified']
)
st.dataframe(list_df)
# Add new item section
st.subheader("Add New Item")
new_title = st.text_input("Title")
if st.button("Add Item"):
try:
selected_lst.add_item({'Title': new_title})
st.success("Item added successfully!")
st.rerun()
except Exception as e:
st.error(f"Error adding item: {str(e)}")
except Exception as e:
st.error(f"Error accessing SharePoint lists: {str(e)}")
else:
st.info("Please configure your SharePoint and OpenAI credentials in the sidebar to get started.")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?