summaryrefslogtreecommitdiff
path: root/examples/server/public/completion.js
diff options
context:
space:
mode:
Diffstat (limited to 'examples/server/public/completion.js')
-rw-r--r--examples/server/public/completion.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/examples/server/public/completion.js b/examples/server/public/completion.js
new file mode 100644
index 00000000..4f5005cf
--- /dev/null
+++ b/examples/server/public/completion.js
@@ -0,0 +1,81 @@
+const paramDefaults = {
+ stream: true,
+ n_predict: 500,
+ temperature: 0.2,
+ stop: ["</s>"]
+};
+
+/**
+ * This function completes the input text using a llama dictionary.
+ * @param {object} params - The parameters for the completion request.
+ * @param {object} controller - an instance of AbortController if you need one, or null.
+ * @param {function} callback - The callback function to call when the completion is done.
+ * @returns {string} the completed text as a string. Ideally ignored, and you get at it via the callback.
+ */
+export const llamaComplete = async (params, controller, callback) => {
+ if (!controller) {
+ controller = new AbortController();
+ }
+ const completionParams = { ...paramDefaults, ...params };
+
+ // we use fetch directly here becasue the built in fetchEventSource does not support POST
+ const response = await fetch("/completion", {
+ method: 'POST',
+ body: JSON.stringify(completionParams),
+ headers: {
+ 'Connection': 'keep-alive',
+ 'Content-Type': 'application/json',
+ 'Accept': 'text/event-stream'
+ },
+ signal: controller.signal,
+ });
+
+ const reader = response.body.getReader();
+ const decoder = new TextDecoder();
+
+ let content = "";
+
+ try {
+
+ let cont = true;
+
+ while (cont) {
+ const result = await reader.read();
+ if (result.done) {
+ break;
+ }
+
+ // sse answers in the form multiple lines of: value\n with data always present as a key. in our case we
+ // mainly care about the data: key here, which we expect as json
+ const text = decoder.decode(result.value);
+
+ // parse all sse events and add them to result
+ const regex = /^(\S+):\s(.*)$/gm;
+ for (const match of text.matchAll(regex)) {
+ result[match[1]] = match[2]
+ }
+
+ // since we know this is llama.cpp, let's just decode the json in data
+ result.data = JSON.parse(result.data);
+ content += result.data.content;
+
+ // callack
+ if (callback) {
+ cont = callback(result) != false;
+ }
+
+ // if we got a stop token from server, we will break here
+ if (result.data.stop) {
+ break;
+ }
+ }
+ } catch (e) {
+ console.error("llama error: ", e);
+ throw e;
+ }
+ finally {
+ controller.abort();
+ }
+
+ return content;
+}