browser-use-typescript
Version:
A TypeScript-based browser automation framework
149 lines • 4.34 kB
JavaScript
import { AIMessage, HumanMessage, SystemMessage, ToolMessage } from "@langchain/core/messages";
/**
* Metadata for a message
*/
class MessageMetadata {
tokens = 0;
}
/**
* A message with its metadata
*/
class ManagedMessage {
message;
metadata;
constructor(message, metadata = new MessageMetadata()) {
this.message = message;
this.metadata = metadata;
}
/**
* Returns the JSON representation of the model.
* Serializes the message property before encoding the overall object.
*/
toJSON() {
const data = {
message: this.message,
metadata: this.metadata
};
// Handle serialization of the message using langchain's serialization if available
if (this.message.toJSON) {
data.message = this.message.toJSON();
}
return data;
}
/**
* Create a ManagedMessage from JSON data
*/
static fromJSON(data) {
let message;
// Handle different message types
if (data.message._type === "human") {
message = new HumanMessage(data.message.content);
}
else if (data.message._type === "ai") {
message = new AIMessage({
content: data.message.content,
tool_calls: data.message.tool_calls
});
}
else if (data.message._type === "system") {
message = new SystemMessage(data.message.content);
}
else if (data.message._type === "tool") {
message = new ToolMessage({
content: data.message.content,
tool_call_id: data.message.tool_call_id
});
}
else {
// Default case
message = new HumanMessage(data.message.content);
}
return new ManagedMessage(message, new MessageMetadata());
}
}
/**
* History of messages with metadata
*/
class MessageHistory {
messages = [];
current_tokens = 0;
/**
* Add message with metadata to history
*/
addMessage(message, metadata, position) {
const managedMessage = new ManagedMessage(message, metadata);
if (position === undefined) {
this.messages.push(managedMessage);
}
else {
this.messages.splice(position, 0, managedMessage);
}
this.current_tokens += metadata.tokens;
}
/**
* Add model output as AI message
*/
addModelOutput(output) {
const toolCalls = [
{
name: 'AgentOutput',
args: output,
id: '1',
type: 'tool_call',
}
];
const msg = new AIMessage({
content: '',
tool_calls: toolCalls,
});
this.addMessage(msg, new MessageMetadata()); // Estimate tokens for tool calls
// Empty tool response
const toolMessage = new ToolMessage({
content: '',
tool_call_id: '1'
});
this.addMessage(toolMessage, new MessageMetadata()); // Estimate tokens for empty response
}
/**
* Get all messages
*/
getMessages() {
return this.messages.map(m => m.message);
}
/**
* Get total tokens in history
*/
getTotalTokens() {
return this.current_tokens;
}
/**
* Remove oldest non-system message
*/
removeOldestMessage() {
for (let i = 0; i < this.messages.length; i++) {
if (!(this.messages[i].message instanceof SystemMessage)) {
this.current_tokens -= this.messages[i].metadata.tokens;
this.messages.splice(i, 1);
break;
}
}
}
/**
* Remove last state message from history
*/
removeLastStateMessage() {
if (this.messages.length > 2 && this.messages[this.messages.length - 1].message instanceof HumanMessage) {
this.current_tokens -= this.messages[this.messages.length - 1].metadata.tokens;
this.messages.pop();
}
}
}
/**
* Holds the state for MessageManager
*/
class MessageManagerState {
history = new MessageHistory();
tool_id = 1;
}
export { MessageMetadata, ManagedMessage, MessageHistory, MessageManagerState };
//# sourceMappingURL=types.js.map