File size: 7,643 Bytes
7afe4cc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31e4fd1
54bd0d7
68f6d9f
430706a
 
 
31e4fd1
 
 
 
 
 
54bd0d7
 
 
 
 
 
31e4fd1
 
7afe4cc
54bd0d7
31e4fd1
 
7afe4cc
31e4fd1
54bd0d7
68f6d9f
430706a
 
 
31e4fd1
 
 
7afe4cc
31e4fd1
 
54bd0d7
 
 
 
 
 
7afe4cc
 
 
54bd0d7
7afe4cc
 
 
31e4fd1
54bd0d7
68f6d9f
430706a
 
 
31e4fd1
 
 
 
 
 
54bd0d7
 
 
 
 
 
31e4fd1
 
7afe4cc
54bd0d7
31e4fd1
7afe4cc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import { NextResponse } from 'next/server';
import { Mistral } from "@mistralai/mistralai";

type Language = 'fr' | 'en' | 'es';

const mistral = new Mistral({apiKey: process.env.MISTRAL_API_KEY})

export async function POST(request: Request) {
    try {
        const body = await request.json();
        const { language, story, chat } = body;
        console.log('language:', language)
        console.log('story:', story)
        console.log('chat:', chat)

        const chatHistory = chat.messages
          .map((m: { role: string; content: string }) =>
            `${m.role === 'judge' ? 'Judge' : 'Lawyer'}: ${m.content}`
          )
          .join('\n');

        const prompts = {
            fr: `Pouvez-vous trouver 1 question amusante pour réfuter les alibis que le juge pourrait poser à l'avocat de l'accusé dans cette affaire ?
                (ne demandez pas de dessiner ou de faire des gestes, seulement des réponses textuelles), La question doit commencer par "Pourquoi" ou "J'aimerais savoir" ect .
                Pouvez-vous aussi donner 3 mots aléatoires *mais réels* que l'avocat devra ajouter à son discours. Ces mots doivent être simple, drole, reliés a l'affaire ou des mots ou expressions embarassantes pour un statut d'avocat (ex: "euuuh, et voila quoi..").
                Je veux un mot en lien avec le case. 
                Je veux un mot ou expression embarassante pour un avocat.
                Je veux un mot simple et drole.
                RÉPONDEZ UNIQUEMENT AVEC LE JSON
                N'AJOUTEZ PAS DE MOTS QUI ONT DÉJÀ ÉTÉ ENVOYÉS
                Voici le contexte de l'affaire :

                description de l'histoire : ${story.description}
                alibis : ${story.alibi.join(', ')}
                history : ${chat.messages.length > 0 ? `historique de la discussion : ${chatHistory}` : 'Vide'}

                Je veux egalement une réaction a la derniere réponse de l'avocat. Cela peut etre des "Hmmm, d'accord" ou alors "Vous ne m'avez pas vraiment convaincu... Pourquoi parlez vous de ...".
                Prends le role du juge et reponds avec condescendance. Cela doit etre dans un champ json "reaction" different de "question".
                Parcontre la reaction ne doit pas finir par une question. Elle doit finir par trois petits points '...'
                si history est vide, ne mettez pas reaction dans le json.

                Réponse en JSON avec ce format :
                {
                    "reaction" : "Votre réaction incisive ici",
                    "question" : " Votre question incisive de juge ici ",
                    "words" : [" expression1 ", " expression2 ", " expression3 "].
                }`,
            en: `can you find 1 fun questions to refute the alibis the judge could ask the lawyer of the accused about this case ?
                (do not ask to draw or to gesture, only text answers), The question must start with "Why" or "I would like to know" etc.
                Can you also give 3 random *but real* words for the lawyer to add to his speech. These words should be simple, funny, related to the case or embarrassing words or phrases for a lawyer (e.g. “uh huh, here goes nothing”).
                I want a word related to the case.
                I want a word or phrase embarassant for a lawyer.
                I want a simple and funny word.
                ANSWER WITH ONLY THE JSON
                DO NOT ADD WORDS THAT HAVE ALREADY BEEN SENT
                Here is the context of the case :

                story description: ${story.description}
                alibis: ${story.alibi.join(', ')}
                history: ${chat.messages.length > 0 ? `discussion history: ${chatHistory}` : 'Empty'}

                I want a reaction to the last answer of the lawyer. This could be "Hmmm, d'accord" or then "Vous ne m'avez pas vraiment convaincu... Pourquoi parlez vous de ...".
                Take the role of the judge and answer with condescendance. This must be in a json field "reaction" different from "question".
                The reaction must not end with a question. It has to finish with three dots '...'
                If history is empty, do not put reaction in the json.

                Answer in JSON with this format:
                {
                    "reaction": "Your incisive reaction here",
                    "question": "Your incisive judge question here",
                    "words": ["expression1", "expression2", "expression3"]
                }`,
            es: `¿puedes encontrar 1 preguntas divertidas para refutar las coartadas que el juez podría hacer al abogado del acusado sobre este caso?
                (no pidas dibujar o gesticular, sólo respuestas de texto), La pregunta debe comenzar con "Por qué" o "Me gustaría saber" etc.
                También puedes dar 3 palabras aleatorias *pero reales* para que el abogado las añada a su discurso. Estas palabras deben ser sencillas, divertidas, relacionadas con el caso o palabras o frases embarazosas para un abogado (por ejemplo, «uh huh, aquí vamos..»).
                Quiero una palabra relacionada con el caso.
                Quiero una palabra o frase embarazosa para un abogado.
                Quiero una palabra simple y divertida.
                RESPONDA SÓLO CON EL JSON
                NO AÑADAS PALABRAS QUE YA HAYAN SIDO ENVIADAS
                Aquí está el contexto del caso :

                descripción de la historia: ${story.description}
                coartadas: ${story.alibi.join(', ')}
                history: ${chat.messages.length > 0 ? `historia de la discusión: ${chatHistory}` : 'vacío'}

                Quiero una reacción a la última respuesta del abogado. Esto podría ser "Hmmm, d'accord" o entonces "Vous ne m'avez pas vraiment convaincu... Pourquoi parlez vous de ...".
                Toma el papel del juez y responde con condescendencia. Cela debe estar en un campo json "reaction" diferente de "question".
                La reacción no debe terminar con una pregunta. It has to finish with three dots '...'
                Si history está vacío, no pongas reacción en el json.

                Respuesta en JSON con este formato:
                {
                    "reaction": "Tu reacción incisiva aquí",
                    "question": "Tu incisiva pregunta de juez aquí",
                    "words": ["expresión1", "expresión2", "expresión3"]
                }`
        };

        console.log('prompts:', prompts[language as Language])

        const seed = Math.floor(Math.random() * 1000000);

        console.log('seed:', seed)

        const response = await mistral.chat.complete({
            model: "mistral-small-latest",
            messages: [{role: 'user', content: prompts[language as Language]}],
            responseFormat: {type: 'json_object'},
            randomSeed: seed,
        });

        console.log('response:', response)

        const functionCall = response.choices?.[0]?.message.content;
        const JSONResponse = functionCall ? JSON.parse(functionCall as string) : null;
        console.log('functionCall:', functionCall)
        console.log('JSONResponse:', JSONResponse)

        return NextResponse.json(JSONResponse || {
            'question': 'Erreur de génération de question',
            'words': [],
            'status': 'error',
        });

    } catch (error: unknown) {
        console.log('error:', error)
        return NextResponse.json(
            { error: 'Erreur lors de la génération de la question' },
            { status: 500 }
        );
    }
}