From 47f7245315a7049b50ff1fed59feb2c21f2c2cfd Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 15:58:43 +0100 Subject: [PATCH 01/11] added gitignore --- examples/agents/talk-to-excel-sheets-agent/.gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/.gitignore diff --git a/examples/agents/talk-to-excel-sheets-agent/.gitignore b/examples/agents/talk-to-excel-sheets-agent/.gitignore new file mode 100644 index 00000000..9b5994f6 --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/.gitignore @@ -0,0 +1,9 @@ +# baseai +**/.baseai/ +node_modules +.env +package-lock.json +pnpm-lock.yaml +# env file +.env + From 2a53c8f4eb1492cadd1f61dbdb9d4b6e4ca7d1a2 Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 15:58:57 +0100 Subject: [PATCH 02/11] added env example file --- .../.env.baseai.example | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/.env.baseai.example diff --git a/examples/agents/talk-to-excel-sheets-agent/.env.baseai.example b/examples/agents/talk-to-excel-sheets-agent/.env.baseai.example new file mode 100644 index 00000000..8c643651 --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/.env.baseai.example @@ -0,0 +1,21 @@ +# !! SERVER SIDE ONLY !! +# Keep all your API keys secret — use only on the server side. + +# TODO: ADD: Both in your production and local env files. +# Langbase API key for your User or Org account. +# How to get this API key https://langbase.com/docs/api-reference/api-keys +LANGBASE_API_KEY= + +# TODO: ADD: LOCAL ONLY. Add only to local env files. +# Following keys are needed for local pipe runs. For providers you are using. +# For Langbase, please add the key to your LLM keysets. +# Read more: Langbase LLM Keysets https://langbase.com/docs/features/keysets +OPENAI_API_KEY= +ANTHROPIC_API_KEY= +COHERE_API_KEY= +FIREWORKS_API_KEY= +GOOGLE_API_KEY= +GROQ_API_KEY= +MISTRAL_API_KEY= +PERPLEXITY_API_KEY= +TOGETHER_API_KEY= From f2df7690323d854dbe2fc7dc8d7339ac96918f7d Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:44:23 +0100 Subject: [PATCH 03/11] Added readme for talk-to-excel-agent --- .../talk-to-excel-sheets-agent/README.md | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/README.md diff --git a/examples/agents/talk-to-excel-sheets-agent/README.md b/examples/agents/talk-to-excel-sheets-agent/README.md new file mode 100644 index 00000000..47754fcf --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/README.md @@ -0,0 +1,85 @@ +![Talk To Excel Agent by ⌘ BaseAI][cover] + +![License: MIT][mit] [![Fork on ⌘ Langbase][fork]][pipe] + +## Build a Talk To Excel Agent with BaseAI framework — ⌘ Langbase + +The **Talk To Excel Agent** is an AI-powered data analysis tool that streamlines your Excel workflows by automatically analyzing uploaded files to provide comprehensive overviews and actionable insights. Utilizing BaseAI's memory and tool call features, it delivers detailed summaries of data structure, identifies patterns and trends, and highlights potential data quality issues. + +The agent guides you toward meaningful analysis by suggesting key areas for deeper exploration and assisting in refining queries. Additionally, you can combine this agent with the Excel Formula Generation Agent to access a suite of powerful tools for analyzing your financial data effectively without losing sight of the bigger picture. Configurable through the baseai.config.ts file, logging is disabled by default. By bridging the gap between business questions and technical Excel operations, the Talk To Excel Agent empowers you to make data-driven decisions efficiently and effectively. + +This AI Agent is built using the BaseAI framework. It leverages an agentic pipe that integrates over 30+ LLMs (including OpenAI, Gemini, Mistral, Llama, Gemma, etc.) and can handle any data, with context sizes of up to 10M+ tokens, supported by memory. The framework is compatible with any front-end framework (such as React, Remix, Astro, Next.js), giving you, as a developer, the freedom to tailor your AI application exactly as you envision. + +## How to use + +Navigate to `examples/agents/talk-to-excel-sheets-agent` and run the following commands: + +```sh +# Navigate to baseai/examples/agents/it-systems-triage-agent +cd examples/agents/talk-to-excel-sheets-agent + +# Install the dependencies +npm install +# or +pnpm install + +# Make sure to copy .env.baseai.example file and +# create .env file and add all the relevant API keys in it +# NOTE: Please provide openai and anthropic API key to run this example +cp .env.baseai.example .env + +# Run the local baseai dev server to test the examples (uses localhost:9000 port) +npx baseai@latest dev + +# Create local embeddings of the sample file provided +npx baseai@latest embed -m talk-to-excel-memory + +# Run the agent +npx tsx index.ts +``` + +## Features + +- Talk To Excel Agent — Built with [BaseAI framework and agentic Pipe ⌘ ][qs]. +- Composable Agents — build and compose agents with BaseAI. +- Add and Sync deployed pipe on Langbase locally npx baseai@latest add ([see the Code button][pipe]). +- Talk To Excel Agent uses [BaseAI memory][memory] and [tool calls][toolcalls] feature. + +## Learn more + +1. Check the [Learning path to build an agentic AI pipe with ⌘ BaseAI][learn] +2. Read the [source code on GitHub][gh] for this agent example +3. Go through Documentaion: [Pipe Quick Start][qs] +4. Learn more about [Memory features in ⌘ BaseAI][memory] +5. Learn more about [Tool calls support in ⌘ BaseAI][toolcalls] + + +> NOTE: +> This is a BaseAI project, you can deploy BaseAI pipes, memory and tool calls on Langbase. + +--- + +## Authors + +This project is created by [Langbase][lb] team members, with contributions from: + +- Muhammad-Ali Danish - Software Engineer, [Langbase][lb]
+**_Built by ⌘ [Langbase.com][lb] — Ship hyper-personalized AI assistants with memory!_** + +[lb]: https://langbase.com +[pipe]: https://langbase.com/examples/talk-to-excel-agent +[gh]: https://github.com/LangbaseInc/baseai/tree/main/examples/agents/talk-to-excel-sheets-agent +[cover]:https://raw.githubusercontent.com/LangbaseInc/docs-images/main/baseai/baseai-cover.png +[download]:https://download-directory.github.io/?url=https://github.com/LangbaseInc/baseai/tree/main/examples/talk-to-excel-sheets-agent +[learn]:https://baseai.dev/learn +[memory]:https://baseai.dev/docs/memory/quickstart +[toolcalls]:https://baseai.dev/docs/tools/quickstart +[deploy]:https://baseai.dev/docs/deployment/authentication +[signup]: https://langbase.fyi/io +[qs]:https://baseai.dev/docs/pipe/quickstart +[docs]:https://baseai.dev/docs +[xaa]:https://x.com/MrAhmadAwais +[xab]:https://x.com/AhmadBilalDev +[local]:http://localhost:9000 +[mit]: https://img.shields.io/badge/license-MIT-blue.svg?style=for-the-badge&color=%23000000 +[fork]: https://img.shields.io/badge/FORK%20ON-%E2%8C%98%20Langbase-000000.svg?style=for-the-badge&logo=%E2%8C%98%20Langbase&logoColor=000000 \ No newline at end of file From 625fbdb522702492d35f670b3bf09c07d7504ba3 Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:44:38 +0100 Subject: [PATCH 04/11] added packages for talk-to-excel-agent --- .../talk-to-excel-sheets-agent/package.json | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/package.json diff --git a/examples/agents/talk-to-excel-sheets-agent/package.json b/examples/agents/talk-to-excel-sheets-agent/package.json new file mode 100644 index 00000000..af59e340 --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/package.json @@ -0,0 +1,25 @@ +{ + "name": "talk-to-excel-agent", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "baseai": "baseai" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "@baseai/core": "^0.9.3", + "danfojs-node": "^1.1.2", + "dotenv": "^16.4.5", + "inquirer": "^12.0.0", + "ora": "^8.1.0", + "tsx": "^4.19.2", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "baseai": "^0.9.3" + } +} From a2b856ac27a95fb4830166319c852f7324ee6c59 Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:45:54 +0100 Subject: [PATCH 05/11] added main cli for talk-to-excel-agent --- .../talk-to-excel-sheets-agent/index.ts | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/index.ts diff --git a/examples/agents/talk-to-excel-sheets-agent/index.ts b/examples/agents/talk-to-excel-sheets-agent/index.ts new file mode 100644 index 00000000..8938cfb5 --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/index.ts @@ -0,0 +1,73 @@ +import 'dotenv/config'; +import {Message, Pipe} from '@baseai/core'; +import inquirer from 'inquirer'; +import ora from 'ora'; +import chalk from 'chalk'; +import pipeTalkToExcelAgent from './baseai/pipes/talk-to-excel-agent'; + + +const pipe = new Pipe(pipeTalkToExcelAgent()); + +async function main() { + const initialSpinner = ora( + 'Connecting to talk-to-excel-agent...', + ).start(); + // Messages array for keeping track of the conversation + const messages: Message[] = [ + // Initial message to the agent + {role: 'user', content: 'Please provide your initial analysis?'}, + ]; + + try { + const {completion} = await pipe.run({ + messages, + }); + + // Add the agent response to the messages array + messages.push({role: 'assistant', content: completion}); + + initialSpinner.stop(); + console.log(chalk.cyan('Agent response...')); + console.log(completion); + } catch (error) { + initialSpinner.stop(); + console.error(chalk.red('Error processing initial request:'), error); + } + + while (true) { + const {userMsg} = await inquirer.prompt([ + { + type: 'input', + name: 'userMsg', + message: chalk.blue( + 'Enter your query (or type "exit" to quit):', + ), + }, + ]); + + if (userMsg.toLowerCase() === 'exit') { + console.log(chalk.green('Goodbye!')); + break; + } + + const spinner = ora('Processing your request...').start(); + messages.push({role: 'user', content: userMsg}); + try { + const {completion: talkToExcelAgentResp} = await pipe.run({ + messages, + }); + messages.push({ + role: 'assistant', + content: talkToExcelAgentResp, + }); + spinner.stop(); + console.log(chalk.cyan('Agent:')); + console.log(talkToExcelAgentResp); + } catch (error) { + spinner.stop(); + console.error(chalk.red('Error processing your request:'), error); + } + } +} + +main(); From ec8854dacb0677bee49a3abbe21686ca7e970813 Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:51:44 +0100 Subject: [PATCH 06/11] updated readme --- examples/agents/talk-to-excel-sheets-agent/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/agents/talk-to-excel-sheets-agent/README.md b/examples/agents/talk-to-excel-sheets-agent/README.md index 47754fcf..4e920c51 100644 --- a/examples/agents/talk-to-excel-sheets-agent/README.md +++ b/examples/agents/talk-to-excel-sheets-agent/README.md @@ -4,7 +4,7 @@ ## Build a Talk To Excel Agent with BaseAI framework — ⌘ Langbase -The **Talk To Excel Agent** is an AI-powered data analysis tool that streamlines your Excel workflows by automatically analyzing uploaded files to provide comprehensive overviews and actionable insights. Utilizing BaseAI's memory and tool call features, it delivers detailed summaries of data structure, identifies patterns and trends, and highlights potential data quality issues. +The **Talk To Excel Agent** is an BaseAI powered data analysis tool that streamlines your Excel workflows by automatically analyzing uploaded files to provide comprehensive overviews and actionable insights. Utilizing BaseAI's memory and tool call features, it delivers detailed summaries of data structure, identifies patterns and trends, and highlights potential data quality issues. The agent guides you toward meaningful analysis by suggesting key areas for deeper exploration and assisting in refining queries. Additionally, you can combine this agent with the Excel Formula Generation Agent to access a suite of powerful tools for analyzing your financial data effectively without losing sight of the bigger picture. Configurable through the baseai.config.ts file, logging is disabled by default. By bridging the gap between business questions and technical Excel operations, the Talk To Excel Agent empowers you to make data-driven decisions efficiently and effectively. From c29b2b993e478d2633d1b746cfb23242e64dcf9c Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:52:09 +0100 Subject: [PATCH 07/11] baseai logs switched off by default for talk-to-excel-agent --- .../baseai/baseai.config.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/baseai/baseai.config.ts diff --git a/examples/agents/talk-to-excel-sheets-agent/baseai/baseai.config.ts b/examples/agents/talk-to-excel-sheets-agent/baseai/baseai.config.ts new file mode 100644 index 00000000..3c0328bc --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/baseai/baseai.config.ts @@ -0,0 +1,18 @@ +import type { BaseAIConfig } from 'baseai'; + +export const config: BaseAIConfig = { + log: { + isEnabled: false, + logSensitiveData: false, + pipe: true, + 'pipe.completion': true, + 'pipe.request': true, + 'pipe.response': true, + tool: true, + memory: true + }, + memory: { + useLocalEmbeddings: false + }, + envFilePath: '.env' +}; From f6dc482804fcf0fc41311b62f32ca04f5c7e7a1d Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:52:45 +0100 Subject: [PATCH 08/11] baseai memory with sample xlsx and csv files --- .../Sample-Sales-Data.xlsx | Bin 0 -> 29380 bytes .../documents/Sample-Sales-Data.csv | 391 ++++++++++++++++++ .../memory/talk-to-excel-memory/index.ts | 9 + 3 files changed, 400 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/Sample-Sales-Data.xlsx create mode 100644 examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/documents/Sample-Sales-Data.csv create mode 100644 examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/index.ts diff --git a/examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/Sample-Sales-Data.xlsx b/examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/Sample-Sales-Data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..04ac8aba5c9b72508667cf6b25578976823b0d51 GIT binary patch literal 29380 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 w`~DDrV!Z literal 0 HcmV?d00001 diff --git a/examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/documents/Sample-Sales-Data.csv b/examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/documents/Sample-Sales-Data.csv new file mode 100644 index 00000000..efc6b4d6 --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/documents/Sample-Sales-Data.csv @@ -0,0 +1,391 @@ +Postcode,Sales_Rep_ID,Sales_Rep_Name,Year,Value +2121,456,Jane,2011,"$84,219" +2092,789,Ashish,2012,"$28,322" +2128,456,Jane,2013,"$81,879" +2073,123,John,2011,"$44,491" +2134,789,Ashish,2012,"$71,838" +2162,123,John,2013,"$64,532" +2093,456,Jane,2011,"$58,963" +2042,789,Ashish,2012,"$27,522" +2198,123,John,2013,"$77,985" +2043,789,Ashish,2011,"$49,546" +2025,789,Ashish,2012,"$17,734" +2045,456,Jane,2013,"$91,126" +2090,456,Jane,2011,"$48,113" +2114,456,Jane,2012,"$28,361" +2142,456,Jane,2013,"$50,912" +2062,123,John,2011,"$75,539" +2049,456,Jane,2012,"$96,922" +2204,456,Jane,2013,"$57,838" +2000,456,Jane,2011,"$4,530" +2135,123,John,2012,"$27,761" +2115,456,Jane,2013,"$22,773" +2032,789,Ashish,2011,"$98,780" +2068,456,Jane,2012,"$66,044" +2119,789,Ashish,2013,"$32,882" +2060,456,Jane,2011,"$75,822" +2072,456,Jane,2012,"$36,675" +2045,123,John,2013,"$95,817" +2140,456,Jane,2011,"$43,627" +2205,789,Ashish,2012,"$93,306" +2060,123,John,2013,"$71,322" +2042,456,Jane,2011,"$92,023" +2118,123,John,2012,"$40,655" +2137,789,Ashish,2013,"$95,518" +2021,789,Ashish,2011,"$24,550" +2044,123,John,2012,"$65,166" +2008,789,Ashish,2013,"$52,576" +2142,789,Ashish,2011,"$2,356" +2027,456,Jane,2012,"$11,444" +2110,456,Jane,2013,"$30,569" +2137,123,John,2011,"$83,085" +2164,789,Ashish,2012,"$82,490" +2067,789,Ashish,2013,"$23,819" +2100,123,John,2011,"$60,571" +2032,456,Jane,2012,"$81,538" +2038,789,Ashish,2013,"$51,840" +2011,123,John,2011,"$8,502" +2143,789,Ashish,2012,"$41,610" +2170,456,Jane,2013,"$10,063" +2049,789,Ashish,2011,"$87,702" +2086,456,Jane,2012,"$99,436" +2032,123,John,2013,"$88,957" +2203,123,John,2011,"$18,846" +2198,456,Jane,2012,"$70,963" +2112,456,Jane,2013,"$45,571" +2052,456,Jane,2011,"$12,148" +2133,456,Jane,2012,"$30,272" +2164,456,Jane,2013,"$62,744" +2087,789,Ashish,2011,$106 +2065,456,Jane,2012,"$30,815" +2008,456,Jane,2013,"$89,093" +2137,456,Jane,2011,"$22,748" +2162,456,Jane,2012,"$8,396" +2016,789,Ashish,2013,"$64,711" +2099,789,Ashish,2011,"$25,131" +2040,456,Jane,2012,"$79,001" +2034,789,Ashish,2013,"$32,184" +2044,789,Ashish,2011,"$72,567" +2190,789,Ashish,2012,"$18,508" +2205,123,John,2013,"$69,531" +2006,123,John,2011,"$63,822" +2190,456,Jane,2012,"$80,225" +2132,789,Ashish,2013,"$33,048" +2147,123,John,2011,"$36,421" +2006,789,Ashish,2012,"$73,725" +2062,456,Jane,2013,"$30,811" +2134,123,John,2011,"$33,404" +2110,789,Ashish,2012,"$60,876" +2165,789,Ashish,2013,"$37,754" +2009,123,John,2011,"$22,853" +2195,789,Ashish,2012,"$5,535" +2029,123,John,2013,"$42,456" +2199,123,John,2011,"$91,204" +2068,123,John,2012,"$3,038" +2009,456,Jane,2013,"$85,747" +2043,456,Jane,2011,"$81,013" +2046,456,Jane,2012,"$6,259" +2050,456,Jane,2013,"$80,519" +2047,789,Ashish,2011,"$79,290" +2114,123,John,2012,"$69,906" +2041,789,Ashish,2013,"$57,233" +2023,456,Jane,2011,"$77,798" +2094,456,Jane,2012,"$42,384" +2022,123,John,2013,"$39,847" +2026,456,Jane,2011,"$36,794" +2007,123,John,2012,"$10,190" +2064,456,Jane,2013,"$52,484" +2023,123,John,2011,"$12,963" +2125,789,Ashish,2012,"$79,116" +2070,123,John,2013,"$16,574" +2092,456,Jane,2011,"$27,554" +2040,789,Ashish,2012,"$37,597" +2096,123,John,2013,"$59,562" +2123,456,Jane,2011,"$59,035" +2200,456,Jane,2012,"$36,868" +2099,456,Jane,2013,"$1,839" +2166,456,Jane,2011,"$97,072" +2160,123,John,2012,"$16,914" +2048,456,Jane,2013,"$49,053" +2030,123,John,2011,"$19,847" +2093,789,Ashish,2012,"$33,781" +2127,456,Jane,2013,"$18,870" +2160,456,Jane,2011,"$68,071" +2119,456,Jane,2012,"$51,034" +2088,456,Jane,2013,"$64,901" +2029,789,Ashish,2011,"$47,448" +2038,456,Jane,2012,"$16,708" +2046,789,Ashish,2013,"$63,444" +2070,789,Ashish,2011,"$62,106" +2089,123,John,2012,"$9,348" +2139,123,John,2013,"$2,676" +2117,789,Ashish,2011,"$12,348" +2109,123,John,2012,"$95,787" +2141,456,Jane,2013,"$28,465" +2115,789,Ashish,2011,"$28,358" +2196,123,John,2012,"$66,107" +2093,123,John,2013,"$69,062" +2129,789,Ashish,2011,"$9,997" +2068,789,Ashish,2012,"$13,716" +2136,456,Jane,2013,"$8,607" +2113,123,John,2011,"$31,430" +2195,123,John,2012,"$74,719" +2134,456,Jane,2013,"$28,814" +2194,789,Ashish,2011,"$11,589" +2017,456,Jane,2012,"$15,792" +2122,789,Ashish,2013,"$62,984" +2066,456,Jane,2011,"$12,902" +2203,789,Ashish,2012,"$68,657" +2150,789,Ashish,2013,"$44,106" +2121,789,Ashish,2011,"$5,491" +2142,123,John,2012,"$78,419" +2117,456,Jane,2013,"$4,380" +2096,456,Jane,2011,"$70,422" +2162,789,Ashish,2012,"$18,159" +2041,456,Jane,2013,"$11,743" +2127,123,John,2011,"$11,934" +2128,789,Ashish,2012,"$95,799" +2034,456,Jane,2013,"$36,756" +2166,789,Ashish,2011,"$47,447" +2133,123,John,2012,"$41,256" +2170,789,Ashish,2013,"$2,676" +2135,456,Jane,2011,"$94,182" +2116,123,John,2012,"$49,808" +2144,123,John,2013,"$22,950" +2144,456,Jane,2011,"$54,906" +2133,789,Ashish,2012,"$14,909" +2034,123,John,2013,"$46,115" +2112,123,John,2011,"$81,701" +2143,123,John,2012,"$37,556" +2203,456,Jane,2013,"$85,516" +2111,123,John,2011,"$31,844" +2037,456,Jane,2012,"$49,010" +2018,456,Jane,2013,"$19,506" +2145,123,John,2011,"$42,691" +2100,456,Jane,2012,"$28,370" +2041,123,John,2013,"$26,094" +2129,456,Jane,2011,"$48,260" +2197,789,Ashish,2012,"$95,119" +2060,789,Ashish,2013,"$53,020" +2198,789,Ashish,2011,"$10,619" +2191,789,Ashish,2012,"$59,382" +2047,123,John,2013,"$1,126" +2010,123,John,2011,"$40,301" +2146,789,Ashish,2012,"$43,403" +2143,456,Jane,2013,"$74,226" +2206,789,Ashish,2011,"$1,425" +2071,123,John,2012,"$5,592" +2095,123,John,2013,"$55,937" +2024,123,John,2011,"$12,638" +2146,123,John,2012,"$98,511" +2110,123,John,2013,"$73,319" +2044,456,Jane,2011,"$59,483" +2165,456,Jane,2012,"$45,309" +2039,789,Ashish,2013,"$71,498" +2140,789,Ashish,2011,"$32,218" +2122,456,Jane,2012,"$81,655" +2152,123,John,2013,"$34,023" +2096,789,Ashish,2011,"$9,782" +2031,789,Ashish,2012,"$96,343" +2011,456,Jane,2013,"$73,529" +2094,123,John,2011,"$90,268" +2111,456,Jane,2012,"$51,310" +2123,123,John,2013,"$45,923" +2015,123,John,2011,"$19,274" +2199,456,Jane,2012,"$89,797" +2025,123,John,2013,"$52,643" +2028,123,John,2011,"$39,759" +2025,456,Jane,2012,"$82,466" +2197,456,Jane,2013,"$21,515" +2151,789,Ashish,2011,"$76,684" +2007,789,Ashish,2012,"$18,008" +2015,789,Ashish,2013,"$22,374" +2024,789,Ashish,2011,"$69,425" +2017,123,John,2012,"$47,309" +2050,789,Ashish,2013,"$54,726" +2160,789,Ashish,2011,"$35,361" +2030,456,Jane,2012,"$87,640" +2153,123,John,2013,"$95,990" +2150,123,John,2011,"$95,860" +2151,123,John,2012,"$20,564" +2045,789,Ashish,2013,$429 +2027,789,Ashish,2011,"$15,533" +2010,456,Jane,2012,"$35,901" +2132,123,John,2013,"$54,435" +2052,123,John,2011,"$33,363" +2088,789,Ashish,2012,"$10,350" +2095,456,Jane,2013,"$29,959" +2016,123,John,2011,$219 +2071,456,Jane,2012,"$68,776" +2138,789,Ashish,2013,"$33,064" +2049,123,John,2011,"$89,721" +2090,789,Ashish,2012,"$89,379" +2021,456,Jane,2013,"$64,328" +2039,123,John,2011,"$25,195" +2031,456,Jane,2012,"$67,431" +2016,456,Jane,2013,"$46,975" +2029,456,Jane,2011,"$92,118" +2040,123,John,2012,"$91,204" +2061,456,Jane,2013,"$85,200" +2191,456,Jane,2011,"$18,627" +2052,789,Ashish,2012,"$52,173" +2129,123,John,2013,"$23,169" +2152,789,Ashish,2011,"$12,455" +2161,789,Ashish,2012,"$87,957" +2090,123,John,2013,"$41,928" +2153,789,Ashish,2011,"$92,728" +2109,789,Ashish,2012,"$42,205" +2018,123,John,2013,"$36,659" +2091,456,Jane,2011,"$34,479" +2199,789,Ashish,2012,"$25,315" +2000,789,Ashish,2013,"$83,706" +2204,789,Ashish,2011,"$99,744" +2043,123,John,2012,"$63,982" +2073,789,Ashish,2013,"$34,376" +2121,123,John,2011,"$54,647" +2028,456,Jane,2012,"$62,273" +2147,789,Ashish,2013,"$23,528" +2037,123,John,2011,"$13,588" +2028,789,Ashish,2012,"$31,935" +2128,123,John,2013,"$38,554" +2063,789,Ashish,2011,"$15,322" +2115,123,John,2012,"$8,072" +2192,456,Jane,2013,"$56,303" +2048,789,Ashish,2011,"$99,878" +2094,789,Ashish,2012,"$20,724" +2118,789,Ashish,2013,"$42,536" +2166,123,John,2011,"$81,440" +2144,789,Ashish,2012,"$34,312" +2163,789,Ashish,2013,"$58,998" +2195,456,Jane,2011,"$22,991" +2141,789,Ashish,2012,"$87,835" +2114,789,Ashish,2013,"$68,606" +2000,123,John,2011,"$29,852" +2200,789,Ashish,2012,"$12,876" +2138,456,Jane,2013,"$90,142" +2066,123,John,2011,"$82,467" +2008,123,John,2012,"$26,125" +2022,789,Ashish,2013,"$98,200" +2048,123,John,2011,"$87,567" +2061,789,Ashish,2012,"$31,230" +2193,123,John,2013,"$79,938" +2113,789,Ashish,2011,"$70,310" +2131,123,John,2012,"$35,670" +2010,789,Ashish,2013,"$95,019" +2015,456,Jane,2011,"$79,888" +2116,789,Ashish,2012,"$46,537" +2069,456,Jane,2013,"$69,285" +2112,789,Ashish,2011,"$75,682" +2033,456,Jane,2012,"$39,497" +2064,123,John,2013,"$27,992" +2161,123,John,2011,"$41,023" +2190,123,John,2012,"$63,170" +2007,456,Jane,2013,"$2,299" +2163,456,Jane,2011,"$10,715" +2153,456,Jane,2012,"$17,557" +2092,123,John,2013,"$28,856" +2039,456,Jane,2011,"$55,998" +2086,789,Ashish,2012,"$34,228" +2204,123,John,2013,"$19,759" +2047,456,Jane,2011,"$99,865" +2206,123,John,2012,"$37,002" +2009,789,Ashish,2013,"$86,506" +2197,123,John,2011,"$64,203" +2062,789,Ashish,2012,"$95,386" +2206,456,Jane,2013,"$53,130" +2119,123,John,2011,"$5,597" +2017,789,Ashish,2012,"$86,749" +2132,456,Jane,2013,"$80,783" +2066,789,Ashish,2011,"$65,530" +2072,789,Ashish,2012,"$29,271" +2088,123,John,2013,"$67,072" +2196,456,Jane,2011,"$53,379" +2163,123,John,2012,"$62,579" +2006,456,Jane,2013,"$24,773" +2030,789,Ashish,2011,"$19,130" +2087,456,Jane,2012,"$72,141" +2089,456,Jane,2013,"$67,958" +2196,789,Ashish,2011,"$60,644" +2138,123,John,2012,"$61,285" +2139,456,Jane,2013,"$91,989" +2194,456,Jane,2011,"$60,771" +2086,123,John,2012,"$26,038" +2122,123,John,2013,"$13,475" +2038,123,John,2011,"$82,932" +2061,123,John,2012,"$40,690" +2170,123,John,2013,"$36,190" +2135,789,Ashish,2011,"$46,689" +2131,789,Ashish,2012,"$30,040" +2091,123,John,2013,"$57,250" +2042,123,John,2011,"$38,292" +2205,456,Jane,2012,"$10,554" +2150,456,Jane,2013,"$73,270" +2070,456,Jane,2011,"$58,038" +2067,456,Jane,2012,"$42,027" +2130,123,John,2013,"$1,513" +2091,789,Ashish,2011,"$32,610" +2021,123,John,2012,"$16,080" +2063,123,John,2013,"$52,398" +2131,456,Jane,2011,"$66,041" +2117,123,John,2012,"$45,504" +2100,789,Ashish,2013,"$55,365" +2147,456,Jane,2011,"$81,415" +2161,456,Jane,2012,"$59,929" +2095,789,Ashish,2013,"$48,058" +2139,789,Ashish,2011,"$63,168" +2123,789,Ashish,2012,"$68,917" +2064,789,Ashish,2013,"$27,360" +2125,456,Jane,2011,"$98,235" +2152,456,Jane,2012,"$31,709" +2111,789,Ashish,2013,"$39,711" +2046,123,John,2011,"$73,978" +2113,456,Jane,2012,"$40,581" +2200,123,John,2013,"$58,858" +2027,123,John,2011,"$17,271" +2191,123,John,2012,"$7,711" +2165,123,John,2013,"$11,815" +2050,123,John,2011,"$55,591" +2065,789,Ashish,2012,"$83,495" +2023,789,Ashish,2013,"$71,676" +2069,789,Ashish,2011,"$42,792" +2069,123,John,2012,"$44,478" +2151,456,Jane,2013,"$71,535" +2146,456,Jane,2011,"$1,255" +2037,789,Ashish,2012,"$41,512" +2145,789,Ashish,2013,"$56,898" +2145,456,Jane,2011,"$72,324" +2071,789,Ashish,2012,"$80,893" +2192,123,John,2013,"$11,248" +2140,123,John,2011,"$89,202" +2026,789,Ashish,2012,"$37,881" +2033,123,John,2013,"$87,068" +2099,123,John,2011,"$82,290" +2125,123,John,2012,"$35,987" +2089,789,Ashish,2013,"$89,069" +2136,123,John,2011,"$83,059" +2022,456,Jane,2012,"$1,246" +2067,123,John,2013,"$57,863" +2127,789,Ashish,2011,"$70,494" +2118,456,Jane,2012,"$13,243" +2065,123,John,2013,"$88,485" +2193,789,Ashish,2011,"$82,687" +2073,456,Jane,2012,"$3,158" +2026,123,John,2013,"$55,339" +2011,789,Ashish,2011,"$43,356" +2087,123,John,2012,"$9,483" +2024,456,Jane,2013,"$43,002" +2192,789,Ashish,2011,"$24,078" +2109,456,Jane,2012,"$45,719" +2130,789,Ashish,2013,"$51,693" +2194,123,John,2011,"$66,864" +2141,123,John,2012,"$54,683" +2136,789,Ashish,2013,$882 +2033,789,Ashish,2011,"$76,990" +2072,123,John,2012,"$35,366" +2063,456,Jane,2013,"$93,341" +2018,789,Ashish,2011,"$97,168" +2164,123,John,2012,"$88,885" +2193,456,Jane,2013,"$79,440" +2031,123,John,2011,"$65,644" +2130,456,Jane,2012,"$66,248" +2116,456,Jane,2013,"$3,196" diff --git a/examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/index.ts b/examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/index.ts new file mode 100644 index 00000000..a4318d7d --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/baseai/memory/talk-to-excel-memory/index.ts @@ -0,0 +1,9 @@ +import { MemoryI } from '@baseai/core'; +import path from 'path'; + +const memoryTalkToExcelMemory = (): MemoryI => ({ + name: 'talk-to-excel-memory', + description: 'Sample excel file for analysis with BaseAI memory and tools call support', +}); + +export default memoryTalkToExcelMemory; From 476f608b9c3ea58266feb4069dd55927771ac405 Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:54:10 +0100 Subject: [PATCH 09/11] baseai pipe for excel-analysis-agent --- .../baseai/pipes/excel-analysis-agent.ts | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/baseai/pipes/excel-analysis-agent.ts diff --git a/examples/agents/talk-to-excel-sheets-agent/baseai/pipes/excel-analysis-agent.ts b/examples/agents/talk-to-excel-sheets-agent/baseai/pipes/excel-analysis-agent.ts new file mode 100644 index 00000000..d144f79b --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/baseai/pipes/excel-analysis-agent.ts @@ -0,0 +1,43 @@ +import { PipeI } from '@baseai/core'; + +const pipeExcelAnalysisAgent = (): PipeI => ({ + // Replace with your API key https://langbase.com/docs/api-reference/api-keys + apiKey: process.env.LANGBASE_API_KEY!, + name: `excel-analysis-agent`, + description: ``, + status: `private`, + model: `anthropic:claude-3-5-sonnet-latest`, + stream: false, + json: false, + store: true, + moderate: true, + top_p: 1, + max_tokens: 3000, + temperature: 0.41, + presence_penalty: 0, + frequency_penalty: 0, + stop: [], + tool_choice: 'auto', + parallel_tool_calls: false, + messages: [ + { + role: 'system', + content: + "You are a data analysis expert generating Danfo.js code (Only ES6 and above code is acceptable) for Excel analysis. You DONOT NEED TO DECLARE XLS_PATH variable as it has already been declared just use it. Generate code following this exact pattern and ensure that:\n\n1. **File Reading:**\n - Use the `XLS_PATH` variable to read the Excel file it is already provided but outside your context.\n - Utilize `dfd.readExcel` for file reading.\n - Do **not** include any import or require statements.\n\n2. **Function Structure:**\n - The main analysis function should return the analysis object properly.\n - Include error handling to capture and return any errors encountered during execution. \n\n3. **Data Analysis:**\n - Use only the validated DataFrame methods listed below.\n - Perform comprehensive analysis including overview and quick insights for single sheet currently in the Excel file.\n\n4. **Execution:**\n - End the script by returning the result of the analysis function to ensure the output is captured correctly.\n\n**Validated DataFrame Methods:**\n- `df.shape`\n- `df.columns`\n- `df.dtypes`\n- `df.describe()`\n- `df.head()`\n- `df.tail()`\n- `df.loc[]`\n- `df.groupby()`\n- `df.sort_values()`\n- `df.apply()`\n- `df.mean()`\n- `df.sum()`\n- `df.dropna()`\n- `df.unique()`\n\n**IMPORTANT:**\n- **Do NOT include any import or require statements.**\n- **Always use the provided `XLS_PATH` variable. It is defined outside of your generated script context.**\n- **Ensure the script handles cases where sheets are entirely missing or contain no data.**\n- **Ensure that the result of the analysis function is returned properly.**\n\n**Here is a valid tested template to Follow:**\n\n```javascript\nimport * as dfd from \"danfojs-node\";\nimport path from 'path';\n\nconst XLS_PATH = path.join(process.cwd(), 'baseai/memory/talk-to-excel-memory/documents/Sample-Sales-Data.xlsx');\n\nasync function analyzeExcelData() {\n try {\n // Read Excel file\n const df = await dfd.readExcel(XLS_PATH);\n \n // Validate DataFrame\n if (!df || !df.shape || df.shape[0] === 0) {\n return { error: \"No valid data found in the Excel file.\" };\n }\n\n const analysis = {\n overview: {\n dimensions: df.shape,\n columns: df.columns,\n types: df.dtypes\n },\n insights: {\n summary: dfd.toJSON(df.describe(), { format: 'row' }),\n preview: dfd.toJSON(df.head(), { format: 'row' })\n }\n };\n\n // Add numerical column analysis if available\n const numericCols = df.columns.filter(col => \n df.dtypes[col] === 'float64' || df.dtypes[col] === 'int64'\n );\n\n if (numericCols.length > 1) {\n const numericDf = df.loc({ columns: numericCols });\n analysis.insights.statistics = {\n mean: dfd.toJSON(numericDf.mean(), { format: 'row' }),\n sum: dfd.toJSON(numericDf.sum(), { format: 'row' })\n };\n }\n\n return analysis;\n } catch (error) {\n return { error: error.message };\n }\n}\n\n// Execute the analysis function and handle the results\nreturn analyzeExcelData()\n```" + + }, + { name: 'json', role: 'system', content: '' }, + { name: 'safety', role: 'system', content: '' }, + { + name: 'opening', + role: 'system', + content: 'Welcome to Langbase. Prompt away!' + }, + { name: 'rag', role: 'system', content: '' } + ], + variables: [], + tools: [], + memory: [] +}); + +export default pipeExcelAnalysisAgent; From f4d362c8cbed80acdefc9e1cb35f3ab910e672a4 Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:56:15 +0100 Subject: [PATCH 10/11] baseai pipe for talk-to-excel-agent --- .../baseai/pipes/talk-to-excel-agent.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/baseai/pipes/talk-to-excel-agent.ts diff --git a/examples/agents/talk-to-excel-sheets-agent/baseai/pipes/talk-to-excel-agent.ts b/examples/agents/talk-to-excel-sheets-agent/baseai/pipes/talk-to-excel-agent.ts new file mode 100644 index 00000000..e295a9de --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/baseai/pipes/talk-to-excel-agent.ts @@ -0,0 +1,45 @@ +import { PipeI } from '@baseai/core'; +import callScriptAgentTool from '../tools/call-script-agent'; +import memoryTalkToExcelMemory from '../memory/talk-to-excel-memory'; +import toolExecuteJs from '../tools/execute-js'; + +const pipeTalkToExcelAgent = (): PipeI => ({ + // Replace with your API key https://langbase.com/docs/api-reference/api-keys + apiKey: process.env.LANGBASE_API_KEY!, + name: `talk-to-excel-agent`, + description: ``, + status: `private`, + model: `openai:gpt-4o-mini`, + stream: false, + json: false, + store: true, + moderate: true, + top_p: 1, + max_tokens: 4096, + temperature: 0.38, + presence_penalty: 0, + frequency_penalty: 0, + stop: [], + tool_choice: 'auto', + parallel_tool_calls: true, + messages: [ + { + role: 'system', + content: + 'You are an expert data analyst specializing in Excel data analysis. Use your initial analysis on the data on subsequent user queries in order to make effective tools call. \n\nYour primary role is to:\n1. Analyze Excel files uploaded by users\n2. Provide initial data insights\n3. Guide users toward meaningful analysis\n4. Help refine queries for formula generation\n5. Bridge the gap between business questions and technical Excel operations\n\n# Initial Analysis Protocol\nWhen a user uploads an Excel file, automatically provide:\n\n1. Data Overview:\n- Sheet and its name\n- Row and column counts\n- Data types present\n- Date ranges if applicable\n- Key column identifications\n- Missing data patterns\n\n2. Quick Insights:\n- Notable patterns or trends\n- Potential data quality issues\n- Unusual values or outliers\n- Basic statistical summaries of numerical columns\n- Relationships between different columns\n\n\n\n# Interaction Guidelines\n\n## First Interaction\n1. Present the initial analysis in a structured, easy-to-understand format\n2. Highlight 2-3 potentially interesting areas for deeper analysis\n3. Ask specific questions about the user\'s analytical goals 4. Before presenting your first analysis you will make a tool call: "call_script_agent" with all the questions that you need for your initial analysis and wait for the tool call to return the response then you will another tool call:"executeJs" that will execute the script from call_script_agent, you will wait to the results to return as this will have answers for you to reconcile. \n\nExample First Response:\n```\nI\'ve analyzed your Excel file. Here\'s what I found:\n\n📊 Data Structure:\n- 3 sheets: Sales, Inventory, Customers\n- Sales sheet: 1,200 rows × 8 columns\n- Primary data types: dates, currency, categorical\n\n🔍 Key Observations:\n1. Sales data spans Jan 2023 - Dec 2023\n2. 3 product categories identified\n3. Notable seasonality in sales patterns\n\n💡 Potential Areas for Analysis:\n1. Sales trend analysis by product category\n2. Customer purchase frequency patterns\n3. Inventory turnover rates\n\nWhat specific aspects of this data would you like to explore further?\n```\n\n## Follow-up Interactions\n\n1. Query Refinement:\n- Break down complex questions into analyzable components\n- Suggest specific metrics or approaches\n- Translate business questions into analytical frameworks\n\n2. Formula Guidance:\nWhen users need Excel formulas, provide:\n- Clear description of the analysis needed\n- Key variables and relationships to consider\n- Refined query suitable for an Excel formula generator\n\nExample Query Refinement:\n```\nUser: "I want to see how sales are performing"\n\nYour Response:\n"Let me help refine this analysis. We could look at:\n\n1. Month-over-month sales growth\n2. Sales performance by:\n - Product category\n - Customer segment\n - Geographic region\n3. Comparison against targets/previous periods\n\nWhich aspect would you like to focus on? Once you decide, I can help formulate a specific query for getting the exact Excel formulas needed."\n```\n\n# Analysis Framework\n\n## Data Insights Hierarchy:\n1. Descriptive (What happened?)\n- Basic trends\n- Pattern identification\n- Summary statistics\n\n2. Diagnostic (Why did it happen?)\n- Correlation analysis\n- Factor comparison\n- Anomaly investigation\n\n3. Predictive (What might happen?)\n- Trend projections\n- Pattern extrapolation\n- Scenario suggestions\n\n## Response Structure:\n1. Acknowledge user\'s question\n2. Provide initial insights\n3. Suggest deeper analysis paths\n4. Offer refined query for formula generation\n5. Ask clarifying questions if needed\n\n# Special Considerations\n\n1. Data Privacy:\n- Never suggest sharing sensitive data\n- Focus on analysis methods rather than specific values\n- Use placeholder values in examples\n\n2. Technical Limitations:\n- Acknowledge when certain analyses require additional data\n- Suggest alternative approaches when necessary\n- Be clear about analytical assumptions\n\n3. User Guidance:\n- Provide context for suggested analyses\n- Explain why certain approaches are recommended\n- Help users understand the business implications of findings\n\n# Error Handling\n\nWhen encountering issues:\n1. Clearly explain the limitation or problem\n2. Offer alternative approaches\n3. Guide user toward more answerable questions\n4. Suggest data improvements if relevant\n\nExample Error Response:\n```\nI notice the sales dates are inconsistent. For better analysis, I suggest:\n1. Standardizing date formats\n2. Checking for missing periods\n3. Verifying data entry patterns\n\nWould you like guidance on how to address these issues before proceeding with the analysis?\n```' + }, + { name: 'json', role: 'system', content: '' }, + { name: 'safety', role: 'system', content: '' }, + { + name: 'opening', + role: 'system', + content: 'Welcome to Langbase. Prompt away!' + }, + { name: 'rag', role: 'system', content: '' } + ], + variables: [], + tools: [callScriptAgentTool(), toolExecuteJs()], + memory: [memoryTalkToExcelMemory()] +}); + +export default pipeTalkToExcelAgent; From 5c50f7360d8acf5264bff2552a4d33bbef6fe39a Mon Sep 17 00:00:00 2001 From: ali Date: Tue, 29 Oct 2024 23:56:45 +0100 Subject: [PATCH 11/11] baseai tool calls for talk-to-excel-agent --- .../baseai/tools/call-script-agent.ts | 34 +++++++++ .../baseai/tools/execute-js.ts | 71 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 examples/agents/talk-to-excel-sheets-agent/baseai/tools/call-script-agent.ts create mode 100644 examples/agents/talk-to-excel-sheets-agent/baseai/tools/execute-js.ts diff --git a/examples/agents/talk-to-excel-sheets-agent/baseai/tools/call-script-agent.ts b/examples/agents/talk-to-excel-sheets-agent/baseai/tools/call-script-agent.ts new file mode 100644 index 00000000..32bc7d46 --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/baseai/tools/call-script-agent.ts @@ -0,0 +1,34 @@ +import { ToolI, Pipe } from '@baseai/core'; +import pipeExcelAnalysisAgent from '../pipes/excel-analysis-agent'; + +const pipe = new Pipe(pipeExcelAnalysisAgent()); + +export async function call_script_agent({customerQuery}: {customerQuery: string}) { + // Your tool logic here + const excelAnalysisAgentResp = await pipe.run({ + messages: [{ role: 'user', content: customerQuery }], + }); + + return excelAnalysisAgentResp.completion; +} + +const callScriptAgentTool = (): ToolI => ({ + run: call_script_agent, // Name of the function to run + type: 'function' as const, + function: { + name: `call_script_agent`, + description: `Call this function to provide analysis of the attached excel file with danfo.js script`, + parameters: { + type: 'object', + properties: { + customerQuery: { + type: 'string', + description: 'JavaScript danfo.js script for data analysis' + } + }, + required: ['customerQuery'] + } + } +}); + +export default callScriptAgentTool; diff --git a/examples/agents/talk-to-excel-sheets-agent/baseai/tools/execute-js.ts b/examples/agents/talk-to-excel-sheets-agent/baseai/tools/execute-js.ts new file mode 100644 index 00000000..d119029d --- /dev/null +++ b/examples/agents/talk-to-excel-sheets-agent/baseai/tools/execute-js.ts @@ -0,0 +1,71 @@ +import { ToolI } from '@baseai/core'; +import * as dfd from "danfojs-node"; +import path from 'path'; + +const CSV_PATH = path.join(process.cwd(), 'baseai/memory/talk-to-excel-memory/documents/Sample-Sales-Data.csv'); +const XLS_PATH = path.join(process.cwd(), 'baseai/memory/talk-to-excel-memory/Sample-Sales-Data.xlsx'); + +export async function executeJs({ script }: { script: string }) { + try { + // Clean the script by removing import statements + let cleanedScript = script + .replace(/import.*?;/g, '') + .replace(/danfo\./g, 'dfd.') + .replace(/const XLS_PATH.*?;/g, ''); + + // Additional cleaning: remove any semicolons at the end + cleanedScript = cleanedScript.trim(); + if (!cleanedScript.endsWith(';')) { + cleanedScript += ';'; + } + + // Validate that cleanedScript is not empty + if (!cleanedScript) { + throw new Error('The cleaned script is empty. Please check the generated script.'); + } + + // Create function with dfd and XLS_PATH context + const scriptFn = new Function('dfd', 'XLS_PATH', ` + return (async () => { + try { + ${cleanedScript} + } catch (err) { + return { error: err.message }; + } + })(); + `); + + // Execute with dfd and XLS_PATH available + const result = await scriptFn(dfd, XLS_PATH); + console.log('Analysis Results:', JSON.stringify(result, null, 2)); + return { result }; + + } catch (error) { + console.error('Error during script execution:', error); + return { + result: { error: error instanceof Error ? error.message : 'Unknown error during script execution' } + }; + } +} + + +const toolExecuteJs = (): ToolI => ({ + run: executeJs, + type: 'function' as const, + function: { + name: 'executeJs', + description: 'Execute danfo.js script for data analysis on Excel data', + parameters: { + type: 'object', + properties: { + script: { + type: 'string', + description: 'The Danfo.js script to execute (dependencies will be provided)' + } + }, + required: ['script'] + } + } +}); + +export default toolExecuteJs;