Spaces:
Sleeping
Sleeping
import gradio as gr | |
import openai | |
import json | |
from graphviz import Digraph | |
import base64 | |
from PIL import Image | |
def generate_knowledge_graph(api_key, user_input): | |
print("Setting OpenAI API key...") | |
openai.api_key = api_key | |
print("Making API call to OpenAI...") | |
completion = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo-16k", | |
messages=[ | |
{ | |
"role": "user", | |
"content": f"Help me understand following by describing as a detailed knowledge graph: {user_input}", | |
} | |
], | |
functions=[ | |
{ | |
"name": "knowledge_graph", | |
"description": "Generate a knowledge graph with entities and relationships.", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"metadata": {"type": "object"}, | |
"nodes": {"type": "array"}, | |
"edges": {"type": "array"} | |
}, | |
"required": ["nodes", "edges"] | |
} | |
} | |
], | |
function_call={"name": "knowledge_graph"} | |
) | |
print("Received response from OpenAI.") | |
response_data = completion.choices[0]["message"]["function_call"]["arguments"] | |
print(f"Response data: {response_data}") | |
print("Converting response to JSON...") | |
response_dict = json.loads(response_data) | |
print("Generating knowledge graph using Graphviz...") | |
dot = Digraph(comment="Knowledge Graph") | |
# Add nodes to the graph | |
for node in response_dict.get("nodes", []): | |
dot.node(node["id"], f"{node['label']} ({node['type']})") | |
# Add edges to the graph | |
for edge in response_dict.get("edges", []): | |
dot.edge(edge["from"], edge["to"], label=edge["relationship"]) | |
# Render to PNG format | |
print("Rendering graph to PNG format...") | |
dot.format = "png" | |
dot.render(filename="knowledge_graph", cleanup=True) | |
# Convert PNG to base64 to display in Gradio | |
print("Converting PNG to base64...") | |
with open("knowledge_graph.png", "rb") as img_file: | |
img_base64 = base64.b64encode(img_file.read()).decode() | |
print("Returning base64 image to Gradio interface.") | |
return f"data:image/png;base64,{img_base64}" | |
iface = gr.Interface( | |
fn=generate_knowledge_graph, | |
inputs=[ | |
gr.inputs.Textbox(label="OpenAI API Key", type="password"), | |
gr.inputs.Textbox(label="Text to Generate Knowledge Graph") | |
], | |
outputs=gr.outputs.Image(type="pil", label="Generated Knowledge Graph"), | |
live=False | |
) | |
print("Launching Gradio interface...") | |
iface.launch() | |