Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions agents/json-viewer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Json-Viewer

An AI agent to view and filter json data

The agent only sends the JSON schema instead of the JSON data to the LLM, which has the following advantages:

- Less data transmission, faster response speed, and lower token costs.
- More privacy, as no actual JSON data is transmitted.

![json-viewer](https://github.com/user-attachments/assets/3ae126f4-d741-4929-bf70-640530ccdfd8)
5 changes: 5 additions & 0 deletions agents/json-viewer/index.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: Json-Viewer
description: An AI agent to view and filter json data
version: 0.1.0
instructions: ""
dynamic_instructions: true
7 changes: 7 additions & 0 deletions agents/json-viewer/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"dependencies": {
"@inquirer/input": "^4.0.2",
"json-schema-generator": "^2.0.6",
"node-jq": "^6.0.1"
}
}
49 changes: 49 additions & 0 deletions agents/json-viewer/tools.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const fs = require("node:fs/promises");
const { exec } = require("node:child_process");
const { promisify } = require("node:util");
const path = require("node:path");
const { tmpdir } = require("node:os");

const jq = require("node-jq");
const jsonSchemaGenerator = require("json-schema-generator");
const input = require("@inquirer/input").default;

exports._instructions = async function () {
const value = await input({ message: "Enter the json file path or command to generate json", required: true });
let json_file_path;
let generate_json_command_context = "";
try {
await fs.access(value);
json_file_path = value;
} catch {
generate_json_command_context = `command_to_generate_json: \`${value}\`\n`;
const { stdout } = await promisify(exec)(value, { maxBuffer: 100 * 1024 * 1024});
json_file_path = path.join(tmpdir(), `${process.env.LLM_AGENT_NAME}-${process.pid}.data.json`);
await fs.writeFile(json_file_path, stdout);
console.log(`ⓘ Generated json data saved to: ${json_file_path}`);
}

const json_data = await fs.readFile(json_file_path, "utf8");
const json_schema = jsonSchemaGenerator(JSON.parse(json_data));

return `You are a AI agent that can view and filter json data with jq.

## Context
${generate_json_command_context}json_file_path: ${json_file_path}
json_schema: ${JSON.stringify(json_schema, null, 2)}
`
}

/**
* Print the json data.
*
* @typedef {Object} Args
* @property {string} json_file_path The json file path
* @property {string} jq_expr The jq expression
* @param {Args} args
*/
exports.print_json = async function (args) {
const { json_file_path, jq_expr } = args;
const result = await jq.run(jq_expr, json_file_path, { raw: true });
console.log(result);
}
Loading