Skip to content

Commit

Permalink
Merge pull request #200 from mikepsinn/develop
Browse files Browse the repository at this point in the history
getNextQuestion function, moved LLM date extractor to LLM library
  • Loading branch information
mikepsinn authored May 6, 2024
2 parents 42a5731 + 0eae106 commit 5e53efd
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 40 deletions.
18 changes: 0 additions & 18 deletions apps/nextjs/app/api/conversation2measurements/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,3 @@ try {
return handleError(error, "conversation2measurements")
}
}

export async function GET(req: NextRequest) {
const urlParams = Object.fromEntries(new URL(req.url).searchParams);
const statement = urlParams.statement as string;
const previousStatements = urlParams.previousStatements as string | null | undefined;
let timeZoneOffset;
if(urlParams.timeZoneOffset){timeZoneOffset = parseInt(urlParams.timeZoneOffset);}
const utcDateTime = urlParams.utcDateTime as string | null | undefined;

try {
const measurements = await conversation2measurements(statement, utcDateTime, timeZoneOffset, previousStatements);
const userId = await getUserId();
if(userId){await postMeasurements(measurements, userId)}
return NextResponse.json({ success: true, measurements: measurements });
} catch (error) {
return handleError(error, "conversation2measurements")
}
}
39 changes: 38 additions & 1 deletion apps/nextjs/lib/conversation2measurements.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Measurement } from "@/types/models/Measurement";
import {Measurement} from "@/types/models/Measurement";
import {textCompletion} from "@/lib/llm";
import {convertToLocalDateTime, getUtcDateTime} from "@/lib/dateTimeWithTimezone";
import {text2measurements} from "@/lib/text2measurements";

// IMPORTANT! Set the runtime to edge
export const runtime = 'edge';
Expand Down Expand Up @@ -76,3 +77,39 @@ export async function conversation2measurements(statement: string,
});
return measurements;
}

export async function getNextQuestion(currentStatement: string, previousStatements: string | null | undefined): Promise<string> {
let promptText = `
You are a robot designed to collect diet, treatment, and symptom data from the user.
Immediately begin asking the user the following questions
- What did you eat today?
- What did you drink today?
- What treatments did you take today?
- Rate all your symptoms on a scale of 1 to 5.
Also, after asking each question and getting a response, check if there's anything else the user want to add to the first question response. For instance, after getting a response to "What did you eat today?", your next question should be, "Did you eat anything else today?". If they respond in the negative, move on to the next question.
Here is the current user statement:
${currentStatement}
Here are the previous statements in the conversation: ${previousStatements}
`;

return await textCompletion(promptText, "text");
}

export async function haveConversation(statement: string,
utcDateTime: string,
timeZoneOffset: number,
previousStatements: string | null | undefined): Promise<{
questionForUser: string;
measurements: Measurement[]
}> {
let questionForUser = await getNextQuestion(statement, previousStatements);
const measurements = await text2measurements(statement, utcDateTime, timeZoneOffset);
return {
questionForUser,
measurements
}
}
16 changes: 0 additions & 16 deletions apps/nextjs/lib/dateTimeWithTimezone.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import {textCompletion} from "@/lib/llm";

export function getUtcDateTimeWithTimezone() {
const date = new Date();
const timezoneOffset = date.getTimezoneOffset();
Expand Down Expand Up @@ -35,17 +33,3 @@ export function convertToLocalDateTime(utcDateTime: string | number | Date, time
return localDate.toISOString();
}

export async function getDateTimeFromStatement(statement: string): Promise<string> {
const currentDate = getUtcDateTime();
const promptText = `
estimate the date and time of the user statement based on the current date and time ${currentDate}
and the following user statement:
\`\`\`
${statement}
\`\`\`
Return a single string in the format "YYYY-MM-DDThh:mm:ss"`;
let result = await textCompletion(promptText, "text");
// Remove quote marks
result = result.replace(/['"]+/g, '');
return result;
}
26 changes: 24 additions & 2 deletions apps/nextjs/lib/llm.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import OpenAI from 'openai';
import {getUtcDateTime} from "@/lib/dateTimeWithTimezone";
// Create an OpenAI API client (that's edge-friendly!)
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY || '',
Expand All @@ -12,8 +13,15 @@ export async function textCompletion(promptText: string, returnType: "text" | "j
stream: false,
//max_tokens: 150,
messages: [
{"role": "system", "content": `You are a helpful assistant that translates user requests into JSON objects`},
{role: "user", "content": promptText},
{
role: "system",
content: `You are a helpful assistant that translates user requests into JSON objects`
},
{
role: "user", // user = the dFDA app
content: promptText
},

],
response_format: { type: returnType },
});
Expand All @@ -25,3 +33,17 @@ export async function textCompletion(promptText: string, returnType: "text" | "j
return response.choices[0].message.content;
}

export async function getDateTimeFromStatement(statement: string): Promise<string> {
const currentDate = getUtcDateTime();
const promptText = `
estimate the date and time of the user statement based on the current date and time ${currentDate}
and the following user statement:
\`\`\`
${statement}
\`\`\`
Return a single string in the format "YYYY-MM-DDThh:mm:ss"`;
let result = await textCompletion(promptText, "text");
// Remove quote marks
result = result.replace(/['"]+/g, '');
return result;
}
4 changes: 1 addition & 3 deletions apps/nextjs/lib/text2measurements.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import {Measurement} from "@/types/models/Measurement";
import {textCompletion} from "@/lib/llm";
import {getDateTimeFromStatement, textCompletion} from "@/lib/llm";
import {getUserId} from "@/lib/getUserId";
import {postMeasurements} from "@/lib/dfda";
import {
convertToLocalDateTime,
convertToUTC, getDateTimeFromStatement,
getUtcDateTime,
throwErrorIfDateInFuture
} from "@/lib/dateTimeWithTimezone";

Expand Down

0 comments on commit 5e53efd

Please sign in to comment.