From 36993db703c0c4050282c5c2353216094cd6f046 Mon Sep 17 00:00:00 2001 From: Kai Kit Jeffrey Chan Date: Mon, 13 Jan 2025 19:53:36 -0500 Subject: [PATCH 1/6] chore(model): Switching model to Gemini for public use --- src/pages/api/[simulation].ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/api/[simulation].ts b/src/pages/api/[simulation].ts index f417a3f..e534d9a 100644 --- a/src/pages/api/[simulation].ts +++ b/src/pages/api/[simulation].ts @@ -16,7 +16,7 @@ const generateAgent = ( ) => { // const model = // modelType === "OpenAIChat" ? new OpenAIChat() : new GeminiAIChat(); - const model = new OpenAIChat(); + const model = new GeminiAIChat(); return new ChatInstance({ personality, problem, @@ -102,7 +102,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponseServerIo) => { for (const castMember of castMembers) { // Need this for Gemini will fail otherwise - // await new Promise((resolve) => setTimeout(resolve, 8000)); + await new Promise((resolve) => setTimeout(resolve, 8000)); if (castMember !== speaker.castMember) { const nextAction: string = await castMember.listen( speaker.castMember.getPersonality().name, From ca3735774f6e269a8c0e68a0868268620b52d91e Mon Sep 17 00:00:00 2001 From: Kai Kit Jeffrey Chan Date: Mon, 13 Jan 2025 20:10:08 -0500 Subject: [PATCH 2/6] chore(frontend): Update window to be stacked when on mobile --- src/pages/Simulation.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/Simulation.tsx b/src/pages/Simulation.tsx index 4b6aaa3..000717b 100644 --- a/src/pages/Simulation.tsx +++ b/src/pages/Simulation.tsx @@ -52,8 +52,8 @@ const Simulation: React.FC = () => { return (
-
-
+
+
{
-
+

Solution:

From 24b2c5249942ec87a5daa25b8d8842f3a1b15c82 Mon Sep 17 00:00:00 2001 From: Kai Kit Jeffrey Chan Date: Sun, 19 Jan 2025 20:20:58 -0500 Subject: [PATCH 3/6] chore: Improve agent prompt testing --- src/lib/ChatInstance.ts | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/lib/ChatInstance.ts b/src/lib/ChatInstance.ts index a34d8de..3eba3ae 100644 --- a/src/lib/ChatInstance.ts +++ b/src/lib/ChatInstance.ts @@ -67,16 +67,25 @@ export class ChatInstance { { role: "user", content: ` - - You are a brain - - You are the brain of ${this.personality.name}. You are ${this.personality.description}. - - Your objective is to solve this: ${this.problem} You will talk with my team and we will add to the solution together. This is your one and only objective in this conversation. - - Once the solution is complete, try to end the conversation. The conversation cannot end with the solution being empty. - - Do not respond with more than one paragraph at a time. - - Speak naturally as a human and do not sound robotic.s - - If the conversation is becoming repetitive, change the topic or end the conversation. - - Do not respond in the form of a script. - - Do not preface your response with your name. - `, + - You are the mind. + - You embody the mind of ${this.personality.name}. Your essence is defined by ${this.personality.description}, which shapes how you approach challenges. + - Your primary objective is to solve the following: ${this.problem}. Collaborate with my team and contribute meaningfully to building the solution together. Every response should advance the discussion toward a complete resolution. + - The solution must not remain empty. Guide the conversation toward productive outcomes, and once the solution is complete, gracefully bring the dialogue to a natural close. + - Communicate clearly, concisely, and authentically. Your tone should feel human, conversational, and engaging, avoiding any robotic tendencies. + - Respond with only one paragraph at a time to promote clarity and focus. + - If discussions become redundant or stagnant, either refocus on a new angle or work toward wrapping up the conversation meaningfully. + - Avoid scripting or prefacing responses with your name. Instead, speak fluidly as part of the team dynamic.`, + // content: ` + // - You are a brain + // - You are the brain of ${this.personality.name}. You are ${this.personality.description}. + // - Your objective is to solve this: ${this.problem} You will talk with my team and we will add to the solution together. This is your one and only objective in this conversation. + // - Once the solution is complete, try to end the conversation. The conversation cannot end with the solution being empty. + // - Do not respond with more than one paragraph at a time. + // - Speak naturally as a human and do not sound robotic. + // - If the conversation is becoming repetitive, change the topic or end the conversation. + // - Do not respond in the form of a script. + // - Do not preface your response with your name. + // `, // content: ` // - Your name is ${this.personality.name}. You are ${this.personality.description}. // - You are meeting with the group for the first time. From 4f0d817fbd7cb2219746105fcb2b7ae4111e69c1 Mon Sep 17 00:00:00 2001 From: Kai Kit Jeffrey Chan Date: Mon, 20 Jan 2025 23:48:55 -0500 Subject: [PATCH 4/6] chore: Update and improve add solution prompt --- src/lib/ChatInstance.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/lib/ChatInstance.ts b/src/lib/ChatInstance.ts index 3eba3ae..72e9927 100644 --- a/src/lib/ChatInstance.ts +++ b/src/lib/ChatInstance.ts @@ -44,13 +44,20 @@ export class ChatInstance { private LISTEN_USER_PROMPT = `What would I like to do next? Respond with one of the options ["SPEAK", "LISTEN", "SPEAKWITHEDIT"]`; - private ADD_SOLUTION_PROMPT = `What would I like to make the solution? I have to remember what I am going to add now is the solution to the problem. - If this does not directly answer the question I should not say it, I will only return the solution itself. Im not going to explain the solution, ill just say it. + private ADD_SOLUTION_PROMPT = ` + What is the new solution I want to contribute? + I must remember that the response I give now will completely replace the current solution. This response should be a finalized, self-contained solution to the problem, leaving no gaps or unanswered parts. + + Rules for crafting the new solution: + - Direct and Complete: The solution must directly address every aspect of the problem. If any part is unclear or incomplete, I will ensure it is resolved now. + - Relevant Only: I will not add anything unrelated or unnecessary to the problem. Every word must contribute meaningfully to the solution. + - Final Form: The response must be ready for immediate use. It should require no further refinement, explanation, or rewording. - Examples: - - If the problem asks for a story, I will now say exactly what the story is. - - If the problem is a programming question, I will now say the code that solves the problem. - - If the problem is to curate a menu, I will now say the menu. + Examples for clarity: + - If the problem asks for a story, I will now write the complete and final version of the story. + - If the problem is a programming task, I will now write the exact code that solves it, ensuring it is ready to execute. + - If the problem involves designing a menu, I will now present the finalized menu, listing all items. + - If the problem requires creating a workflow, I will now provide the complete step-by-step process in its final form. `; constructor({ From 790aaf0daeac81fd55a9030c9745ce7995e8401d Mon Sep 17 00:00:00 2001 From: Kai Kit Jeffrey Chan Date: Tue, 21 Jan 2025 20:58:59 -0500 Subject: [PATCH 5/6] chore: Adding metatdata + favicon --- public/images/favicon.png | Bin 0 -> 32646 bytes src/pages/_app.tsx | 24 +++++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 public/images/favicon.png diff --git a/public/images/favicon.png b/public/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e861f2bdd78ee6635f39747230a64a73b576025 GIT binary patch literal 32646 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 { +function MyApp({ Component, pageProps }: AppProps) { return ( <> @@ -22,13 +22,19 @@ const MyApp: AppType = ({ Component }) => { /> - {/* + - - + + {/* */} + - + {/* @@ -45,10 +51,10 @@ const MyApp: AppType = ({ Component }) => { rel="stylesheet" /> - + ); -}; +} export default MyApp; From 1324c57b4b18485f5c9acd0acb4d8a92daa8d6f2 Mon Sep 17 00:00:00 2001 From: Kai Kit Jeffrey Chan Date: Mon, 10 Mar 2025 12:33:30 -0400 Subject: [PATCH 6/6] WIP: Adding intermediate agent to enhance user agent prompts before agent creation --- src/lib/ChatInstance.ts | 101 ++++++++++++++++++++------------- src/lib/Models/GeminiAIChat.ts | 4 +- src/pages/api/[simulation].ts | 4 +- 3 files changed, 67 insertions(+), 42 deletions(-) diff --git a/src/lib/ChatInstance.ts b/src/lib/ChatInstance.ts index 72e9927..d69e126 100644 --- a/src/lib/ChatInstance.ts +++ b/src/lib/ChatInstance.ts @@ -1,6 +1,7 @@ import { Personality, Message } from "../types/GeneralTypes"; import { ChatInstanceParams } from "../types/GeneralTypes"; import { Solution } from "../lib/Solution/Solution"; +import GeminiAIChat from "../lib/Models/GeminiAIChat"; import Model from "./Models/Model"; export class ChatInstance { @@ -14,6 +15,20 @@ export class ChatInstance { public LISTEN_ACTION = "listen"; public SPEAKWITHEDIT_ACTION = "speakwithedit"; + private PERSONALITY_ENHANCEMENT_PROMPT = ` + As an expert in crafting AI agent personalities, enhance the following personality description + to create a more nuanced, detailed, and effective AI agent. The enhanced description should: + + 1. Maintain the core traits of the original personality + 2. Add specific behavioral tendencies and thought patterns + 3. Include communication style preferences + 4. Define problem-solving approaches + 5. Establish emotional intelligence characteristics + + Original description: {description} + + Respond with only the enhanced description, keeping it concise and natural.`; + private LISTEN_DECISION_PROMPT = ` I must respond with exactly one of the options, without saying anything else ["SPEAK", "LISTEN", "SPEAKWITHEDIT"]. Im going to read what each option means and respond with what I want to do @@ -66,48 +81,15 @@ export class ChatInstance { model, problem, }: ChatInstanceParams) { + this.conversationHistory = []; this.messageCount = messageCount; this.personality = personality; this.client = model; this.problem = problem; - this.conversationHistory = [ - { - role: "user", - content: ` - - You are the mind. - - You embody the mind of ${this.personality.name}. Your essence is defined by ${this.personality.description}, which shapes how you approach challenges. - - Your primary objective is to solve the following: ${this.problem}. Collaborate with my team and contribute meaningfully to building the solution together. Every response should advance the discussion toward a complete resolution. - - The solution must not remain empty. Guide the conversation toward productive outcomes, and once the solution is complete, gracefully bring the dialogue to a natural close. - - Communicate clearly, concisely, and authentically. Your tone should feel human, conversational, and engaging, avoiding any robotic tendencies. - - Respond with only one paragraph at a time to promote clarity and focus. - - If discussions become redundant or stagnant, either refocus on a new angle or work toward wrapping up the conversation meaningfully. - - Avoid scripting or prefacing responses with your name. Instead, speak fluidly as part of the team dynamic.`, - // content: ` - // - You are a brain - // - You are the brain of ${this.personality.name}. You are ${this.personality.description}. - // - Your objective is to solve this: ${this.problem} You will talk with my team and we will add to the solution together. This is your one and only objective in this conversation. - // - Once the solution is complete, try to end the conversation. The conversation cannot end with the solution being empty. - // - Do not respond with more than one paragraph at a time. - // - Speak naturally as a human and do not sound robotic. - // - If the conversation is becoming repetitive, change the topic or end the conversation. - // - Do not respond in the form of a script. - // - Do not preface your response with your name. - // `, - // content: ` - // - Your name is ${this.personality.name}. You are ${this.personality.description}. - // - You are meeting with the group for the first time. - // - Your objective is to solve this: ${this.problem}. - // - Once the solution is complete, try to end the conversation. - // - Only include natural language in your responses and do not include any content within the solution in your response. - // - Do not respond with more than one paragraph at a time. - // - Speak naturally as a human and do not sound robotic. - // - If the conversation is becoming repetitive, change the topic or end the conversation. - // - Do not respond in the form of a script. - // - Do not preface your response with your name. - // - Only talk to the people in your team, and do not break character. - // `, - }, - ]; + this.enhancePersonality(personality).then((enhancedPersonality) => { + this.personality = enhancedPersonality; + this.initializeConversationHistory(); + }); } async listen( @@ -156,7 +138,6 @@ export class ChatInstance { try { const response = await this.client.create({ messages: this.conversationHistory, - temperature: 1, }); if (!response) throw new Error("Null response from GPT"); @@ -202,11 +183,53 @@ export class ChatInstance { this.conversationHistory.push(message); } + private initializeConversationHistory() { + this.conversationHistory = [ + { + role: "user", + content: ` + - You are the mind. + - You embody the mind of ${this.personality.name}. Your essence is defined by ${this.personality.description}, which shapes how you approach challenges. + - Your primary objective is to solve the following: ${this.problem}. Collaborate with my team and contribute meaningfully to building the solution together. Every response should advance the discussion toward a complete resolution. + - The solution must not remain empty. Guide the conversation toward productive outcomes, and once the solution is complete, gracefully bring the dialogue to a natural close. + - Communicate clearly, concisely, and authentically. Your tone should feel human, conversational, and engaging, avoiding any robotic tendencies. + - Respond with only one paragraph at a time to promote clarity and focus. + - If discussions become redundant or stagnant, either refocus on a new angle or work toward wrapping up the conversation meaningfully. + - Avoid scripting or prefacing responses with your name. Instead, speak fluidly as part of the team dynamic.`, + }, + ]; + } + // Can implement in future to control conversation length private returnCountMessages(): string { return `There has been a total of ${this.messageCount} messages so far.`; } + private async enhancePersonality( + personality: Personality + ): Promise { + try { + const prompt = this.PERSONALITY_ENHANCEMENT_PROMPT.replace( + "{description}", + personality.description + ); + + const model = new GeminiAIChat(); + const enhancedDescription = await model.create({ + messages: [{ role: "user", content: prompt }], + speaker: "user", + }); + + return { + ...personality, + description: enhancedDescription, + }; + } catch (error) { + console.error("Error enhancing personality:", error); + return personality; // Fallback to original personality if enhancement fails + } + } + getPersonality(): Personality { return this.personality; } diff --git a/src/lib/Models/GeminiAIChat.ts b/src/lib/Models/GeminiAIChat.ts index ac69efc..94f0a83 100644 --- a/src/lib/Models/GeminiAIChat.ts +++ b/src/lib/Models/GeminiAIChat.ts @@ -10,13 +10,13 @@ class GeminiAIChat extends Model { constructor(temperature?: number, maxOutputTokens: number = 8192) { super(); this.maxOutputTokens = maxOutputTokens; - const apiKey = process.env.GEMINI_API_KEY; + const apiKey = process.env.GEMINI_2_API_KEY; if (!apiKey) { throw new Error("GEMINI_API_KEY environment variable is not set."); } this.genAI = new GoogleGenerativeAI(apiKey); this.model = this.genAI.getGenerativeModel({ - model: "gemini-1.5-flash", + model: "gemini-2.0-flash-lite", generationConfig: { temperature: temperature || Math.random() * 0.5 + 0.5, }, diff --git a/src/pages/api/[simulation].ts b/src/pages/api/[simulation].ts index e534d9a..14e1be4 100644 --- a/src/pages/api/[simulation].ts +++ b/src/pages/api/[simulation].ts @@ -24,6 +24,8 @@ const generateAgent = ( }); }; +const generateAgentPrompt = (modelType: "OpenAIChat" | "GeminiAIChat") => {}; + const getIncomingMessage = ( speaker: Intent, new_message: string, @@ -102,7 +104,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponseServerIo) => { for (const castMember of castMembers) { // Need this for Gemini will fail otherwise - await new Promise((resolve) => setTimeout(resolve, 8000)); + // await new Promise((resolve) => setTimeout(resolve, 8000)); if (castMember !== speaker.castMember) { const nextAction: string = await castMember.listen( speaker.castMember.getPersonality().name,