|
import json |
|
import os |
|
|
|
import requests |
|
|
|
|
|
def get_transcript_for_url(url: str) -> dict: |
|
""" |
|
This function fetches the transcript data for a signed URL. |
|
If the URL results in a direct download, it processes the downloaded content. |
|
|
|
:param url: Signed URL for the JSON file |
|
:return: Parsed JSON data as a dictionary |
|
""" |
|
headers = { |
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" |
|
} |
|
|
|
try: |
|
response = requests.get(url, headers=headers) |
|
response.raise_for_status() |
|
|
|
if "application/json" in response.headers.get("Content-Type", ""): |
|
return response.json() |
|
|
|
|
|
content_disposition = response.headers.get("Content-Disposition", "") |
|
if "attachment" in content_disposition: |
|
|
|
return json.loads(response.content) |
|
|
|
return json.loads(response.content) |
|
|
|
except requests.exceptions.HTTPError as http_err: |
|
print(f"HTTP error occurred: {http_err}") |
|
except requests.exceptions.RequestException as req_err: |
|
print(f"Request error occurred: {req_err}") |
|
except json.JSONDecodeError as json_err: |
|
print(f"JSON decoding error: {json_err}") |
|
|
|
return {} |
|
|
|
|
|
def setup_openai_key() -> None: |
|
"""Set up OpenAI API key from file.""" |
|
try: |
|
with open("api.key", "r") as f: |
|
os.environ["OPENAI_API_KEY"] = f.read().strip() |
|
except FileNotFoundError: |
|
print("Using ENV variable") |
|
|
|
|
|
openai_tools = [ |
|
{ |
|
"type": "function", |
|
"function": { |
|
"name": "correct_speaker_name_with_url", |
|
"description": "If a User provides a link to Agenda file, call the correct_speaker_name_with_url function to correct the speaker names based on the url, i.e if a user says 'Here is the Luma link for the event' and provides a link to the event, the function will correct the speaker names based on the event.", |
|
"parameters": { |
|
"type": "object", |
|
"properties": { |
|
"url": {"type": "string", "description": "The url to the agenda."} |
|
}, |
|
"required": ["url"], |
|
"additionalProperties": False, |
|
}, |
|
}, |
|
}, |
|
{ |
|
"type": "function", |
|
"function": { |
|
"name": "correct_call_type", |
|
"description": "If the user tells you the correct call type, you have to apologize and call this function with correct call type.", |
|
"parameters": { |
|
"type": "object", |
|
"properties": { |
|
"call_type": { |
|
"type": "string", |
|
"description": "The correct call type. If street interview, call type is 'si'.", |
|
} |
|
}, |
|
"required": ["call_type"], |
|
"additionalProperties": False, |
|
}, |
|
}, |
|
}, |
|
{ |
|
"type": "function", |
|
"function": { |
|
"name": "get_image", |
|
"description": "If the user asks you to show crops, you need to call this function", |
|
"parameters": { |
|
"type": "object", |
|
"properties": {}, |
|
"required": [], |
|
"additionalProperties": False, |
|
}, |
|
}, |
|
}, |
|
] |
|
|
|
|
|
css = """ |
|
.gradio-container { |
|
|
|
padding-top: 0px !important; |
|
padding-left: 0px !important; |
|
padding-right: 0px !important; |
|
padding: 0px !important; |
|
margin: 0px !important; |
|
} |
|
.gradio-container > main { |
|
padding: 0px !important; |
|
} |
|
#component-0 { |
|
gap: 0px !important; |
|
} |
|
|
|
.wrapper { |
|
background-color: #181818 !important; |
|
} |
|
|
|
.icon-button-wrapper button[title="Clear"] { |
|
display: none !important; |
|
} |
|
|
|
.image-preview .icon-button-wrapper { |
|
display: block !important; |
|
} |
|
|
|
.image-preview .icon-button-wrapper button[title="Clear"] { |
|
display: block !important; |
|
} |
|
|
|
.download-link { |
|
display: none !important; |
|
} |
|
|
|
footer { |
|
display: none !important; |
|
} |
|
#chatbot_box{ |
|
flex-grow: 1 !important; |
|
border-width: 0px !important; |
|
} |
|
|
|
#link-frame { |
|
position: absolute !important; |
|
width: 1px !important; |
|
height: 1px !important; |
|
right: -100px !important; |
|
bottom: -100px !important; |
|
display: none !important; |
|
} |
|
.html-container { |
|
display: none !important; |
|
} |
|
a { |
|
text-decoration: none !important; |
|
} |
|
#topic { |
|
color: #999 !important; |
|
} |
|
.bubble-wrap { |
|
padding-top: 0px !important; |
|
} |
|
.message-content { |
|
border: 0px !important; |
|
margin: 5px !important; |
|
} |
|
.message-row { |
|
border-style: none !important; |
|
margin: 0px !important; |
|
width: 100% !important; |
|
max-width: 100% !important; |
|
} |
|
.message-row .flex-wrap .message { |
|
border: none !important; |
|
padding: 0px !important; |
|
} |
|
.message-row .flex-wrap .bot { |
|
border: none !important; |
|
padding: 0px !important; |
|
} |
|
.flex-wrap { |
|
border-style: none !important; |
|
} |
|
|
|
.panel-full-width { |
|
border-style: none !important; |
|
border-width: 0px !important; |
|
} |
|
ol { |
|
list-style-position: outside; |
|
margin-left: 20px; |
|
} |
|
#chatbot_textbox{ |
|
background-color: #27272a !important; |
|
} |
|
|
|
body.waiting * { |
|
cursor: progress; |
|
} |
|
""" |
|
head = f""" |
|
<script defer src="https://www.gstatic.com/firebasejs/11.1.0/firebase-firestore.js"></script> |
|
<script type="module"> |
|
// Import the functions you need from the SDKs you need |
|
import {{ initializeApp }} from "https://www.gstatic.com/firebasejs/11.1.0/firebase-app.js"; |
|
import {{ getDatabase, ref, set }} from "https://www.gstatic.com/firebasejs/11.1.0/firebase-database.js"; |
|
// TODO: Add SDKs for Firebase products that you want to use |
|
// https://firebase.google.com/docs/web/setup#available-libraries |
|
console.log("Initializing Firebase"); |
|
// Your web app's Firebase configuration |
|
// For Firebase JS SDK v7.20.0 and later, measurementId is optional |
|
const firebaseConfig = {{ |
|
apiKey: "{os.getenv('FIREBASE_API_KEY')}", |
|
authDomain: "{os.getenv('FIREBASE_AUTH_DOMAIN')}", |
|
databaseURL: "{os.getenv('FIREBASE_DATABASE_URL')}", |
|
projectId: "{os.getenv('FIREBASE_PROJECT_ID')}", |
|
storageBucket: "{os.getenv('FIREBASE_STORAGE_BUCKET')}", |
|
messagingSenderId: "{os.getenv('FIREBASE_MESSAGING_SENDER_ID')}", |
|
appId: "{os.getenv('FIREBASE_APP_ID')}", |
|
measurementId: "{os.getenv('FIREBASE_MEASUREMENT_ID')}" |
|
}}; |
|
|
|
// Initialize Firebase |
|
const app = initializeApp(firebaseConfig); |
|
const realtimeDB = getDatabase(app); |
|
const rollAccount = "{os.getenv('ROLL_ACCOUNT')}"; |
|
const COLLECTIONS = {{ |
|
COLLAB_EDIT_LINK: "collab_link_handler", |
|
}}; |
|
|
|
// Event listener for click |
|
document.addEventListener('click', function (event) {{ |
|
var link = event.target.closest('a'); |
|
event.preventDefault(); |
|
if (link && link.href) {{ |
|
|
|
// Parse the URL to extract 'st' and 'et' |
|
const url = new URL(link.href); |
|
const startTime = url.searchParams.get('st'); |
|
const endTime = url.searchParams.get('et'); |
|
const userId = url.searchParams.get('uid') || ""; |
|
|
|
if (startTime || endTime) {{ |
|
let components = url.pathname.split("/"); |
|
let callId = components[2]; |
|
let recordingSessionId = components[3]; |
|
|
|
let data = {{ |
|
startTime: parseInt(startTime, 10), |
|
endTime: parseInt(endTime, 10), |
|
}}; |
|
|
|
console.log("Data to save:", data); |
|
|
|
// Firebase reference |
|
let reference = ref( |
|
realtimeDB, |
|
`${{rollAccount}}/${{COLLECTIONS.COLLAB_EDIT_LINK}}/${{userId}}/${{callId}}/${{recordingSessionId}}` |
|
); |
|
|
|
set(reference, data) |
|
.then(() => {{ |
|
console.log("Data saved successfully:", data); |
|
}}) |
|
.catch((error) => {{ |
|
console.error("Error saving data:", error); |
|
}}); |
|
}} |
|
}} |
|
}}); |
|
</script> |
|
""" |
|
|
|
js = """function refresh() { |
|
const url = new URL(window.location); |
|
|
|
if (url.searchParams.get('__theme') !== 'dark') { |
|
url.searchParams.set('__theme', 'dark'); |
|
window.location.href = url.href; |
|
} |
|
} |
|
""" |
|
|