Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gpt4 #46

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft

Gpt4 #46

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
42 changes: 36 additions & 6 deletions app/api/chewbacca/generateRequirementResponse/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export const POST = async (
req: NextRequest,
res: NextResponse,
): Promise<Response> => {
const { employeeAlias, requirement } = await req.json();
const { employeeAlias, requirement, name, concise, gpt4 } = await req.json();

const session = (await getServerSession(authOptions)) as CustomSession;
if (
Expand All @@ -63,7 +63,14 @@ export const POST = async (
return new Response(JSON.stringify({}), { status: 400 });
}

const result = await generateRequirementResponse(rc, token, employeeAlias);
const result = await generateRequirementResponse(
rc,
token,
employeeAlias,
name,
concise,
gpt4,
);

return new Response(JSON.stringify(result), { status: 200 });
};
Expand Down Expand Up @@ -109,6 +116,11 @@ async function generateKeywordsFromRequirements(
competencies: string[],
): Promise<RequirementCompetency> {
const example: ChatCompletionRequestMessage[] = [
{
role: "system",
content:
"Det du skriver, skal brukes i et skript. Ikke diverger fra output-format. Bare bruk ord fra Nøkkelordliste i svaret.",
},
{
role: "user",
content:
Expand Down Expand Up @@ -146,6 +158,9 @@ async function generateRequirementResponse(
requirement: RequirementCompetency,
token: string,
employeeAlias: string,
name: string,
concise: boolean,
gpt4: boolean,
): Promise<RequirementResponse> {
const projectExperienceResponse = await findRelevantProjectForCompetencies(
token,
Expand All @@ -166,25 +181,40 @@ async function generateRequirementResponse(
projects: [],
};
}
const prompt: string = `bruk tabellen under og svar på kravet.
const prompt: string = `bruk tabellen under og svar på hvordan ${name} møter kravet
Prosjekt med prosjektnavn og kundenavn når du referer til prosjekt.
Bruk sitater som er relevant for kravet i teksten.
Du kan ikke forvente at leser kjenner til tabellen.
Du skal lage en sammenhengende tekst og ikke en tabell.
Argumenter best mulig hvordan prosjektene svarer mot kravet.
Ikke ta med informasjon som ikke er relevant for kravet.
krav : ${
requirement.requirement
} tabell med utvalgte prosjekt: prosjektnavn,kundenavn,beskrivelse,rolle\n ${relevantProjects
} tabell med utvalgte prosjekt: prosjektnavn,kundenavn,beskrivelse,rollene til ${name}\n ${relevantProjects
?.map(projectExperienceToText)
.join("\n")}`;
console.log(prompt);
const response = await requestOpenai(
let response = await requestOpenai(
[{ role: "user", content: prompt }],
"variant-rocks-turbo-16k",
2000,
0.75,
);
if (concise || gpt4) {
response = await requestOpenai(
[
{
role: "user",
content: `Ta utgangspunkt i følgende tekst "${response}"
Kjøper er bare interessert i hvordan ${name} svarer mot kravet ${requirement.requirement}
For å styrke argumentet ditt så må du bare bruke relevant tekst i ditt argument.
`,
},
],
gpt4 ? "variant-rocks-gpt4" : "variant-rocks",
2000,
0,
);
}
return {
requirement: requirement.requirement,
response: response,
Expand Down
31 changes: 26 additions & 5 deletions app/api/chewbacca/generateSummaryOfQualifications/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@ export const POST = async (
req: NextRequest,
res: NextResponse,
): Promise<Response> => {
const { requirementResponses, summaryText } = await req.json();
const { requirementResponses, summaryText, name, gpt4 } = await req.json();

const result =
(await generateSummaryOfQualifications(
requirementResponses,
summaryText,
name,
gpt4,
)) ?? "";

return new Response(JSON.stringify(result), { status: 200 });
Expand All @@ -22,20 +24,23 @@ export const POST = async (
async function generateSummaryOfQualifications(
requirementResponses: RequirementResponse[],
summaryText: string | undefined,
name: string,
): Promise<string | undefined> {
return await generateSummaryFromRequirementResponses(
requirementResponses,
summaryText,
name,
);
}

function findSummaryPrompt(
requirementResponses: RequirementResponse[],
summaryText: string | undefined,
name: string,
) {
const table = requirementResponsesToTable(requirementResponses);
if (summaryText) {
return `Vi har nå fått en krav-begrunnelse tabell ${table}.
return `Vi har nå fått en krav-begrunnelse tabellen som ${name} må oppfylle ${table}.
Her er det gamle sammendraget ${summaryText}.
Skriv om sammendraget slik at den svarer på alle krav
med begrunnelesen i tabellen. Bruk alt i tabellen og sammendraget.
Expand All @@ -49,9 +54,10 @@ function findSummaryPrompt(
Du kan ikke regne med at brukeren har lest krav-begrunnelse tabellen.
`;
}
return `Her er krav-begrunnelse tabellen. Lag et sammendrag av konsulentens
return `Her er krav-begrunnelse tabellen. Lag et sammendrag av ${name} sin
erfaring som svarer på kravene. Sammendraget bør være langt.
Husk å referer til navn på prosjekt, kunde og års erfaring for hvert krav i sammendraget.
Sammendraget må flyte naturlig og sammenhengende så den scorer høyt i salg.
Husk å inkludere alle rader ifra tabellen i svaret.
Det kan hende at samme prosjekt er brukt i de ulike begrunnelsene.
Ikke bruk noe som ikke står i tabllen i ditt sammendrag.
Expand All @@ -62,14 +68,29 @@ function findSummaryPrompt(
async function generateSummaryFromRequirementResponses(
requirementResponses: RequirementResponse[],
summaryText: string | undefined,
name: string,
gpt4: boolean,
): Promise<string> {
const prompt = findSummaryPrompt(requirementResponses, summaryText);
const summary = await requestOpenai(
const prompt = findSummaryPrompt(requirementResponses, summaryText, name);
let summary = await requestOpenai(
[{ role: "user", content: prompt }],
"variant-rocks-turbo-16k",
2000,
1,
);
if (gpt4) {
summary = await requestOpenai(
[
{
role: "user",
content: `Gjør teksten mer sammenhengende. Den skal ha en formell tone men fortsatt høres ut som et menneske`,
},
],
"variant-rocks-gpt4",
2000,
1,
);
}
return (
summary ??
"Feil: krav-begrunnelse tabllen ble for lang og GPT gikk over token limit"
Expand Down
2 changes: 1 addition & 1 deletion app/function/CallGptWithoutReactContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const AZURE_OPENAI_API_BASE = process.env.AZURE_OPENAI_API_BASE;

export async function requestOpenai(
input: ChatCompletionRequestMessage[],
deployment: ModelType,
deployment: ModelType | "variant-rocks-gpt4", //we don't want to export gpt 4 to the chat
response_max_tokens: number,
temperature: number,
) {
Expand Down
4 changes: 4 additions & 0 deletions app/locales/cn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,7 @@ const cn = {
ChooseEmployee: "Choose employee",
SelectPlaceholder: "What employee do you want to get the CV for?",
Requirements: "Requirements",
ConciseOption: "Answer requirements concisely",
RequirementsPlaceholder:
"The candidate must have experience with X\nThe candidate must have experience with Y\nExperience with Z is a plus",
Summary: "Summary",
Expand All @@ -483,6 +484,9 @@ const cn = {
"..og snart vil den også hjelpe deg med å fylle ut en kompetansematrise!",
},
},
EnableGpt4: "Finpuss svaret med GPT-4",
EnableGpt4Warning:
"Advarsel: Bruk av dette valget koster 0,64 øre per krav",
RequirementList: {
Title: "Fyll ut kravliste",
},
Expand Down
4 changes: 4 additions & 0 deletions app/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,7 @@ const en: LocaleType = {
ChooseEmployee: "Choose employee",
SelectPlaceholder: "What employee do you want to get the CV for?",
Requirements: "Requirements",
ConciseOption: "Answer requirements concisely",
RequirementsPlaceholder:
"The candidate must have experience with X\nThe candidate must have experience with Y\nExperience with Z is a plus",
Summary: "Summary",
Expand All @@ -488,6 +489,9 @@ const en: LocaleType = {
"..og snart vil den også hjelpe deg med å fylle ut en kompetansematrise!",
},
},
EnableGpt4: "Finpuss svaret med GPT-4",
EnableGpt4Warning:
"Advarsel: Bruk av dette valget koster 0,64 øre per krav",
RequirementList: {
Title: "Fyll ut kravliste",
},
Expand Down
4 changes: 4 additions & 0 deletions app/locales/no.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ const no: PartialLocaleType = {
MoreToCome: " (mer kommer!)",
},
ChooseEmployee: "Velg ansatt",
ConciseOption: "Svar kortfattet på krav",
SelectPlaceholder: "Hvilken ansatt vil du hente CV-en til?",
Requirements: "Krav til kompetanse",
RequirementsPlaceholder:
Expand All @@ -224,6 +225,9 @@ const no: PartialLocaleType = {
"..og snart vil den også hjelpe deg med å fylle ut en kompetansematrise!",
},
},
EnableGpt4: "Finpuss svaret med GPT-4",
EnableGpt4Warning:
"Advarsel: Bruk av dette valget koster Variant 0,64 øre per krav",
RequirementList: {
Title: "Fyll ut kravliste",
},
Expand Down
57 changes: 49 additions & 8 deletions app/salesGPT/components/salesGPT.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ function _SalesGPT() {

const [showCVSummary, setShowCVSummary] = useState(false);
const [showRequirementsList, setShowRequirementsList] = useState(false);
const [concise, setConcise] = useState(false);
const [gpt4, setGpt4] = useState(false);

function handleSelectEmployee(newValue: EmployeeItem | undefined): void {
setSelectedEmployee(newValue);
Expand Down Expand Up @@ -110,16 +112,24 @@ function _SalesGPT() {
const fetchRequirements = async (
employeeAlias: string,
requirements: string[],
gpt4: boolean,
): Promise<RequirementResponse[]> => {
const requirementPromises = requirements.map(async (requirement) => {
const name = getFirstName(selectedEmployee?.name ?? "");
const response = await fetch(
"/api/chewbacca/generateRequirementResponse",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ employeeAlias, requirement }),
body: JSON.stringify({
employeeAlias,
requirement,
name,
concise,
gpt4,
}),
},
);
const data = await response.json();
Expand All @@ -130,22 +140,32 @@ function _SalesGPT() {
return requirementResponses;
};

function getFirstName(name: string): string {
return name.split(" ")[0];
}

const runSummaryAnalysis = async (
employeeAlias: string,
requirements: string[],
summaryText: string,
) => {
await fetchRequirements(employeeAlias, requirements)
await fetchRequirements(employeeAlias, requirements, false)
.then(async (requirementResponses) => {
setRequirementResponse(requirementResponses);
const name = getFirstName(selectedEmployee?.name ?? "");
const response = await fetch(
"/api/chewbacca/generateSummaryOfQualifications",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ requirementResponses, summaryText }),
body: JSON.stringify({
requirementResponses,
summaryText,
name,
gpt4,
}),
},
);
const data = await response.json();
Expand All @@ -172,11 +192,10 @@ function _SalesGPT() {
employeeAlias: string,
requirements: string[],
) => {
await fetchRequirements(employeeAlias, requirements)
await fetchRequirements(employeeAlias, requirements, gpt4)
.then((data) => {
setRequirementResponse(data);
setShowRequirementsList(true);

setGeneratedText(null);
setIsAnalysisLoading(false);
setShowCVSummary(false);
Expand Down Expand Up @@ -217,9 +236,9 @@ function _SalesGPT() {
useChatStore.getState().currentSession().messages = [
{
role: "user",
content: `Bruk prosjektene til å lage et sammendrag av erfaringene til ${selectedEmployee?.name} ${projects
.map(projectExperienceToText)
.join("\n")}`,
content: `Bruk prosjektene til å lage et sammendrag av erfaringene til ${selectedEmployee?.name}
prosjektnavn,kundenavn,beskrivelse,rolle\n
${projects.map(projectExperienceToText).join("\n")}`,
id: `${id++}`,
date: new Date().toDateString(),
},
Expand Down Expand Up @@ -292,6 +311,28 @@ function _SalesGPT() {
onChange={(event) => setSummaryText(event.target.value)}
></textarea>
</div>
<div className={styles["input-field"]}>
<label htmlFor="concise-answer">
{Locale.SalesGPT.ConciseOption}
</label>
<input
type="checkbox"
id="concise-answer"
checked={concise}
onChange={(event) => setConcise(event.target.checked)}
/>
</div>
<div className={styles["input-field"]}>
<label htmlFor="gpt-4">
{Locale.SalesGPT.EnableGpt4} {Locale.SalesGPT.EnableGpt4Warning}
</label>
<input
type="checkbox"
id="gp4"
checked={gpt4}
onChange={(event) => setGpt4(event.target.checked)}
/>
</div>
<div className={styles["analyse-button-container"]}>
<IconButton
key="analyse"
Expand Down
5 changes: 5 additions & 0 deletions next.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,9 @@ if (mode !== "export") {
};
}

if (process.env.NODE_ENV === 'development' && process.env.IGNORE_TLS) {
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
}


export default nextConfig;