artificialguybr's picture
Update app.py
55d8c0e
raw
history blame
5.29 kB
import gradio as gr
import openai
import json
from graphviz import Digraph
from PIL import Image
import io
def generate_knowledge_graph(api_key, user_input):
openai.api_key = api_key
# Chamar a API da OpenAI
print("Chamando a API da 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. Use the colors to help differentiate between different node or edge types/categories. Always provide light pastel colors that work well with black font.",
"parameters": {
"type": "object",
"properties": {
"metadata": {
"type": "object",
"properties": {
"createdDate": {"type": "string"},
"lastUpdated": {"type": "string"},
"description": {"type": "string"},
},
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {"type": "string"},
"label": {"type": "string"},
"type": {"type": "string"},
"color": {"type": "string"}, # Added color property
"properties": {
"type": "object",
"description": "Additional attributes for the node",
},
},
"required": [
"id",
"label",
"type",
"color",
], # Added color to required
},
},
"edges": {
"type": "array",
"items": {
"type": "object",
"properties": {
"from": {"type": "string"},
"to": {"type": "string"},
"relationship": {"type": "string"},
"direction": {"type": "string"},
"color": {"type": "string"}, # Added color property
"properties": {
"type": "object",
"description": "Additional attributes for the edge",
},
},
"required": [
"from",
"to",
"relationship",
"color",
], # Added color to required
},
},
},
"required": ["nodes", "edges"],
},
}
],
function_call={"name": "knowledge_graph"},
)
response_data = completion.choices[0]["message"]["function_call"]["arguments"]
print(response_data)
print("Type of response_data:", type(response_data))
print("Value of response_data:", response_data)
# Convert to dictionary if it's a string
if isinstance(response_data, str):
response_data = json.loads(response_data)
# Visualizar o conhecimento usando Graphviz
print("Gerando o conhecimento usando Graphviz...")
dot = Digraph(comment="Knowledge Graph")
for node in response_data.get("nodes", []):
dot.node(node["id"], f"{node['label']} ({node['type']})", color=node.get("color", "lightblue"))
for edge in response_data.get("edges", []):
dot.edge(edge["from"], edge["to"], label=edge["relationship"], color=edge.get("color", "black"))
# Renderizar para o formato PNG
print("Renderizando o gráfico para o formato PNG...")
dot.format = "png"
image_data = dot.pipe(format="png")
image = Image.open(io.BytesIO(image_data))
print("Gráfico gerado com sucesso!")
return image
iface = gr.Interface(
fn=generate_knowledge_graph,
inputs=[
gr.inputs.Textbox(label="OpenAI API Key", type="password"),
gr.inputs.Textbox(label="User Input for Graph"),
],
outputs=gr.outputs.Image(type="pil", label="Generated Knowledge Graph"),
live=False,
)
print("Iniciando a interface Gradio...")
iface.launch()