export async function createFunctionCompletion()

in projects/deliberation_at_scale/packages/orchestrator/src/lib/openai.ts [124:183]


export async function createFunctionCompletion(options: FunctionCompletionOptions): Promise<FunctionCall | undefined>  {
    const {
        taskInstruction,
        taskContent,
        functionSchema,
        model = 'gpt-3.5-turbo-0613',
    } = options;
    const startTime = dayjs();
    const waitingMessageInterval = setInterval(() => {
        const passedTimeMs = dayjs().diff(startTime, 'ms');
        console.info(`Waiting on function completion (${passedTimeMs}): ${taskInstruction.trim().slice(0, 100)}`);
    }, ONE_SECOND_MS * 3);

    const [completionResult, completionLogResult] = await Promise.allSettled([

        // perform the structured completion
        openaiClient.chat.completions.create({
            model,
            messages : [{
                role: 'user',
                content: taskInstruction,
            }, {
                role: 'user',
                content: taskContent,
            }],
            functions: [functionSchema],
        }),

        // log the prompt to the database for transparency on decision making and debugging
        supabaseClient.from('completions').insert({
            prompt: `
                Task instruction:
                ${taskInstruction}

                Task content:
                ${taskContent}
            `,
            model: { name: model },
            type: 'gpt',
        }),
    ]);

    // disable debugging
    clearInterval(waitingMessageInterval);

    if (completionResult.status !== 'fulfilled') {
        console.error(`Failed to get a valid function completion: ${completionResult.reason}`);
        return;
    }

    if (completionLogResult.status !== 'fulfilled') {
        console.error(`Failed to log the function completion: ${completionLogResult.reason}`);
        return;
    }

    const completion = completionResult.value.choices?.[0];
    const functionCall = completion?.message?.function_call;

    return functionCall;
}