async function getWebLLMCompletionStream(
systemPrompt,
prompt,
{ temperature = 0.0 } = {}
) {
const outputElement = document.getElementById("webllm-output");
outputElement.textContent = "";
if (prompt.length == 0) {
return;
}
let messages = [];
if (systemPrompt) {
messages.push({ role: "system", content: systemPrompt });
}
messages.push({ role: "user", content: prompt });
const stream = await engine.chat.completions.create({
messages: messages,
temperature: temperature,
stream: true
});
for await (const part of stream) {
const text = part.choices[0]?.delta?.content || "";
outputElement.textContent += text;
}
console.log(outputElement.textContent);
const functionCall = extractJsonFromFunctionTags(outputElement.textContent);
console.log(functionCall);
try {
if (!functionCall || !functionCall.name || !functionCall.parameters) {
return;
} else {
const toolResponse = await callAPI(
functionCall.name,
functionCall.parameters
);
console.log(toolResponse);
messages.push({ role: "assistant", content: outputElement.textContent });
messages.push({
role: "user",
content: `Your function call was successful. Please read the output below and use this context to respond to my original query in natural language.
Output from function call \`${functionCall.name}(${
functionCall.parameters
})\`: ${JSON.stringify(toolResponse)}.`
});
const stream2 = await engine.chat.completions.create({
messages: messages,
temperature: temperature,
stream: true
});
outputElement.textContent += "\n";
for await (const part of stream2) {
const text = part.choices[0]?.delta?.content || "";
outputElement.textContent += text;
}
}
} catch (error) {
console.error(`Error during the following function call: ${functionCall}`);
}
}