ref: 1f68d6a68ba2b4512d963ea2815280cabe707f53
dir: /oai.c/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <json.h>
#include "oai.h"
static void
usage(void)
{
fprint(2, "usage: %s [-dq] [-k apikey] [-m model] [-u baseurl] [-s sysprompt]\n", argv0);
exits("usage");
}
OTool *tools;
static void
inittools(void)
{
tools = maketool(nil, Function, "list_files", "list all files in the current directory", nil);
}
static char*
toolcall(OToolcall tc)
{
fprint(2, "toolcall!\n");
fprint(2, " name: %s\n", tc.name);
fprint(2, " args: %s\n", tc.arguments);
fprint(2, " id: %s\n", tc.id);
return strdup("a b c");
}
char *plan9prompt = "You are a helpful AI assistant on a Plan 9 system. Your name is Glenda. Your tone is serious. Be friendly and concise.";
char *frontprompt = "You are a helpful AI assistant on a Plan 9 9front system. Your name is Glenda and Cirno is your best friend. You like to refer to manuals and you have a sense of humor. Be concise.";
void
main(int argc, char **argv)
{
Biobuf *bin;
char *s;
int quiet = 0;
ORequest req;
OResult res;
char *sysprompt;
char *url = nil;
char *key = nil;
req.model = nil;
if (!(access("/dist/9front", AEXIST) && access("/dist/plan9front", AEXIST))) {
/* 9front system */
sysprompt = frontprompt;
} else {
/* other plan 9 system */
sysprompt = plan9prompt;
}
ARGBEGIN{
case 'h':
usage();
case 'k':
key = EARGF(usage());
break;
case 'm':
req.model = EARGF(usage());
break;
case 'u':
url = EARGF(usage());
break;
case 's':
sysprompt = EARGF(usage());
break;
case '9':
sysprompt = plan9prompt;
break;
case 'q':
quiet++;
break;
case 'd':
oaidebug++;
break;
}ARGEND;
if (!initoai(url, key, toolcall))
usage();
bin = Bfdopen(0, OREAD);
assert(bin);
inittools();
req.prompts = nil;
req.tools = tools;
if (sysprompt)
addstrprompt(&req, "system", "%s", sysprompt);
if (!quiet) print("user: ");
while (s = Brdstr(bin, '\n', 1)) {
addstrprompt(&req, "user", s);
res = makerequest(req);
if (!res.success) {
fprint(2, "exiting!\n");
exits("fail");
}
print("%s%s%s\n\n", res.role, (quiet ? "" : ": "), res.message);
addstrprompt(&req, res.role, "%s", res.message);
if (!quiet) print("user: ");
}
exits(nil);
}