LangNoter / app.py
SinDarSoup's picture
fix install
986e43a
import os
import subprocess
def install():
subprocess.check_call([os.sys.executable, "-m", "pip", "install", "-r", "requirements.txt"])
install()
import gradio as gr
from utils.caller.llm_client import (
chat_completions,
image_to_one_of_content,
tts,
)
from utils.learner.learner import (
get_default_system_prompt,
DefaultTool,
)
from tempfile import NamedTemporaryFile
import re
import json
def extract_json_from_code_block(text):
pattern = r'```json\s*([\s\S]*?)\s*```'
matches = re.findall(pattern, text)
json_objects = []
for match in matches:
try:
json_obj = json.loads(match)
json_objects.append(json_obj)
except json.JSONDecodeError:
continue # Skip invalid JSON
return json_objects
def gr_msg_to_openai_msg(gr_message, role="user"):
content = []
content.append({
"type":"text",
"text": gr_message.get("text")
})
for image_path in gr_message.get("files"):
try:
content.append(image_to_one_of_content(image_path))
except Exception as e:
gr.Warning(f"fail to load {image_path}, error msg {e}", duration=5)
return {
"role":role,
"content": content,
}
async def chat_fn(gr_message, history, model, state_openai_messages:list, state_audios:list):
gr_response = {
"text":"",
"files":[],
}
openai_message = gr_msg_to_openai_msg(gr_message)
if not state_openai_messages:
state_openai_messages = [
{
"role":"system",
"content":get_default_system_prompt(),
}
]
state_openai_messages.append(openai_message)
gr.Info("start text generation")
response = chat_completions(
messages=state_openai_messages,
model=model,
)
text = response.choices[0].message.content
state_openai_messages.append(response.choices[0].message)
gr_response["text"] = text
gr.Info("finish text generation")
yield gr_response, state_openai_messages, state_audios
J_list = extract_json_from_code_block(text)
if len(J_list) > 0:
J = J_list[0]
M = DefaultTool(**J)
for item in M.records:
try:
data = item.foreign.data
gr.Info(f"Start STT ({data})")
tmp_file_name = NamedTemporaryFile(
suffix=".mp3",
delete=True,
).name
tts(input=data).stream_to_file(tmp_file_name)
gr_response["files"].append(tmp_file_name)
gr.Info(f"END STT ({data})")
except Exception as e:
gr.Warning(f"Fail to generate audio. {e}")
yield gr_response, state_openai_messages, state_audios
with gr.Blocks() as demo:
gr.Markdown("# Lang Thrower")
state_openai_messages = gr.State([]) # The state for openai usage
state_audios = gr.State([
# {"text":"...", "path":"..."}
])
model = gr.Text("gpt-4o", label="model_name",)
textbox = gr.MultimodalTextbox(
file_types=["image"],
file_count="multiple",
placeholder="Please give text and image.",
)
chat_interface = gr.ChatInterface(
fn=chat_fn,
textbox=textbox,
additional_inputs=[model, state_openai_messages, state_audios],
additional_outputs=[state_openai_messages, state_audios],
)
if __name__ == "__main__":
demo.launch(debug=True)