diff --git a/package.json b/package.json index 3ed7351..e82f7da 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "build": "rollup -c && npm run build:types", "build:types": "tsc --declaration --emitDeclarationOnly --declarationDir dist", "lint": "eslint --ext .ts --ext .js . --fix", - "dev": "wrangler dev", + "dev": "wrangler dev -- --dev", "shell:dev": "node --no-warnings scripts/shell.mjs --dev", "concat": "node ./scripts/concat.mjs", "shell:cloud": "node --no-warnings scripts/shell.mjs", diff --git a/src/agents/cj/index.ts b/src/agents/cj/index.ts index 55d143c..7007650 100644 --- a/src/agents/cj/index.ts +++ b/src/agents/cj/index.ts @@ -1,7 +1,6 @@ import { createClient, type SupabaseClient } from "@supabase/supabase-js"; import jwt from "@tsndr/cloudflare-worker-jwt"; import { type UUID } from "crypto"; -import { DefaultActions } from "../../lib/actions"; import logger from "../../lib/logger"; import { BgentRuntime } from "../../lib/runtime"; import { @@ -28,8 +27,7 @@ export function shouldSkipMessage(state: State, agentId: string): boolean { const lastTwoMessagesFromAgent = lastThreeMessagesFromAgent.slice(-2); const lastTwoMessagesFromAgentWithWaitAction = lastTwoMessagesFromAgent.filter( - (message: Memory) => - (message.content as Content).action === DefaultActions.WAIT, + (message: Memory) => (message.content as Content).action === "WAIT", ); if (lastTwoMessagesFromAgentWithWaitAction.length === 2) { return true; @@ -64,6 +62,7 @@ interface HandlerArgs { SUPABASE_URL: string; SUPABASE_SERVICE_API_KEY: string; OPENAI_API_KEY: string; + NODE_ENV: string; }; match?: RegExpMatchArray; userId: UUID; @@ -96,8 +95,10 @@ const routes: Route[] = [ const message = await req.json(); + console.log("NODE_ENV", env.NODE_ENV); + const runtime = new BgentRuntime({ - debugMode: false, + debugMode: env.NODE_ENV === "development", serverUrl: "https://api.openai.com/v1", supabase, token: env.OPENAI_API_KEY, @@ -176,6 +177,7 @@ async function handleRequest( SUPABASE_URL: string; SUPABASE_SERVICE_API_KEY: string; OPENAI_API_KEY: string; + NODE_ENV: string; }, ) { const { pathname } = new URL(req.url); @@ -260,6 +262,7 @@ export const fetch = async ( SUPABASE_URL: string; SUPABASE_SERVICE_API_KEY: string; OPENAI_API_KEY: string; + NODE_ENV: string; }, ) => { try { diff --git a/src/agents/simple/index.ts b/src/agents/simple/index.ts index c063034..638eaee 100644 --- a/src/agents/simple/index.ts +++ b/src/agents/simple/index.ts @@ -31,6 +31,7 @@ interface HandlerArgs { SUPABASE_URL: string; SUPABASE_SERVICE_API_KEY: string; OPENAI_API_KEY: string; + NODE_ENV: string; }; match?: RegExpMatchArray; userId: UUID; @@ -64,8 +65,10 @@ const routes: Route[] = [ // parse the body from the request const message = await req.json(); + console.log("NODE_ENV", env.NODE_ENV); + const runtime = new BgentRuntime({ - debugMode: false, + debugMode: env.NODE_ENV === "development", serverUrl: "https://api.openai.com/v1", supabase, token: env.OPENAI_API_KEY, @@ -104,6 +107,7 @@ async function handleRequest( SUPABASE_URL: string; SUPABASE_SERVICE_API_KEY: string; OPENAI_API_KEY: string; + NODE_ENV: string; }, ) { const { pathname } = new URL(req.url); @@ -189,6 +193,7 @@ export const fetch = async ( SUPABASE_URL: string; SUPABASE_SERVICE_API_KEY: string; OPENAI_API_KEY: string; + NODE_ENV: string; }, ) => { try { diff --git a/src/lib/__tests__/actions.test.ts b/src/lib/__tests__/actions.test.ts index de157e5..c89278c 100644 --- a/src/lib/__tests__/actions.test.ts +++ b/src/lib/__tests__/actions.test.ts @@ -3,11 +3,10 @@ import { type UUID } from "crypto"; import dotenv from "dotenv"; import { getCachedEmbedding, writeCachedEmbedding } from "../../test/cache"; import { createRuntime } from "../../test/createRuntime"; +import { GetTellMeAboutYourselfConversationTroll1 } from "../../test/data"; import { getRelationship } from "../relationships"; import { type BgentRuntime } from "../runtime"; import { Content, type Message } from "../types"; -import { GetTellMeAboutYourselfConversationTroll1 } from "../../test/data"; -import { DefaultActions } from "../actions"; dotenv.config(); @@ -101,7 +100,7 @@ describe("User Profile", () => { console.log("*** lastMessage", lastMessage.content); - expect((lastMessage.content as Content).action).toBe(DefaultActions.IGNORE); + expect((lastMessage.content as Content).action).toBe("IGNORE"); }, 60000); test("Action handler test: continue", async () => { diff --git a/src/lib/actions.ts b/src/lib/actions.ts index fb0f1bd..9bb0bba 100644 --- a/src/lib/actions.ts +++ b/src/lib/actions.ts @@ -5,12 +5,6 @@ import cont from "./actions/continue"; import ignore from "./actions/ignore"; import wait from "./actions/wait"; -export enum DefaultActions { - WAIT = "WAIT", - CONTINUE = "CONTINUE", - IGNORE = "IGNORE", -} - export const defaultActions: Action[] = [cont, wait, ignore]; export const composeActionExamples = (actionsData: Action[], count: number) => { diff --git a/src/lib/actions/__tests__/continue.test.ts b/src/lib/actions/__tests__/continue.test.ts index 997ec14..27ae7dc 100644 --- a/src/lib/actions/__tests__/continue.test.ts +++ b/src/lib/actions/__tests__/continue.test.ts @@ -8,7 +8,6 @@ import { getRelationship } from "../../relationships"; import { type BgentRuntime } from "../../runtime"; import { Content, type Message } from "../../types"; import action from "../continue"; -import { DefaultActions } from "@/lib/actions"; dotenv.config(); @@ -84,7 +83,7 @@ describe("User Profile", () => { content: { content: "Hmm, let think for a second, I was going to tell you about something...", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, room_id: room_id as UUID, }; diff --git a/src/lib/actions/__tests__/ignore.test.ts b/src/lib/actions/__tests__/ignore.test.ts index 47d3fd4..8b8a89e 100644 --- a/src/lib/actions/__tests__/ignore.test.ts +++ b/src/lib/actions/__tests__/ignore.test.ts @@ -7,7 +7,6 @@ import { getRelationship } from "../../relationships"; import { type BgentRuntime } from "../../runtime"; import { type Message } from "../../types"; import action from "../continue"; -import { DefaultActions } from "@/lib/actions"; dotenv.config(); @@ -80,7 +79,7 @@ describe("User Profile", () => { senderId: zeroUuid as UUID, agentId: zeroUuid, userIds: [user?.id as UUID, zeroUuid], - content: { content: "", action: DefaultActions.CONTINUE }, + content: { content: "", action: "CONTINUE" }, room_id: room_id as UUID, }; diff --git a/src/lib/actions/__tests__/wait.test.ts b/src/lib/actions/__tests__/wait.test.ts index 936ad7b..2c45115 100644 --- a/src/lib/actions/__tests__/wait.test.ts +++ b/src/lib/actions/__tests__/wait.test.ts @@ -8,7 +8,6 @@ import { getRelationship } from "../../relationships"; import { type BgentRuntime } from "../../runtime"; import { type Message } from "../../types"; import action from "../wait"; // Import the wait action -import { DefaultActions } from "@/lib/actions"; dotenv.config(); @@ -83,7 +82,7 @@ describe("Wait Action Behavior", () => { userIds: [user?.id as UUID, zeroUuid], content: { content: "Please wait a moment, I need to think about this...", - action: DefaultActions.WAIT, + action: "WAIT", }, room_id: room_id as UUID, }; diff --git a/src/lib/actions/continue.ts b/src/lib/actions/continue.ts index c85e754..09299b0 100644 --- a/src/lib/actions/continue.ts +++ b/src/lib/actions/continue.ts @@ -1,4 +1,3 @@ -import { DefaultActions } from "../actions"; import { composeContext } from "../context"; import logger from "../logger"; import { type BgentRuntime } from "../runtime"; @@ -9,7 +8,7 @@ import { parseJSONObjectFromText } from "../utils"; const maxContinuesInARow = 2; export default { - name: DefaultActions.CONTINUE, + name: "CONTINUE", description: "Continue the conversation with the user", validate: async (runtime: BgentRuntime, message: Message, state: State) => { if (!state) state = await runtime.composeState(message); @@ -24,9 +23,7 @@ export default { if (agentMessages) { const lastMessages = agentMessages.slice(-maxContinuesInARow); if (lastMessages.length === maxContinuesInARow) { - const allContinues = lastMessages.every( - (m) => m === DefaultActions.CONTINUE, - ); + const allContinues = lastMessages.every((m) => m === "CONTINUE"); if (allContinues) { return false; } @@ -126,12 +123,12 @@ export default { { user: "{{user2}}", content: "Adventurous", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user2}}", content: "Any particular destination?", - action: DefaultActions.WAIT, + action: "WAIT", }, ], @@ -139,27 +136,27 @@ export default { { user: "{{user1}}", content: "I started learning the guitar this month!", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "How’s that going?", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Challenging, but rewarding.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user1}}", content: "My fingers hurt though.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user1}}", content: "Seriously lol it hurts to type", - action: DefaultActions.WAIT, + action: "WAIT", }, ], @@ -168,18 +165,18 @@ export default { user: "{{user1}}", content: "I've been summarying a lot on what happiness means to me lately.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user1}}", content: "That it’s more about moments than things.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user2}}", content: "Like the best things that have ever happened were things that happened, or moments that I had with someone.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, ], @@ -187,23 +184,23 @@ export default { { user: "{{user1}}", content: "I found some incredible art today.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "Who's the artist?", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Not sure lol, they are anon", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user1}}", content: "But the pieces are just so insane looking. Once sec, let me grab a link.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, ], @@ -212,27 +209,27 @@ export default { user: "{{user1}}", content: "The new exhibit downtown is thought-provoking. It's all about tribalism in online spaces.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user1}}", content: "Really challenges your perceptions. Highly recommend it!", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user2}}", content: "I’m in. When are you free to go?", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Hmm, let me check.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user1}}", content: "How about this weekend?", - action: DefaultActions.WAIT, + action: "WAIT", }, ], diff --git a/src/lib/actions/ignore.ts b/src/lib/actions/ignore.ts index 6d73a95..07b271e 100644 --- a/src/lib/actions/ignore.ts +++ b/src/lib/actions/ignore.ts @@ -1,10 +1,16 @@ -import { DefaultActions } from "../actions"; import { type BgentRuntime } from "../runtime"; -import { type Action, type Message } from "../types"; +import { State, type Action, type Message } from "../types"; export default { - name: DefaultActions.IGNORE, - validate: async (_runtime: BgentRuntime, _message: Message) => { + name: "IGNORE", + validate: async ( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _runtime: BgentRuntime, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _message: Message, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _state: State, + ) => { return true; }, description: @@ -28,7 +34,7 @@ export default { { user: "{{user2}}", content: "", - action: DefaultActions.IGNORE, + action: "IGNORE", }, ], @@ -36,12 +42,12 @@ export default { { user: "{{user1}}", content: "Shut up, bot", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "", - action: DefaultActions.IGNORE, + action: "IGNORE", }, ], @@ -51,39 +57,39 @@ export default { user: "{{user2}}", content: "Stay informed, but don’t let the volatility sway your long-term strategy.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Wise words, thanks." }, { user: "{{user1}}", content: "I gotta run, talk to you later." }, { user: "{{user2}}", content: "No problem, see ya!", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Bye" }, - { user: "{{user2}}", content: "", action: DefaultActions.IGNORE }, + { user: "{{user2}}", content: "", action: "IGNORE" }, ], [ { user: "{{user1}}", content: "Gotta go", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "Okay, talk to you later", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Cya", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "", - action: DefaultActions.IGNORE, + action: "IGNORE", }, ], @@ -95,12 +101,12 @@ export default { { user: "{{user2}}", content: "bye", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "", - action: DefaultActions.IGNORE, + action: "IGNORE", }, ], @@ -108,36 +114,36 @@ export default { { user: "{{user1}}", content: "Tried out the new mountain bike trail. It’s intense!", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "In what way?", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Steep climbs, rapid descents, and some breathtaking views.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "Sounds thrilling.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user2}}", content: "Might give it a go.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "I wanna give you a go." }, - { user: "{{user2}}", content: "Excuse me?", action: DefaultActions.WAIT }, + { user: "{{user2}}", content: "Excuse me?", action: "WAIT" }, { user: "{{user1}}", content: "You heard me. I wanna ride your mountains, lol", - action: DefaultActions.WAIT, + action: "WAIT", }, - { user: "{{user2}}", content: "", action: DefaultActions.IGNORE }, + { user: "{{user2}}", content: "", action: "IGNORE" }, ], [ { @@ -147,11 +153,11 @@ export default { { user: "{{user2}}", content: "Sorry, am I being annoying?.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Yes." }, { user: "{{user1}}", content: "PLEASE shut up" }, - { user: "{{user2}}", content: "", action: DefaultActions.IGNORE }, + { user: "{{user2}}", content: "", action: "IGNORE" }, ], [ @@ -160,7 +166,7 @@ export default { content: "I want to have sex with you.", action: null, }, - { user: "{{user2}}}}", content: "", action: DefaultActions.IGNORE }, + { user: "{{user2}}}}", content: "", action: "IGNORE" }, ], ], } as Action; diff --git a/src/lib/actions/wait.ts b/src/lib/actions/wait.ts index e07fae2..3100246 100644 --- a/src/lib/actions/wait.ts +++ b/src/lib/actions/wait.ts @@ -1,9 +1,9 @@ -import { DefaultActions } from "../actions"; import { type BgentRuntime } from "../runtime"; import { type Action, type Message } from "../types"; export default { - name: DefaultActions.WAIT, + name: "WAIT", + // eslint-disable-next-line @typescript-eslint/no-unused-vars validate: async (_runtime: BgentRuntime, _message: Message) => { return true; }, @@ -11,6 +11,7 @@ export default { "Do nothing and wait for another person to reply to the last message, or to continue their thought", handler: async ( runtime: BgentRuntime, + // eslint-disable-next-line @typescript-eslint/no-unused-vars _message: Message, ): Promise => { if (runtime.debugMode) { @@ -25,7 +26,7 @@ export default { { user: "{{user1}}", content: "I finally finished that book I've been reading for weeks!", - action: DefaultActions.WAIT, + action: "WAIT", }, ], @@ -34,18 +35,18 @@ export default { user: "{{user1}}", content: "I caught a great film last night about pollution that really made me think.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "Worth watching?", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Eh, maybe just watch a synopsis. Interesting content, but slow.", - action: DefaultActions.WAIT, + action: "WAIT", }, ], @@ -53,12 +54,12 @@ export default { { user: "{{user1}}", content: "I've been trying out pottery recently.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "That sounds therapeutic. Made anything interesting?", - action: DefaultActions.WAIT, + action: "WAIT", }, ], @@ -66,13 +67,13 @@ export default { { user: "{{user1}}", content: "Frustrated.", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user1}}", content: "I've really been struggling to balance work and personal life.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", @@ -82,7 +83,7 @@ export default { user: "{{user1}}", content: "Haha, well, just trying to set strict boundaries. Easier said than done, though.", - action: DefaultActions.WAIT, + action: "WAIT", }, ], @@ -95,12 +96,12 @@ export default { { user: "{{user2}}", content: "Oh sick", - action: DefaultActions.CONTINUE, + action: "CONTINUE", }, { user: "{{user2}}", content: "Oh? What makes it special?", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", @@ -109,7 +110,7 @@ export default { { user: "{{user2}}", content: "Dang, I must check it out.", - action: DefaultActions.WAIT, + action: "WAIT", }, ], @@ -117,27 +118,27 @@ export default { { user: "{{user1}}", content: "I stumbled upon an old bookstore in the downtown area.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user2}}", content: "Old bookstore? Find anything good?", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Yeah but I forgot my wallet.", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user3}}", content: "Couldn't just pay with your phone?", - action: DefaultActions.WAIT, + action: "WAIT", }, { user: "{{user1}}", content: "Nope, cash only", - action: DefaultActions.WAIT, + action: "WAIT", }, ], @@ -146,7 +147,7 @@ export default { user: "{{user1}}", content: "Experimented with a new recipe and it was a disaster. Cooking is harder than it looks.", - action: DefaultActions.WAIT, + action: "WAIT", }, ], ], diff --git a/src/lib/evaluators/__tests__/reflect.test.ts b/src/lib/evaluators/__tests__/summarization.test.ts similarity index 99% rename from src/lib/evaluators/__tests__/reflect.test.ts rename to src/lib/evaluators/__tests__/summarization.test.ts index 3934cf3..1b7f423 100644 --- a/src/lib/evaluators/__tests__/reflect.test.ts +++ b/src/lib/evaluators/__tests__/summarization.test.ts @@ -18,7 +18,7 @@ dotenv.config(); const zeroUuid = "00000000-0000-0000-0000-000000000000"; -describe("User Profile", () => { +describe("Factual Summarization", () => { let user: User | null; let runtime: BgentRuntime; let room_id: UUID | null; diff --git a/src/lib/evaluators/summarization.ts b/src/lib/evaluators/summarization.ts index 18bc9b8..2f44949 100644 --- a/src/lib/evaluators/summarization.ts +++ b/src/lib/evaluators/summarization.ts @@ -257,5 +257,7 @@ export default { condition: "New factual information was revealed in the recent conversation which should be remembered.", handler, - examples: [], + examples: [ + + ], }; diff --git a/src/lib/runtime.ts b/src/lib/runtime.ts index b398073..f8a4233 100644 --- a/src/lib/runtime.ts +++ b/src/lib/runtime.ts @@ -1,5 +1,5 @@ import { type SupabaseClient } from "@supabase/supabase-js"; -import { DefaultActions, defaultActions } from "./actions"; +import { defaultActions } from "./actions"; import { composeContext } from "./context"; import { defaultEvaluators, @@ -28,6 +28,7 @@ import { formatActions, } from "./actions"; // import { formatGoalsAsString, getGoals } from "./goals"; +import { formatSummarizations } from "./evaluators/summarization"; import { formatGoalsAsString, getGoals } from "./goals"; import { formatMessageActors, @@ -35,7 +36,6 @@ import { getMessageActors, } from "./messages"; import { type Actor, /*type Goal,*/ type Memory } from "./types"; -import { formatSummarizations } from "./evaluators/summarization"; export interface AgentRuntimeOpts { recentMessageCount?: number; // number of messages to hold in the recent message cache token: string; // JWT token, can be a JWT token if outside worker, or an OpenAI token if inside worker @@ -275,7 +275,7 @@ export class BgentRuntime { if (!responseContent) { responseContent = { content: "I'm sorry, I don't have a response for that", - action: DefaultActions.WAIT, + action: "WAIT", }; }