@elizaos/plugin-bootstrap 1.0.0-beta.38 → 1.0.0-beta.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -79,11 +79,10 @@ import {
79
79
  logger as logger17,
80
80
  messageHandlerTemplate,
81
81
  ModelType as ModelType13,
82
- parseJSONObjectFromText as parseJSONObjectFromText4,
83
82
  postCreationTemplate,
84
- providersTemplate,
85
83
  shouldRespondTemplate,
86
- truncateToCompleteSentence
84
+ truncateToCompleteSentence,
85
+ parseKeyValueXml
87
86
  } from "@elizaos/core";
88
87
 
89
88
  // ../../node_modules/uuid/dist/esm/stringify.js
@@ -723,7 +722,10 @@ var ignoreAction = {
723
722
  return true;
724
723
  },
725
724
  description: "Call this action if ignoring the user. If the user is aggressive, creepy or is finished with the conversation, use this action. Or, if both you and the user have already said goodbye, use this action instead of saying bye again. Use IGNORE any time the conversation has naturally ended. Do not use IGNORE if the user has engaged directly, or if something went wrong an you need to tell them. Only ignore if the user should be ignored.",
726
- handler: async (_runtime, _message) => {
725
+ handler: async (_runtime, _message, _state, _options, callback, responses) => {
726
+ if (callback && responses?.[0]?.content) {
727
+ await callback(responses[0].content);
728
+ }
727
729
  return true;
728
730
  },
729
731
  examples: [
@@ -3649,7 +3651,6 @@ import { addHeader as addHeader2, ChannelType as ChannelType3 } from "@elizaos/c
3649
3651
  var anxietyProvider = {
3650
3652
  name: "ANXIETY",
3651
3653
  description: "Social directions for the AI to follow based on the channel type",
3652
- dynamic: true,
3653
3654
  get: async (_runtime, message) => {
3654
3655
  const channelType = message.content.channelType;
3655
3656
  const groupAnxietyExamples = [
@@ -4186,14 +4187,17 @@ var factsProvider = {
4186
4187
  tableName: "facts",
4187
4188
  embedding,
4188
4189
  roomId: message.roomId,
4189
- count: 10
4190
+ worldId: message.worldId,
4191
+ count: 6,
4192
+ query: message.content.text
4190
4193
  }),
4191
- runtime.getMemories({
4194
+ runtime.searchMemories({
4195
+ embedding,
4196
+ query: message.content.text,
4192
4197
  tableName: "facts",
4193
4198
  roomId: message.roomId,
4194
- count: 10,
4195
- start: 0,
4196
- end: Date.now()
4199
+ entityId: message.entityId,
4200
+ count: 6
4197
4201
  })
4198
4202
  ]);
4199
4203
  const allFacts = [...relevantFacts, ...recentFactsData].filter(
@@ -4228,14 +4232,19 @@ var factsProvider = {
4228
4232
  import { addHeader as addHeader7 } from "@elizaos/core";
4229
4233
  var knowledgeProvider = {
4230
4234
  name: "KNOWLEDGE",
4231
- description: "Knowledge from the knowledge base that the agent knows",
4235
+ description: "Knowledge from the knowledge base that the agent knows, retrieved whenever the agent needs to answer a question about their expertise.",
4232
4236
  dynamic: true,
4233
4237
  get: async (runtime, message) => {
4234
4238
  const knowledgeData = await runtime.getKnowledge(message);
4235
- const knowledge = knowledgeData && knowledgeData.length > 0 ? addHeader7(
4239
+ const firstFiveKnowledgeItems = knowledgeData?.slice(0, 5);
4240
+ let knowledge = (firstFiveKnowledgeItems && firstFiveKnowledgeItems.length > 0 ? addHeader7(
4236
4241
  "# Knowledge",
4237
- knowledgeData.map((knowledge2) => `- ${knowledge2.content.text}`).join("\n")
4238
- ) : "";
4242
+ firstFiveKnowledgeItems.map((knowledge2) => `- ${knowledge2.content.text}`).join("\n")
4243
+ ) : "") + "\n";
4244
+ const tokenLength = 3.5;
4245
+ if (knowledge.length > 4e3 * tokenLength) {
4246
+ knowledge = knowledge.slice(0, 4e3 * tokenLength);
4247
+ }
4239
4248
  return {
4240
4249
  data: {
4241
4250
  knowledge
@@ -5037,7 +5046,7 @@ var ScenarioService = class _ScenarioService extends Service {
5037
5046
  this.setupEventListeners();
5038
5047
  }
5039
5048
  static serviceType = "scenario";
5040
- capabilityDescription = "The agent is currently in a scenario testing environment. It can create rooms, send messages, and talk to other agents in a live interactive testing environment.";
5049
+ capabilityDescription = "The agent is currently in a scenario testing environment. It can Create groups, send messages, and talk to other agents in a live interactive testing environment.";
5041
5050
  messageHandlers = /* @__PURE__ */ new Map();
5042
5051
  worlds = /* @__PURE__ */ new Map();
5043
5052
  activeActions = /* @__PURE__ */ new Map();
@@ -5563,16 +5572,15 @@ var messageReceivedHandler = async ({
5563
5572
  return;
5564
5573
  }
5565
5574
  let state = await runtime.composeState(message, [
5566
- "PROVIDERS",
5575
+ "ANXIETY",
5567
5576
  "SHOULD_RESPOND",
5577
+ "ENTITIES",
5568
5578
  "CHARACTER",
5569
- "RECENT_MESSAGES",
5570
- "ENTITIES"
5579
+ "RECENT_MESSAGES"
5571
5580
  ]);
5572
5581
  const room = await runtime.getRoom(message.roomId);
5573
5582
  const shouldSkipShouldRespond = room?.type === ChannelType10.DM || room?.type === ChannelType10.VOICE_DM || room?.type === ChannelType10.SELF;
5574
5583
  let shouldRespond = true;
5575
- let providers = [];
5576
5584
  if (!shouldSkipShouldRespond) {
5577
5585
  const shouldRespondPrompt = composePromptFromState9({
5578
5586
  state,
@@ -5589,32 +5597,15 @@ var messageReceivedHandler = async ({
5589
5597
  logger17.debug(`*** Should Respond Response for ${runtime.character.name} ***
5590
5598
  `, response);
5591
5599
  logger17.debug(`*** Raw Response Type: ${typeof response} ***`);
5592
- let processedResponse = response;
5593
- if (typeof response === "string" && response.includes("```")) {
5594
- logger17.debug("*** Response contains code block markers, attempting to clean up ***");
5595
- processedResponse = response.replace(/```json\n|\n```|```/g, "");
5596
- logger17.debug("*** Processed Response ***\n", processedResponse);
5597
- }
5598
- const responseObject = parseJSONObjectFromText4(processedResponse);
5599
- logger17.debug("*** Parsed Response Object ***", responseObject);
5600
+ const responseObject = parseKeyValueXml(response);
5601
+ logger17.debug("*** Parsed XML Response Object ***", responseObject);
5600
5602
  shouldRespond = responseObject?.action && responseObject.action === "RESPOND";
5601
- providers = responseObject?.providers || [];
5602
5603
  } else {
5603
- const providersPrompt = composePromptFromState9({
5604
- state,
5605
- template: runtime.character.templates?.providersTemplate || providersTemplate
5606
- });
5607
- const response = await runtime.useModel(ModelType13.TEXT_SMALL, {
5608
- prompt: providersPrompt
5609
- });
5610
- const responseObject = parseJSONObjectFromText4(response);
5611
- providers = responseObject?.providers || [];
5604
+ shouldRespond = true;
5612
5605
  }
5613
- logger17.debug("*** Should Respond ***", shouldRespond);
5614
- logger17.debug("*** Providers Value ***", providers);
5615
- state = await runtime.composeState(message, null, providers);
5616
5606
  let responseMessages = [];
5617
5607
  if (shouldRespond) {
5608
+ state = await runtime.composeState(message);
5618
5609
  const prompt = composePromptFromState9({
5619
5610
  state,
5620
5611
  template: runtime.character.templates?.messageHandlerTemplate || messageHandlerTemplate
@@ -5623,13 +5614,26 @@ var messageReceivedHandler = async ({
5623
5614
  let retries = 0;
5624
5615
  const maxRetries = 3;
5625
5616
  while (retries < maxRetries && (!responseContent?.thought || !responseContent?.actions)) {
5626
- const response = await runtime.useModel(ModelType13.TEXT_LARGE, {
5617
+ let response = await runtime.useModel(ModelType13.TEXT_LARGE, {
5627
5618
  prompt
5628
5619
  });
5629
- responseContent = parseJSONObjectFromText4(response);
5620
+ logger17.debug("*** Raw LLM Response ***\n", response);
5621
+ const parsedXml = parseKeyValueXml(response);
5622
+ logger17.debug("*** Parsed XML Content ***\n", parsedXml);
5623
+ if (parsedXml) {
5624
+ responseContent = {
5625
+ thought: parsedXml.thought || "",
5626
+ actions: parsedXml.actions || ["IGNORE"],
5627
+ providers: parsedXml.providers || [],
5628
+ text: parsedXml.text || "",
5629
+ simple: parsedXml.simple || false
5630
+ };
5631
+ } else {
5632
+ responseContent = null;
5633
+ }
5630
5634
  retries++;
5631
- if (!responseContent?.thought && !responseContent?.actions) {
5632
- logger17.warn("*** Missing required fields, retrying... ***");
5635
+ if (!responseContent?.thought || !responseContent?.actions) {
5636
+ logger17.warn("*** Missing required fields (thought or actions), retrying... ***");
5633
5637
  }
5634
5638
  }
5635
5639
  const currentResponseId = agentResponses.get(message.roomId);
@@ -5641,26 +5645,63 @@ var messageReceivedHandler = async ({
5641
5645
  }
5642
5646
  if (responseContent) {
5643
5647
  responseContent.inReplyTo = createUniqueUuid4(runtime, message.id);
5644
- responseMessages = [
5645
- {
5646
- id: asUUID(v4_default()),
5647
- entityId: runtime.agentId,
5648
- agentId: runtime.agentId,
5649
- content: responseContent,
5650
- roomId: message.roomId,
5651
- createdAt: Date.now()
5652
- }
5653
- ];
5654
- callback(responseContent);
5648
+ const responseMesssage = {
5649
+ id: asUUID(v4_default()),
5650
+ entityId: runtime.agentId,
5651
+ agentId: runtime.agentId,
5652
+ content: responseContent,
5653
+ roomId: message.roomId,
5654
+ createdAt: Date.now()
5655
+ };
5656
+ responseMessages = [responseMesssage];
5655
5657
  }
5656
5658
  agentResponses.delete(message.roomId);
5657
5659
  if (agentResponses.size === 0) {
5658
5660
  latestResponseIds.delete(runtime.agentId);
5659
5661
  }
5660
- await runtime.processActions(message, responseMessages, state, callback);
5662
+ if (responseContent?.providers.length > 0) {
5663
+ state = await runtime.composeState(message, null, [...responseContent?.providers]);
5664
+ }
5665
+ if (responseContent && responseContent.simple && responseContent.text && (responseContent.actions.length === 0 || responseContent.actions.length === 1 && responseContent.actions[0].toUpperCase() === "REPLY")) {
5666
+ await callback(responseContent);
5667
+ } else {
5668
+ await runtime.processActions(message, responseMessages, state, callback);
5669
+ }
5670
+ await runtime.evaluate(message, state, shouldRespond, callback, responseMessages);
5671
+ } else {
5672
+ logger17.debug("Agent decided not to respond (shouldRespond is false).");
5673
+ const currentResponseId = agentResponses.get(message.roomId);
5674
+ if (currentResponseId !== responseId) {
5675
+ logger17.info(
5676
+ `Ignore response discarded - newer message being processed for agent: ${runtime.agentId}, room: ${message.roomId}`
5677
+ );
5678
+ return;
5679
+ }
5680
+ const ignoreContent = {
5681
+ thought: "Agent decided not to respond to this message.",
5682
+ actions: ["IGNORE"],
5683
+ simple: true,
5684
+ // Treat it as simple for callback purposes
5685
+ inReplyTo: createUniqueUuid4(runtime, message.id)
5686
+ // Reference original message
5687
+ };
5688
+ await callback(ignoreContent);
5689
+ const ignoreMemory = {
5690
+ id: asUUID(v4_default()),
5691
+ entityId: runtime.agentId,
5692
+ agentId: runtime.agentId,
5693
+ content: ignoreContent,
5694
+ roomId: message.roomId,
5695
+ createdAt: Date.now()
5696
+ };
5697
+ await runtime.createMemory(ignoreMemory, "messages");
5698
+ logger17.debug("Saved ignore response to memory", { memoryId: ignoreMemory.id });
5699
+ agentResponses.delete(message.roomId);
5700
+ if (agentResponses.size === 0) {
5701
+ latestResponseIds.delete(runtime.agentId);
5702
+ }
5661
5703
  }
5662
5704
  onComplete?.();
5663
- await runtime.evaluate(message, state, shouldRespond, callback, responseMessages);
5664
5705
  await runtime.emitEvent(EventType2.RUN_ENDED, {
5665
5706
  runtime,
5666
5707
  runId,
@@ -5742,7 +5783,8 @@ var postGeneratedHandler = async ({
5742
5783
  roomId,
5743
5784
  content: {},
5744
5785
  metadata: {
5745
- entityName: runtime.character.name
5786
+ entityName: runtime.character.name,
5787
+ type: "message"
5746
5788
  }
5747
5789
  };
5748
5790
  let state = await runtime.composeState(message, null, [
@@ -5766,9 +5808,20 @@ var postGeneratedHandler = async ({
5766
5808
  const response = await runtime.useModel(ModelType13.TEXT_SMALL, {
5767
5809
  prompt
5768
5810
  });
5769
- responseContent = parseJSONObjectFromText4(response);
5811
+ const parsedXml = parseKeyValueXml(response);
5812
+ if (parsedXml) {
5813
+ responseContent = {
5814
+ thought: parsedXml.thought || "",
5815
+ actions: parsedXml.actions || ["IGNORE"],
5816
+ providers: parsedXml.providers || [],
5817
+ text: parsedXml.text || "",
5818
+ simple: parsedXml.simple || false
5819
+ };
5820
+ } else {
5821
+ responseContent = null;
5822
+ }
5770
5823
  retries++;
5771
- if (!responseContent?.thought && !responseContent?.actions) {
5824
+ if (!responseContent?.thought || !responseContent?.actions) {
5772
5825
  logger17.warn("*** Missing required fields, retrying... ***");
5773
5826
  }
5774
5827
  }
@@ -5777,10 +5830,14 @@ var postGeneratedHandler = async ({
5777
5830
  state,
5778
5831
  template: runtime.character.templates?.postCreationTemplate || postCreationTemplate
5779
5832
  });
5780
- const jsonResponse = await runtime.useModel(ModelType13.OBJECT_LARGE, {
5781
- prompt: postPrompt,
5782
- output: "no-schema"
5833
+ const xmlResponseText = await runtime.useModel(ModelType13.TEXT_LARGE, {
5834
+ prompt: postPrompt
5783
5835
  });
5836
+ const parsedXmlResponse = parseKeyValueXml(xmlResponseText);
5837
+ if (!parsedXmlResponse) {
5838
+ logger17.error("Failed to parse XML response for post creation. Raw response:", xmlResponseText);
5839
+ return;
5840
+ }
5784
5841
  function cleanupPostText(text) {
5785
5842
  let cleanedText2 = text.replace(/^['"](.*)['"]$/, "$1");
5786
5843
  cleanedText2 = cleanedText2.replaceAll(/\\n/g, "\n\n");
@@ -5789,7 +5846,7 @@ var postGeneratedHandler = async ({
5789
5846
  }
5790
5847
  return cleanedText2;
5791
5848
  }
5792
- const cleanedText = cleanupPostText(jsonResponse.post);
5849
+ const cleanedText = cleanupPostText(parsedXmlResponse.post || "");
5793
5850
  const RM = state.providerData?.find((pd) => pd.providerName === "RECENT_MESSAGES");
5794
5851
  if (RM) {
5795
5852
  for (const m of RM.data.recentMessages) {
@@ -5832,7 +5889,7 @@ var postGeneratedHandler = async ({
5832
5889
  text: cleanedText,
5833
5890
  source,
5834
5891
  channelType: ChannelType10.FEED,
5835
- thought: jsonResponse.thought || "",
5892
+ thought: parsedXmlResponse.thought || "",
5836
5893
  type: "post"
5837
5894
  },
5838
5895
  roomId: message.roomId,