node-agency
Version:
A node package for building AI agents
146 lines • 6.37 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Model = void 0;
const logger_1 = require("../logger");
const getToolsPrompt = (tools) => {
let toolsPrompt = "";
if (tools) {
toolsPrompt =
"\n\nYou have Tools Available Please tell me when to use them:\n";
tools.forEach((tool) => {
toolsPrompt += `\nName: ${tool.function.name}`;
toolsPrompt += `\nDescription: ${tool.function.description}`;
if (tool.function.parameters) {
if (tool.function.parameters.type) {
toolsPrompt += `\nParameter Type: ${tool.function.parameters.type}`;
}
if (tool.function.parameters.required &&
Array.isArray(tool.function.parameters.required)) {
toolsPrompt += `\nRequired Parameters: ${tool.function.parameters.required.join(",")}`;
}
if (tool.function.parameters.properties) {
let outputJson = `{`;
outputJson += `'tool_call':'${tool.function.name}',`;
outputJson += `'arguments': {`;
let count = 0;
for (const [key, value] of Object.entries(tool.function.parameters.properties)) {
if (count > 0)
outputJson += `,`;
let valueExample = "";
if (value.type === "string") {
valueExample = `'example'`;
}
if (value.type === "number") {
valueExample = `0`;
}
outputJson += `'${key}': ${valueExample}`;
count++;
}
outputJson += `}}`;
toolsPrompt += `\nExample of Calling Tool: ${outputJson}`;
}
}
});
}
return toolsPrompt;
};
class Model {
constructor(options) {
var _a;
this.history = [];
this.selfReflected = 0;
this.model = "llama3";
this.selfReflect = true;
const { model } = options || {};
this.model = model || this.model;
this.selfReflect = (_a = options === null || options === void 0 ? void 0 : options.selfReflect) !== null && _a !== void 0 ? _a : true;
}
call(systemMessage, prompt, tools, context) {
return __awaiter(this, void 0, void 0, function* () {
prompt.content =
prompt.content +
(context
? "\n\nHere is further context to help you with your task:\n" + context
: "");
this.history.push(prompt);
const messages = [
{
role: "system",
content: systemMessage + getToolsPrompt(tools),
},
...this.history,
];
try {
const message = yield this.callOllama(messages, tools);
this.history.push({
role: "assistant",
content: message.content,
});
return message.content || "Unknown Error Occurred, Please try again.";
}
catch (error) {
console.error(error);
throw new Error("Failed to call GPT-3");
}
});
}
callOllama(messages_1, tools_1) {
return __awaiter(this, arguments, void 0, function* (messages, tools, reflected = false) {
try {
const modelResponse = yield fetch(`http://localhost:11434/api/chat`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
messages,
model: this.model,
stream: false,
}),
}).then((res) => res.json());
if (modelResponse.error) {
throw new Error(modelResponse.error);
}
const { message } = modelResponse;
if (this.selfReflect && reflected && this.selfReflected >= 3) {
(0, logger_1.Logger)({ type: "info", payload: "Self-Reflection Limit Reached\n\n" });
}
if (this.selfReflect &&
!reflected &&
message.content &&
this.selfReflected < 3) {
(0, logger_1.Logger)({
type: "info",
payload: `Self-Reflecting On Output (${this.selfReflected})...\n\n`,
});
this.selfReflected++;
return this.callOllama([
...messages,
message,
{
role: "user",
content: "Reflect on your response, find ways to improve it, respond with only the improved version, with no mention of the reflection process, or changes made.",
},
], tools, true);
}
return message;
}
catch (error) {
console.error(error);
console.debug("History: ", this.history);
throw new Error("Failed to call Ollama");
}
});
}
}
exports.Model = Model;
//# sourceMappingURL=ollama.js.map