diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/chats-manager.ts b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/chats-manager.ts index 607af52ac..7989fb2d5 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/chats-manager.ts +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/chats-manager.ts @@ -21,7 +21,7 @@ import { import { bindConversationToAgent, } from '../runtime'; -// import { Player } from 'react-agents-client/util/player.mjs'; +import { Player } from 'react-agents-client/util/player.mjs'; import { ReactAgentsMultiplayerConnection } from 'react-agents-client/react-agents-client.mjs'; import { ExtendableMessageEvent, @@ -35,7 +35,7 @@ import { import { TranscribedVoiceInput, } from 'react-agents/devices/audio-transcriber.mjs'; -import { formatConversationMessage } from '../util/message-utils'; +import { createMessageCache, formatConversationMessage } from '../util/message-utils'; // @@ -91,14 +91,23 @@ export class ChatsManager { agent, } = this; + const agentPlayer = new Player(agent.id, { + name: agent.name, + bio: agent.bio, + }); const conversation = new ConversationObject({ - agent, + agentPlayer, getHash: () => { return getChatKey({ room, endpointUrl, }); }, + messageCache: createMessageCache({ + agent, + conversationId: key, + agentId: agent.id, + }), }); this.agent.conversationManager.addConversation(conversation); diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/conversation-object.ts b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/conversation-object.ts index 6cbab9d2d..e36e38871 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/conversation-object.ts +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/conversation-object.ts @@ -12,13 +12,10 @@ import { import { SceneObject } from '../classes/scene-object'; import { Player } from 'react-agents-client/util/player.mjs'; import { ExtendableMessageEvent } from '../util/extendable-message-event'; -import { MessageCache as MessageCacheConstructor, CACHED_MESSAGES_LIMIT } from './message-cache'; -import { loadMessagesFromDatabase } from '../util/loadMessagesFromDatabase'; // export class ConversationObject extends EventTarget { - agent: ActiveAgentObject; // the current agent agentsMap: Map; // note: agents does not include the current agent scene: SceneObject | null; getHash: GetHashFn; // XXX this can be a string, since conversation hashes do not change (?) @@ -27,37 +24,30 @@ export class ConversationObject extends EventTarget { mentionsRegex: RegExp | null = null; constructor({ - agent, agentsMap = new Map(), + agentPlayer, scene = null, getHash = () => '', mentionsRegex = null, + messageCache, }: { - agent: ActiveAgentObject | null; agentsMap?: Map; + agentPlayer: Player; scene?: SceneObject | null; getHash?: GetHashFn; mentionsRegex?: RegExp | null; + messageCache: MessageCache; }) { super(); - this.agent = agent; this.agentsMap = agentsMap; this.scene = scene; this.getHash = getHash; this.mentionsRegex = mentionsRegex; - this.messageCache = new MessageCacheConstructor({ - loader: async () => { - const supabase = this.agent.appContextValue.useSupabase(); - const messages = await loadMessagesFromDatabase({ - supabase, - conversationId: this.getKey(), - agentId: this.agent.id, - limit: CACHED_MESSAGES_LIMIT, - }); - return messages; - }, - }); + this.messageCache = messageCache; + + // add the agent player to the agents map + this.agentsMap.set(agentPlayer.playerId, agentPlayer); } // @@ -94,9 +84,6 @@ export class ConversationObject extends EventTarget { this.scene = scene; } - getAgent() { - return this.agent; - } // setAgent(agent: ActiveAgentObject) { // this.agent = agent; // } @@ -127,7 +114,6 @@ export class ConversationObject extends EventTarget { const allAgents: object[] = [ ...Array.from(this.agentsMap.values()).map(player => player.playerSpec), ]; - this.agent && allAgents.push(this.agent.agentJson); return allAgents; } getEmbeddingString() { diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/discord-manager.ts b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/discord-manager.ts index 52e5d37eb..19219645e 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/discord-manager.ts +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/discord-manager.ts @@ -13,7 +13,7 @@ import { } from './conversation-object'; import { Player } from 'react-agents-client/util/player.mjs'; import { DiscordBotClient } from '../lib/discord/discord-client'; -import { formatConversationMessage } from '../util/message-utils'; +import { createMessageCache, formatConversationMessage } from '../util/message-utils'; import { bindConversationToAgent, } from '../runtime'; @@ -247,12 +247,22 @@ export class DiscordBot extends EventTarget { return } + const conversationId = `discord:channel:${channelId}`; + const agentPlayer = new Player(agent.id, { + name: agent.name, + bio: agent.bio, + }); const conversation = new ConversationObject({ - agent, + agentPlayer, getHash: () => { - return `discord:channel:${channelId}`; + return conversationId; }, mentionsRegex: discordMentionRegex, + messageCache: createMessageCache({ + agent, + conversationId, + agentId: agent.id, + }), }); this.agent.conversationManager.addConversation(conversation); @@ -293,13 +303,23 @@ export class DiscordBot extends EventTarget { console.log('dm conversation already exists for this user, skipping', userId); return } - + + const conversationId = `discord:dm:${userId}`; + const agentPlayer = new Player(agent.id, { + name: agent.name, + bio: agent.bio, + }); const conversation = new ConversationObject({ - agent, + agentPlayer, getHash: () => { - return `discord:dm:${userId}`; + return conversationId; }, mentionsRegex: discordMentionRegex, + messageCache: createMessageCache({ + agent, + conversationId, + agentId: agent.id, + }), }); this.agent.conversationManager.addConversation(conversation); diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/telnyx-manager.ts b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/telnyx-manager.ts index 4d93a7f29..f76e52353 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/telnyx-manager.ts +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/telnyx-manager.ts @@ -14,7 +14,7 @@ import type { TelnyxMessageArgs, TelnyxVoiceArgs, } from '../lib/telnyx/telnyx-client'; -import { formatConversationMessage } from '../util/message-utils'; +import { createMessageCache, formatConversationMessage } from '../util/message-utils'; import { bindConversationToAgent, } from '../runtime'; @@ -175,9 +175,19 @@ export class TelnyxBot extends EventTarget { }); let conversation = this.conversations.get(hash); if (!conversation) { + + const agentPlayer = new Player(agent.id, { + name: agent.name, + bio: agent.bio, + }); conversation = new ConversationObject({ - agent, + agentPlayer, getHash: () => hash, + messageCache: createMessageCache({ + agent, + conversationId: hash, + agentId: agent.id, + }), }); const player = makePlayerFromPhoneNumber(toPhoneNumber); conversation.addAgent(player.playerId, player); diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/twitter-manager.ts b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/twitter-manager.ts index 11662a203..f4ec6e994 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/twitter-manager.ts +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/twitter-manager.ts @@ -13,7 +13,7 @@ import { ConversationObject, } from './conversation-object'; // import { Player } from 'react-agents-client/util/player.mjs'; -import { formatConversationMessage } from '../util/message-utils'; +import { createMessageCache, formatConversationMessage } from '../util/message-utils'; import { bindConversationToAgent, } from '../runtime'; @@ -197,9 +197,19 @@ class TwitterBot { // Create or get conversation let conversation = this.conversations.get(conversation_id); if (!conversation) { + const agentPlayer = new Player(this.agent.id, { + name: this.agent.name, + bio: this.agent.bio, + }); + conversation = new ConversationObject({ - agent: this.agent, + agentPlayer, getHash: () => `twitter:conversation:${conversation_id}`, + messageCache: createMessageCache({ + agent: this.agent, + conversationId: `twitter:conversation:${conversation_id}`, + agentId: this.agent.id, + }), }); this.agent.conversationManager.addConversation(conversation); diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/twitter-spaces-manager.ts b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/twitter-spaces-manager.ts index 22f67808f..f50a74397 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/twitter-spaces-manager.ts +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/classes/twitter-spaces-manager.ts @@ -14,7 +14,7 @@ import { bindConversationToAgent, } from '../runtime'; import { AudioDecodeStream } from 'codecs/audio-decode.mjs'; -import { formatConversationMessage } from '../util/message-utils'; +import { createMessageCache, formatConversationMessage } from '../util/message-utils'; import { QueueManager, } from 'queue-manager'; @@ -24,6 +24,7 @@ import { import { TranscribedVoiceInput, } from '../devices/audio-transcriber.mjs'; +import { Player } from 'react-agents-client/util/player.mjs'; // @@ -80,11 +81,20 @@ class TwitterSpacesBot { live = false; }); + const agentPlayer = new Player(this.agent.id, { + name: this.agent.name, + bio: this.agent.bio, + }); const conversation = new ConversationObject({ - agent, + agentPlayer, getHash: () => { return `twitterSpaces:channel:${url}`; }, + messageCache: createMessageCache({ + agent, + conversationId: `twitterSpaces:channel:${url}`, + agentId: agent.id, + }), }); this.agent.conversationManager.addConversation(conversation); diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/components/util/default-components.tsx b/packages/usdk/packages/upstreet-agent/packages/react-agents/components/util/default-components.tsx index 364df23f2..6e2a273cc 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/components/util/default-components.tsx +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/components/util/default-components.tsx @@ -4,6 +4,7 @@ import type { AgentObject, Attachment, FormattedAttachment, + Player, } from '../../types'; import { useAgent, @@ -117,59 +118,47 @@ const ScenePrompt = () => { }; const CharactersPrompt = () => { const conversation = useConversation(); - const agent = useAgent(); - const name = useName(); - const bio = usePersonality(); - if (conversation) { - const agents = conversation.getAgents(); - const currentAgentSpec = { - id: agent.id, - name, - bio, - }; - const agentSpecs = agents.map((agent) => { - const agentSpec = agent.getPlayerSpec() as any; - return { - name: agentSpec?.name, - id: agent.playerId, - bio: agentSpec?.bio, - }; - }); + const activeAgent = useAgent(); - const formatAgent = (agent: any) => { - return [ - `Name: ${agent.name}`, - `UserId: ${agent.id}`, - `Bio: ${agent.bio}`, - ].join('\n'); - }; + if (!conversation) return null; - return ( - - {dedent` - # Your Character - ` + - '\n\n' + - formatAgent(currentAgentSpec) + - (agents.length > 0 - ? ( - '\n\n' + - dedent` - # Other Characters - ` + - '\n\n' + - agentSpecs - .map(formatAgent) - .join('\n\n') - ) - : '' + const agents = conversation.getAgents(); + const agentCharacter = agents.find(agent => agent.playerId === activeAgent.id); + const otherAgents = agents + .filter(agent => agent.playerId !== activeAgent.id); + + const formatAgent = (agent: Player) => { + const agentSpecs = agent.getPlayerSpec() as any; + return [ + `Name: ${agentSpecs?.name}`, + `UserId: ${agent.playerId}`, + `Bio: ${agentSpecs?.bio}`, + ].join('\n'); + }; + + return ( + + {dedent` + # Your Character + ` + + '\n\n' + + formatAgent(agentCharacter) + + (agents.length > 0 + ? ( + '\n\n' + + dedent` + # Other Characters + ` + + '\n\n' + + otherAgents + .map(formatAgent) + .join('\n\n') ) - } - - ); - } else { - return null; - } + : '' + ) + } + + ); }; const ActionsPromptInternal = () => { const actions = useActions(); diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/loops/action-loop.tsx b/packages/usdk/packages/upstreet-agent/packages/react-agents/loops/action-loop.tsx index 5969474b4..6c6a8b0c3 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/loops/action-loop.tsx +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/loops/action-loop.tsx @@ -5,6 +5,8 @@ import { ReACTEvaluator } from '../evaluators/react-evaluator'; // import { PerceptionEvent } from '../classes/perception-event'; import { ConversationObject } from '../classes/conversation-object'; import { DeferConversation } from '../components/core/conversation'; +import { createMessageCache } from '../util/message-utils'; +import { Player } from 'react-agents-client/util/player.mjs'; export const ActionLoop = (props: LoopProps) => { return ( @@ -39,10 +41,19 @@ const ActionLoopInner = (props: LoopProps) => { if (contextConversation) { return contextConversation; } else { + const agentPlayer = new Player(agent.id, { + name: agent.name, + bio: agent.bio, + }); const conversationId = crypto.randomUUID(); return new ConversationObject({ - agent, + agentPlayer, getHash: () => conversationId, + messageCache: createMessageCache({ + agent, + conversationId, + agentId: agent.id, + }), }); } }); diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/types/react-agents.d.ts b/packages/usdk/packages/upstreet-agent/packages/react-agents/types/react-agents.d.ts index a1851d0a1..d710e468a 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/types/react-agents.d.ts +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/types/react-agents.d.ts @@ -309,7 +309,6 @@ export type Player = { }; export type GetHashFn = () => string; export type ConversationObject = EventTarget & { - agent: ActiveAgentObject; agentsMap: Map; scene: SceneObject | null; getHash: GetHashFn; @@ -331,9 +330,6 @@ export type ConversationObject = EventTarget & { getScene: () => SceneObject | null; setScene: (scene: SceneObject | null) => void; - getAgent: () => ActiveAgentObject | null; - // setAgent: (agent: ActiveAgentObject) => void; - getAgents: () => Player[]; getAgentIds: () => string[]; addAgent: (agentId: string, player: Player) => void; diff --git a/packages/usdk/packages/upstreet-agent/packages/react-agents/util/message-utils.ts b/packages/usdk/packages/upstreet-agent/packages/react-agents/util/message-utils.ts index 25c3bb7d6..41f7a3c58 100644 --- a/packages/usdk/packages/upstreet-agent/packages/react-agents/util/message-utils.ts +++ b/packages/usdk/packages/upstreet-agent/packages/react-agents/util/message-utils.ts @@ -1,9 +1,12 @@ import { PendingActionMessage, AgentSpec, + ActiveAgentObject, // AgentObject, // ActiveAgentObject, } from '../types'; +import { MessageCache, CACHED_MESSAGES_LIMIT } from '../classes/message-cache'; +import { loadMessagesFromDatabase } from './loadMessagesFromDatabase'; export const formatConversationMessage = (rawMessage: PendingActionMessage, { agent, @@ -24,4 +27,28 @@ export const formatConversationMessage = (rawMessage: PendingActionMessage, { hidden: false, }; return newMessage; +}; + + +export const createMessageCache = ({ + agent, + conversationId, + agentId, +}: { + agent: ActiveAgentObject; + conversationId: string; + agentId: string; +}) => { + const supabase = agent.appContextValue.useSupabase(); + return new MessageCache({ + loader: async () => { + const messages = await loadMessagesFromDatabase({ + supabase, + conversationId, + agentId, + limit: CACHED_MESSAGES_LIMIT, + }); + return messages; + }, + }); }; \ No newline at end of file