Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions functions/api/generateCollabDiagram.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
const { db } = require("../admin");
const { openai } = require("../helpers/openai");

const extractJSON = text => {
try {
const start = text.indexOf("{");
const end = text.lastIndexOf("}");
if (end === -1 || start === -1) {
return { jsonObject: {}, isJSON: false };
}
const jsonArrayString = text.slice(start, end + 1);
return { jsonObject: JSON.parse(jsonArrayString), isJSON: true };
} catch (error) {
return { jsonObject: {}, isJSON: false };
}
};

module.exports = async (req, res) => {
try {
const { documentDetailed } = req.body;
const promptDoc = await db.collection("diagramPrompts").doc("generate").get();
const promptData = promptDoc.data();
const llmPrompt = promptData.prompt;
console.log("llmPrompt", llmPrompt);
const prompt = `
${llmPrompt}
${documentDetailed}`;

const messages = [
{
role: "user",
content: prompt
}
];
const model = "o1";
const completion = await openai.chat.completions.create({
messages,
model
});
const response = extractJSON(completion.choices[0].message.content || "").jsonObject;
console.log(response);
if (!response?.groupHierarchy || !response?.nodes || !response?.links) {
throw Error("Incomplete JSON");
}
return res.status(200).json({ response });
} catch (e) {
console.error(e);
return res.status(500).json({
message: e.message
});
}
};
103 changes: 103 additions & 0 deletions functions/api/improveCollabDiagram.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
const { db } = require("../admin");
/* const { openai } = require("../helpers/openai"); */

const extractJSON = text => {
try {
const start = text.indexOf("{");
const end = text.lastIndexOf("}");
if (end === -1 || start === -1) {
return { jsonObject: {}, isJSON: false };
}
const jsonArrayString = text.slice(start, end + 1);
return { jsonObject: JSON.parse(jsonArrayString), isJSON: true };
} catch (error) {
return { jsonObject: {}, isJSON: false };
}
};
module.exports = async (req, res) => {
try {
return res.status(200).json({ response: "response" });
/* const { newText, diagramId } = req.body;

// Retrieve documents for nodes, groups, and links
const nodesSnapshot = await db.collection("nodes").where("diagramId", "array-contains", diagramId).get();
const groupsSnapshot = await db.collection("groups").where("diagramId", "array-contains", diagramId).get();
const linksSnapshot = await db.collection("links").where("diagramId", "array-contains", diagramId).get();

// Process nodes and include doc.id so we can map IDs to labels.
const nodes = nodesSnapshot.docs.map(doc => {
const data = doc.data();
data.id = doc.id;
delete data.diagrams;
return data;
});

// Build a map from node IDs to their labels
const nodeLabelMap = {};
nodes.forEach(node => {
nodeLabelMap[node.id] = node.label;
});

// Process groups
const groups = groupsSnapshot.docs.map(doc => {
const data = doc.data();
delete data.diagrams;
return data;
});

// Process links and replace source/target IDs with the corresponding node labels
const links = linksSnapshot.docs.map(doc => {
const data = doc.data();
delete data.diagrams;
data.source = nodeLabelMap[data.source] || data.source;
data.target = nodeLabelMap[data.target] || data.target;
return data;
});

const previousDiagram = { nodes, groups, links };
const promptDoc = await db.collection("diagramPrompts").doc("improve").get();
const promptData = promptDoc.data();
const llmPrompt = promptData.prompt;
const prompt = `
${llmPrompt}

**Existing Causal Loop Diagram**:
${previousDiagram}

**New Text Data**:
${newText}`;

const completion = await openai.chat.completions.create({
messages: [{ content: prompt, role: "user" }],
model: "o1",
temperature: 0
});

const response = completion.choices[0].message.content;

const isJSONObject = extractJSON(response || "");

if (!isJSONObject.isJSON) {
return res.status(400).json({
message: "Invalid response from the model."
});
}

return res.status(200).json(
isJSONObject.jsonObject.modifications.map(modification => {
if (modification.level === "Node" && modification.type === "Modify") {
modification.targetId = nodes.find(node => node.label === modification.targetId).id;
}
if (modification.level === "Link" && modification.type === "Modify") {
modification.targetId = links.find(link => link.source === modification.targetId).id;
}
return modification;
})
); */
} catch (e) {
console.error(e);
return res.status(500).json({
message: e.message
});
}
};
6 changes: 6 additions & 0 deletions functions/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ const signUp = require("./api/signUp");
const researchersRouter = require("./api/researchers");
const participantsRouter = require("./api/participants");
const adminRouter = require("./api/administrator");
const generateCollabDiagram = require("./api/generateCollabDiagram");
const improveCollabDiagram = require("./api/improveCollabDiagram");

const EST_TIMEZONE = "America/Detroit";
process.env.TZ = EST_TIMEZONE;
Expand Down Expand Up @@ -111,6 +113,10 @@ app.post("/recordAudio", recordAudio);
app.post("/assignThematicPoints", assignThematicPoints);
// Knowledge endpoints
app.post("/inviteInstructors", inviteInstructors);

app.post("/generateCollabDiagram", generateCollabDiagram);
app.post("/improveCollabDiagram", improveCollabDiagram);

// Misinformation Experiment
// app.get("/card", card);
// app.get("/image*", image);
Expand Down
11 changes: 11 additions & 0 deletions functions/helpers/openai.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const { OpenAI } = require("openai");
require("dotenv").config();

const openai = new OpenAI({
apiKey: process.env.API_KEY,
organization: process.env.ORG_ID
});

module.exports = {
openai
};
10 changes: 4 additions & 6 deletions functions/helpers/send-prompt.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
const { Configuration } = require("openai");
const { OpenAIApi } = require("openai");
const { OpenAI } = require("openai");
require("dotenv").config();

const configuration = new Configuration({
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY ?? "",
organization: process.env.OPENAI_API_ORG_ID ?? ""
});

const openai = new OpenAIApi(configuration);

const sendPromptAndReceiveResponse = async ({ model, prompt }) => {
try {
const completion = await openai.createChatCompletion({
const completion = await openai.chat.completions({
model,
temperature: 0,
messages: [{ role: "user", content: prompt }]
Expand Down
Loading
Loading