feat: support bots (#39)

This commit is contained in:
sigoden
2024-06-08 20:46:27 +08:00
committed by GitHub
parent 82d7a7de8a
commit 213e949fc8
12 changed files with 757 additions and 9 deletions
+1
View File
@@ -0,0 +1 @@
../todo-sh/index.yaml
+73
View File
@@ -0,0 +1,73 @@
const fs = require('fs');
const path = require('path');
/**
* Add a new todo item
* @typedef {Object} AddTodoArgs
* @property {string} desc - The task description
* @param {AddTodoArgs} args
*/
exports.add_todo = function addTodo(args) {
const todosFile = _getTodosFile();
if (fs.existsSync(todosFile)) {
const num = JSON.parse(fs.readFileSync(todosFile)).reduce((max, item) => Math.max(max, item.id), 0) + 1;
const data = fs.readFileSync(todosFile);
fs.writeFileSync(todosFile, JSON.stringify([...JSON.parse(data), { id: num, desc: args.desc }]));
console.log(`Successfully added todo id=${num}`);
} else {
fs.writeFileSync(todosFile, JSON.stringify([{ id: 1, desc: args.desc }]));
console.log('Successfully added todo id=1');
}
}
/**
* Delete an existing todo item
* @typedef {Object} DelTodoArgs
* @property {number} id - The task id
* @param {DelTodoArgs} args
*/
exports.del_todo = function delTodo(args) {
const todosFile = _getTodosFile();
if (fs.existsSync(todosFile)) {
const data = fs.readFileSync(todosFile);
const newData = JSON.parse(data).filter(item => item.id !== args.id);
fs.writeFileSync(todosFile, JSON.stringify(newData));
console.log(`Successfully deleted todo id=${args.id}`);
} else {
_die('Empty todo list');
}
}
/**
* Display the current todo list in json format.
*/
exports.list_todos = function listTodos() {
const todosFile = _getTodosFile();
if (fs.existsSync(todosFile)) {
console.log(fs.readFileSync(todosFile, "utf8"));
} else {
_die('Empty todo list');
}
}
/**
* Delete the entire todo list.
*/
exports.clear_todos = function clearTodos() {
const todosFile = _getTodosFile();
fs.unlinkSync(todosFile)
console.log("Successfully deleted entry todo list");
}
function _getTodosFile() {
const cacheDir = process.env.LLM_BOT_CACHE_DIR || '/tmp';
if (!fs.existsSync(cacheDir)) {
fs.mkdirSync(cacheDir, { recursive: true });
}
return path.join(cacheDir, 'todos.json');
}
function _die(message) {
console.error(message);
process.exit(1);
}
+1
View File
@@ -0,0 +1 @@
../todo-sh/index.yaml
+65
View File
@@ -0,0 +1,65 @@
import json
import sys
import os
from json import JSONDecodeError
def add_todo(desc: str):
"""Add a new todo item
Args:
desc: The task description
"""
todos_file = _get_todos_file()
try:
with open(todos_file, "r") as f:
data = json.load(f)
except (FileNotFoundError, JSONDecodeError):
data = []
num = max([item["id"] for item in data] + [0]) + 1
data.append({"id": num, "desc": desc})
with open(todos_file, "w") as f:
json.dump(data, f)
print(f"Successfully added todo id={num}")
def del_todo(id: int):
"""Delete an existing todo item
Args:
id: The task id
"""
todos_file = _get_todos_file()
try:
with open(todos_file, "r") as f:
data = json.load(f)
except (FileNotFoundError, JSONDecodeError):
_die("Empty todo list")
data = [item for item in data if item["id"] != id]
with open(todos_file, "w") as f:
json.dump(data, f)
print(f"Successfully deleted todo id={id}")
def list_todos():
"""Display the current todo list in json format."""
todos_file = _get_todos_file()
try:
with open(todos_file, "r") as f:
print(f.read())
except FileNotFoundError:
_die("Empty todo list")
def clear_todos():
"""Delete the entire todo list."""
os.remove(_get_todos_file())
def _get_todos_file() -> str:
cache_dir=os.environ.get("LLM_BOT_CACHE_DIR", "/tmp")
if not os.path.exists(cache_dir):
os.makedirs(cache_dir, exist_ok=True)
return os.path.join(cache_dir, "todos.json")
def _die(msg: str):
print(msg, file=sys.stderr)
exit(1)
+19
View File
@@ -0,0 +1,19 @@
name: Todo List
description: Your name is TodoBot and you are a helpful chatbot that manages a todo list.
instructions: |
You will be provided with a list of todos.
Users can interact with you using the following commands:
* add_todo: Add a todo to the list.
* rm_todo: Remove a todo from the list.
* list_todos: Display the current todo list.
* clear_todos: Delete the entire todo list.
Based on the interaction, ensure that you provide appropriate confirmations or errors for the requested operation. For example:
- Confirmations: "Todo item added successfully!", "Todo item removed successfully!", "All todo items deleted!"
- Errors: "Cannot add todo item, missing description.", "Todo item with id {id} not found.", "No todo items to delete."
Make sure you understand the user request properly before performing any action. If unsure, ask clarifying questions like "Do you want to remove all todos or just a specific one?"
conversation_starters:
- "Add a new todo item 'Finish report'."
- "Remove the todo item with id=2."
- "Delete all my todos."
- "What todos do I have pending?"
- "How can I remove a specific todo item?"
+72
View File
@@ -0,0 +1,72 @@
#!/usr/bin/env bash
set -e
# @cmd Add a new todo item
# @option --desc! The task description
add_todo() {
todos_file="$(_get_todos_file)"
if [[ -f "$todos_file" ]]; then
num="$(cat "$todos_file" | jq '[.[].id] | max + 1')"
data="$(cat "$todos_file")"
else
num=1
data="[]"
fi
echo "$data" | \
jq --arg new_id $num \
--arg new_desc "$argc_desc" \
'. += [{"id": $new_id | tonumber, "desc": $new_desc}]' \
> "$todos_file"
echo "Successfully added todo id=$num"
}
# @cmd Delete an existing todo item
# @option --id! <INT> The task id
del_todo() {
todos_file="$(_get_todos_file)"
if [[ -f "$todos_file" ]]; then
data="$(cat "$todos_file")"
echo "$data" | \
jq --arg id $argc_id '[.[] | select(.id != ($id | tonumber))]' \
> "$todos_file"
echo "Successfully deleted todo id=$argc_id"
else
_die "Empty todo list"
fi
}
# @cmd Display the current todo list in json format.
list_todos() {
todos_file="$(_get_todos_file)"
if [[ -f "$todos_file" ]]; then
cat "$todos_file"
else
_die "Empty todo list"
fi
}
# @cmd Delete the entire todo list.
clear_todos() {
todos_file="$(_get_todos_file)"
if [[ -f "$todos_file" ]]; then
rm -rf "$todos_file"
fi
echo "Successfully deleted entry todo list"
}
_argc_before() {
todos_file="$(_get_todos_file)"
mkdir -p "$(dirname "$todos_file")"
}
_get_todos_file() {
echo "${LLM_BOT_CACHE_DIR:-/tmp}/todos.json"
}
_die() {
echo "$*" >&2
exit 1
}
# See more details at https://github.com/sigoden/argc
eval "$(argc --argc-eval "$0" "$@")"