@axflow/models
Advanced tools
Comparing version 0.0.14 to 0.0.15
@@ -125,2 +125,12 @@ import { MessageType, JSONValueType } from '@axflow/models/shared'; | ||
onSubmit: (e?: React.FormEvent<HTMLFormElement>) => void; | ||
/** | ||
* Sends a request to the server with the current list of messages for a new assistant response. | ||
* | ||
* Note: | ||
* | ||
* * If there are no user messages in the list, this function will throw an error. | ||
* * If there are assistant messages more recent than the last user message, they will | ||
* be removed from the list of messages before sending a request to the server. | ||
*/ | ||
reload: () => void; | ||
}; | ||
@@ -127,0 +137,0 @@ /** |
@@ -93,3 +93,3 @@ "use strict"; | ||
} | ||
async function stableAppend(message, messagesRef, setMessages, url, headers, body, accessor, loadingRef, setLoading, setError, onError, onNewMessage) { | ||
async function request(prepare, messagesRef, setMessages, url, headers, accessor, loadingRef, setLoading, setError, onError, onNewMessage) { | ||
if (loadingRef.current) { | ||
@@ -100,6 +100,3 @@ return; | ||
setError(null); | ||
const history = messagesRef.current; | ||
const requestBody = typeof body === "function" ? body(message, history) : { ...body, messages: history.concat(message) }; | ||
setMessages(history.concat(message)); | ||
onNewMessage(message); | ||
const requestBody = prepare(); | ||
let response; | ||
@@ -122,2 +119,59 @@ try { | ||
} | ||
async function stableAppend(message, messagesRef, setMessages, url, headers, body, accessor, loadingRef, setLoading, setError, onError, onNewMessage) { | ||
function prepare() { | ||
const history = messagesRef.current; | ||
const requestBody = typeof body === "function" ? body(message, history) : { ...body, messages: history.concat(message) }; | ||
setMessages(history.concat(message)); | ||
onNewMessage(message); | ||
return requestBody; | ||
} | ||
return request( | ||
prepare, | ||
messagesRef, | ||
setMessages, | ||
url, | ||
headers, | ||
accessor, | ||
loadingRef, | ||
setLoading, | ||
setError, | ||
onError, | ||
onNewMessage | ||
); | ||
} | ||
async function stableReload(messagesRef, setMessages, url, headers, body, accessor, loadingRef, setLoading, setError, onError, onNewMessage) { | ||
function prepare() { | ||
const messages = messagesRef.current; | ||
const history = []; | ||
let lastUserMessage = null; | ||
for (let i = messages.length - 1; i >= 0; i--) { | ||
if (lastUserMessage === null && messages[i].role === "user") { | ||
lastUserMessage = messages[i]; | ||
} else if (lastUserMessage !== null) { | ||
history.unshift(messages[i]); | ||
} | ||
} | ||
if (lastUserMessage === null) { | ||
throw new Error("Cannot reload empty conversation"); | ||
} | ||
const requestBody = typeof body === "function" ? body(lastUserMessage, history) : { ...body, messages: history.concat(lastUserMessage) }; | ||
if (messages[messages.length - 1].id !== lastUserMessage.id) { | ||
setMessages(history.concat(lastUserMessage)); | ||
} | ||
return requestBody; | ||
} | ||
return request( | ||
prepare, | ||
messagesRef, | ||
setMessages, | ||
url, | ||
headers, | ||
accessor, | ||
loadingRef, | ||
setLoading, | ||
setError, | ||
onError, | ||
onNewMessage | ||
); | ||
} | ||
var DEFAULT_URL = "/api/chat"; | ||
@@ -168,18 +222,2 @@ var DEFAULT_ACCESSOR = (value) => value; | ||
); | ||
function append(message) { | ||
stableAppend( | ||
message, | ||
messagesRef, | ||
setMessages, | ||
url, | ||
headers, | ||
body, | ||
accessor, | ||
loadingRef, | ||
setLoading, | ||
setError, | ||
onError, | ||
onNewMessage | ||
); | ||
} | ||
function onChange(e) { | ||
@@ -196,3 +234,3 @@ if (typeof e === "string") { | ||
} | ||
append({ | ||
const newMessage = { | ||
id: uuid(), | ||
@@ -202,6 +240,35 @@ role: "user", | ||
created: Date.now() | ||
}); | ||
}; | ||
stableAppend( | ||
newMessage, | ||
messagesRef, | ||
setMessages, | ||
url, | ||
headers, | ||
body, | ||
accessor, | ||
loadingRef, | ||
setLoading, | ||
setError, | ||
onError, | ||
onNewMessage | ||
); | ||
setInput(""); | ||
} | ||
return { input, setInput, messages, setMessages, loading, error, onChange, onSubmit }; | ||
function reload() { | ||
stableReload( | ||
messagesRef, | ||
setMessages, | ||
url, | ||
headers, | ||
body, | ||
accessor, | ||
loadingRef, | ||
setLoading, | ||
setError, | ||
onError, | ||
onNewMessage | ||
); | ||
} | ||
return { input, setInput, messages, setMessages, loading, error, onChange, onSubmit, reload }; | ||
} | ||
@@ -208,0 +275,0 @@ // Annotate the CommonJS export names for ESM import in node: |
{ | ||
"name": "@axflow/models", | ||
"version": "0.0.14", | ||
"version": "0.0.15", | ||
"description": "Zero-dependency, modular SDK for building robust natural language applications", | ||
@@ -199,3 +199,3 @@ "author": "Axflow (https://axflow.dev)", | ||
}, | ||
"gitHead": "4a4b2880e4d83ebed393e1cd1cc90ff1ed40a44e" | ||
"gitHead": "e3a7d387dd29e2db277e4fad890ffc4c2be686f0" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
227362
4342