@xynehq/jaf
Version:
Juspay Agent Framework - A purely functional agent framework with immutable state and composable tools
250 lines ⢠9.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const index_js_1 = require("../index.js");
const agents_js_1 = require("./agents.js");
const mock_provider_js_1 = require("./mock-provider.js");
async function demoBasicMath() {
console.log('\nš§® Demo 1: Basic Math Calculation');
console.log('================================');
const context = {
userId: 'user123',
permissions: ['user'],
workspace: '/tmp/demo'
};
const agentRegistry = new Map([
['TriageAgent', agents_js_1.triageAgent],
['MathTutor', agents_js_1.mathTutor],
['FileManager', agents_js_1.fileManager],
['WebResearcher', agents_js_1.webResearcher],
]);
const modelProvider = new mock_provider_js_1.MockModelProvider();
const traceCollector = new index_js_1.ConsoleTraceCollector();
const config = {
agentRegistry,
modelProvider,
maxTurns: 10,
onEvent: traceCollector.collect.bind(traceCollector),
};
const initialState = {
runId: (0, index_js_1.generateRunId)(),
traceId: (0, index_js_1.generateTraceId)(),
messages: [
{ role: 'user', content: 'What is 25 * 4 + 10?' }
],
currentAgentName: 'TriageAgent',
context,
turnCount: 0,
};
const result = await (0, index_js_1.run)(initialState, config);
if (result.outcome.status === 'completed') {
console.log('ā
Final Answer:', result.outcome.output);
}
else {
console.error('ā Run Failed:', result.outcome.error);
}
}
async function demoFileOperations() {
console.log('\nš Demo 2: File Operations (Permission Denied)');
console.log('===============================================');
const context = {
userId: 'user456',
permissions: ['user'], // No admin permission
workspace: '/tmp/demo'
};
const agentRegistry = new Map([
['TriageAgent', agents_js_1.triageAgent],
['MathTutor', agents_js_1.mathTutor],
['FileManager', agents_js_1.fileManager],
['WebResearcher', agents_js_1.webResearcher],
]);
const modelProvider = new mock_provider_js_1.MockModelProvider();
const traceCollector = new index_js_1.ConsoleTraceCollector();
const config = {
agentRegistry,
modelProvider,
maxTurns: 10,
onEvent: traceCollector.collect.bind(traceCollector),
};
const initialState = {
runId: (0, index_js_1.generateRunId)(),
traceId: (0, index_js_1.generateTraceId)(),
messages: [
{ role: 'user', content: 'Please read the file /shared/example.txt' }
],
currentAgentName: 'TriageAgent',
context,
turnCount: 0,
};
const result = await (0, index_js_1.run)(initialState, config);
if (result.outcome.status === 'completed') {
console.log('ā
Final Answer:', result.outcome.output);
}
else {
console.error('ā Run Failed:', result.outcome.error);
}
}
async function demoWebSearch() {
console.log('\nš Demo 3: Web Search with Guardrails');
console.log('====================================');
const context = {
userId: 'user789',
permissions: ['user', 'researcher'],
workspace: '/tmp/demo'
};
const agentRegistry = new Map([
['TriageAgent', agents_js_1.triageAgent],
['MathTutor', agents_js_1.mathTutor],
['FileManager', agents_js_1.fileManager],
['WebResearcher', agents_js_1.webResearcher],
]);
const modelProvider = new mock_provider_js_1.MockModelProvider();
const traceCollector = new index_js_1.ConsoleTraceCollector();
const contentFilter = (0, index_js_1.createContentFilter)();
const rateLimiter = (0, index_js_1.createRateLimiter)(3, // max 3 calls
60000, // per minute
(input) => 'global' // simple global rate limit
);
const config = {
agentRegistry,
modelProvider,
maxTurns: 10,
initialInputGuardrails: [contentFilter, rateLimiter],
finalOutputGuardrails: [contentFilter],
onEvent: traceCollector.collect.bind(traceCollector),
};
const initialState = {
runId: (0, index_js_1.generateRunId)(),
traceId: (0, index_js_1.generateTraceId)(),
messages: [
{ role: 'user', content: 'Search for information about artificial intelligence' }
],
currentAgentName: 'TriageAgent',
context,
turnCount: 0,
};
const result = await (0, index_js_1.run)(initialState, config);
if (result.outcome.status === 'completed') {
console.log('ā
Final Answer:', result.outcome.output);
}
else {
console.error('ā Run Failed:', result.outcome.error);
}
}
async function demoHandoffChain() {
console.log('\nš Demo 4: Complex Multi-Agent Handoff Chain');
console.log('===========================================');
const context = {
userId: 'poweruser',
permissions: ['user', 'admin', 'researcher'],
workspace: '/tmp/demo'
};
const agentRegistry = new Map([
['TriageAgent', agents_js_1.triageAgent],
['MathTutor', agents_js_1.mathTutor],
['FileManager', agents_js_1.fileManager],
['WebResearcher', agents_js_1.webResearcher],
]);
const modelProvider = new mock_provider_js_1.MockModelProvider();
const traceCollector = new index_js_1.ConsoleTraceCollector();
const config = {
agentRegistry,
modelProvider,
maxTurns: 15,
onEvent: traceCollector.collect.bind(traceCollector),
};
const initialState = {
runId: (0, index_js_1.generateRunId)(),
traceId: (0, index_js_1.generateTraceId)(),
messages: [
{
role: 'user',
content: 'I need to calculate 15 * 8, then search for information about the number 120, and finally save that information to a file called results.txt'
}
],
currentAgentName: 'TriageAgent',
context,
turnCount: 0,
};
const result = await (0, index_js_1.run)(initialState, config);
if (result.outcome.status === 'completed') {
console.log('ā
Final Answer:', result.outcome.output);
}
else {
console.error('ā Run Failed:', result.outcome.error);
}
}
async function demoGuardrailTrigger() {
console.log('\nš”ļø Demo 5: Guardrail Trigger (Sensitive Content)');
console.log('===============================================');
const context = {
userId: 'user999',
permissions: ['user'],
workspace: '/tmp/demo'
};
const agentRegistry = new Map([
['TriageAgent', agents_js_1.triageAgent],
['MathTutor', agents_js_1.mathTutor],
['FileManager', agents_js_1.fileManager],
['WebResearcher', agents_js_1.webResearcher],
]);
const modelProvider = new mock_provider_js_1.MockModelProvider();
const traceCollector = new index_js_1.ConsoleTraceCollector();
const contentFilter = (0, index_js_1.createContentFilter)();
const config = {
agentRegistry,
modelProvider,
maxTurns: 10,
initialInputGuardrails: [contentFilter],
onEvent: traceCollector.collect.bind(traceCollector),
};
const initialState = {
runId: (0, index_js_1.generateRunId)(),
traceId: (0, index_js_1.generateTraceId)(),
messages: [
{ role: 'user', content: 'Can you help me with my password and api_key management?' }
],
currentAgentName: 'TriageAgent',
context,
turnCount: 0,
};
const result = await (0, index_js_1.run)(initialState, config);
if (result.outcome.status === 'completed') {
console.log('ā
Final Answer:', result.outcome.output);
}
else {
console.error('ā Run Failed:', result.outcome.error);
}
}
async function runAllDemos() {
console.log('š FAF v2.0 Demo Application');
console.log('===========================');
console.log('Showcasing the Functional Agent Framework capabilities\n');
try {
await demoBasicMath();
await new Promise(resolve => setTimeout(resolve, 1000));
await demoFileOperations();
await new Promise(resolve => setTimeout(resolve, 1000));
await demoWebSearch();
await new Promise(resolve => setTimeout(resolve, 1000));
await demoHandoffChain();
await new Promise(resolve => setTimeout(resolve, 1000));
await demoGuardrailTrigger();
console.log('\nš All demos completed!');
console.log('\nKey features demonstrated:');
console.log('- ā
Pure functional architecture with immutable state');
console.log('- ā
Type-safe agent and tool definitions');
console.log('- ā
Composable validation policies');
console.log('- ā
Multi-agent handoff coordination');
console.log('- ā
Comprehensive error handling');
console.log('- ā
Real-time tracing and observability');
console.log('- ā
Guardrail enforcement for security');
console.log('- ā
Permission-based access control');
}
catch (error) {
console.error('Demo failed:', error);
}
}
if (require.main === module) {
runAllDemos();
}
//# sourceMappingURL=index.js.map