taskforce-aiagent
Version:
TaskForce is a modular, open-source, production-ready TypeScript agent framework for orchestrating AI agents, LLM-powered autonomous agents, task pipelines, dynamic toolchains, RAG workflows and memory/retrieval systems.
98 lines (97 loc) • 3.54 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.recordLLMCall = recordLLMCall;
exports.exportTelemetry = exportTelemetry;
exports.resetTelemetry = resetTelemetry;
exports.saveTelemetryToFile = saveTelemetryToFile;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const log_helper_js_1 = require("./log.helper.js");
const TELEMETRY_PATH = path_1.default.join(log_helper_js_1.logDir, "telemetry.json");
const telemetry = {};
function recordLLMCall(agent, tokens, durationMs, modelName) {
const current = telemetry[agent] || {
callCount: 0,
totalTokens: 0,
totalTimeMs: 0,
lastCall: null,
models: [],
};
current.models = current.models || [];
let modelEntry = current.models.find((m) => m.model === modelName);
if (!modelEntry) {
modelEntry = { model: modelName, totalTokens: 0, durationMs: 0 };
current.models.push(modelEntry);
}
modelEntry.totalTokens += tokens;
modelEntry.durationMs += durationMs;
telemetry[agent] = {
callCount: current.callCount + 1,
totalTokens: current.totalTokens + tokens,
totalTimeMs: current.totalTimeMs + durationMs,
lastCall: {
timestamp: new Date().toISOString(),
model: modelName,
totalTokens: tokens,
durationMs,
},
models: current.models,
};
if (process.env.TELEMETRY_MODE !== "none") {
saveTelemetryToFile();
}
}
function exportTelemetry() {
return telemetry;
}
function resetTelemetry() {
for (const key in telemetry)
delete telemetry[key];
}
function saveTelemetryToFile() {
if (!fs_1.default.existsSync(log_helper_js_1.logDir)) {
fs_1.default.mkdirSync(log_helper_js_1.logDir, { recursive: true });
}
let existing = {};
const mode = process.env.TELEMETRY_MODE || "append";
if (mode === "append" && fs_1.default.existsSync(TELEMETRY_PATH)) {
try {
const raw = fs_1.default.readFileSync(TELEMETRY_PATH, "utf-8");
existing = JSON.parse(raw);
}
catch (err) {
console.warn("⚠️ Failed to read existing telemetry. Overwriting.");
}
}
for (const agent of Object.keys(telemetry)) {
const current = telemetry[agent];
const previous = existing[agent];
if (!previous || mode === "overwrite") {
existing[agent] = current;
continue;
}
previous.callCount += current.callCount;
previous.totalTokens += current.totalTokens;
previous.totalTimeMs += current.totalTimeMs;
previous.lastCall = current.lastCall;
const modelMap = {};
for (const entry of previous.models || []) {
modelMap[entry.model] = entry;
}
for (const entry of current.models || []) {
if (modelMap[entry.model]) {
modelMap[entry.model].totalTokens += entry.totalTokens;
modelMap[entry.model].durationMs += entry.durationMs;
}
else {
modelMap[entry.model] = { ...entry };
}
}
previous.models = Object.values(modelMap);
existing[agent] = previous;
}
fs_1.default.writeFileSync(TELEMETRY_PATH, JSON.stringify(existing, null, 2), "utf-8");
}