Spaces:
Running
Running
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() # Parse and return JSON directly | |
# If not JSON, assume it's a file download (e.g., content-disposition header) | |
content_disposition = response.headers.get("Content-Disposition", "") | |
if "attachment" in content_disposition: | |
# Process the content as JSON | |
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, | |
}, | |
}, | |
}, | |
{ | |
"type": "function", | |
"function": { | |
"name": "generate_broll_suggestions", | |
"description": "Generate B-roll image suggestions for social media clips. Call this function when user asks for B-roll images, video suggestions, or visual content for the clips.", | |
"parameters": { | |
"type": "object", | |
"properties": {}, | |
"required": [], | |
"additionalProperties": False, | |
}, | |
}, | |
}, | |
{ | |
"type": "function", | |
"function": { | |
"name": "find_user_suggested_timestamps", | |
"description": "When user provides suggested clips with estimated timestamps, use this function to find accurate timestamps in the transcript. The user's timestamps may be inaccurate since they were noted by someone in the audience.", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"user_suggestions": { | |
"type": "string", | |
"description": "The user's message containing suggested clips with estimated timestamps", | |
} | |
}, | |
"required": ["user_suggestions"], | |
"additionalProperties": False, | |
}, | |
}, | |
}, | |
] | |
css = """ | |
.gradio-container { | |
padding-top: 0px !important; | |
padding-left: 0px !important; | |
padding-right: 0px !important; | |
padding: 0px !important; | |
margin: 0px !important; | |
} | |
#component-0 { | |
gap: 0px !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 { | |
border-style: none !important; | |
border-width: 0px !important; | |
border: 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; | |
} | |
.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; | |
} | |
.fillable { | |
padding: 0px !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> | |
""" | |