-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'develop' into feat/view-chat-history-with-agent-in-clie…
…nt-UI
- Loading branch information
Showing
12 changed files
with
501 additions
and
274 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,201 @@ | ||
import { | ||
Action, | ||
HandlerCallback, | ||
IAgentRuntime, | ||
Memory, | ||
State, | ||
elizaLogger | ||
} from "@elizaos/core"; | ||
import { encodingForModel, TiktokenModel } from "js-tiktoken"; | ||
import { WebSearchService } from "../services/webSearchService"; | ||
import { SearchResult } from "../types"; | ||
|
||
const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; | ||
const DEFAULT_MODEL_ENCODING = "gpt-3.5-turbo"; | ||
|
||
function getTotalTokensFromString( | ||
str: string, | ||
encodingName: TiktokenModel = DEFAULT_MODEL_ENCODING | ||
) { | ||
const encoding = encodingForModel(encodingName); | ||
return encoding.encode(str).length; | ||
} | ||
|
||
function MaxTokens( | ||
data: string, | ||
maxTokens: number = DEFAULT_MAX_WEB_SEARCH_TOKENS | ||
): string { | ||
if (getTotalTokensFromString(data) >= maxTokens) { | ||
return data.slice(0, maxTokens); | ||
} | ||
return data; | ||
} | ||
|
||
export const webSearch: Action = { | ||
name: "WEB_SEARCH", | ||
similes: [ | ||
"SEARCH_WEB", | ||
"INTERNET_SEARCH", | ||
"LOOKUP", | ||
"QUERY_WEB", | ||
"FIND_ONLINE", | ||
"SEARCH_ENGINE", | ||
"WEB_LOOKUP", | ||
"ONLINE_SEARCH", | ||
"FIND_INFORMATION", | ||
], | ||
suppressInitialMessage: true, | ||
description: | ||
"Perform a web search to find information related to the message.", | ||
validate: async (runtime: IAgentRuntime, message: Memory) => { | ||
const tavilyApiKeyOk = !!runtime.getSetting("TAVILY_API_KEY"); | ||
|
||
return tavilyApiKeyOk; | ||
}, | ||
handler: async ( | ||
runtime: IAgentRuntime, | ||
message: Memory, | ||
state: State, | ||
options: any, | ||
callback: HandlerCallback | ||
) => { | ||
elizaLogger.log("Composing state for message:", message); | ||
state = (await runtime.composeState(message)) as State; | ||
const userId = runtime.agentId; | ||
elizaLogger.log("User ID:", userId); | ||
|
||
const webSearchPrompt = message.content.text; | ||
elizaLogger.log("web search prompt received:", webSearchPrompt); | ||
|
||
const webSearchService = new WebSearchService(); | ||
await webSearchService.initialize(runtime); | ||
const searchResponse = await webSearchService.search( | ||
webSearchPrompt, | ||
); | ||
|
||
if (searchResponse && searchResponse.results.length) { | ||
const responseList = searchResponse.answer | ||
? `${searchResponse.answer}${ | ||
Array.isArray(searchResponse.results) && | ||
searchResponse.results.length > 0 | ||
? `\n\nFor more details, you can check out these resources:\n${searchResponse.results | ||
.map( | ||
(result: SearchResult, index: number) => | ||
`${index + 1}. [${result.title}](${result.url})` | ||
) | ||
.join("\n")}` | ||
: "" | ||
}` | ||
: ""; | ||
|
||
callback({ | ||
text: MaxTokens(responseList, DEFAULT_MAX_WEB_SEARCH_TOKENS), | ||
}); | ||
} else { | ||
elizaLogger.error("search failed or returned no data."); | ||
} | ||
}, | ||
examples: [ | ||
[ | ||
{ | ||
user: "{{user1}}", | ||
content: { | ||
text: "Find the latest news about SpaceX launches.", | ||
}, | ||
}, | ||
{ | ||
user: "{{agentName}}", | ||
content: { | ||
text: "Here is the latest news about SpaceX launches:", | ||
action: "WEB_SEARCH", | ||
}, | ||
}, | ||
], | ||
[ | ||
{ | ||
user: "{{user1}}", | ||
content: { | ||
text: "Can you find details about the iPhone 16 release?", | ||
}, | ||
}, | ||
{ | ||
user: "{{agentName}}", | ||
content: { | ||
text: "Here are the details I found about the iPhone 16 release:", | ||
action: "WEB_SEARCH", | ||
}, | ||
}, | ||
], | ||
[ | ||
{ | ||
user: "{{user1}}", | ||
content: { | ||
text: "What is the schedule for the next FIFA World Cup?", | ||
}, | ||
}, | ||
{ | ||
user: "{{agentName}}", | ||
content: { | ||
text: "Here is the schedule for the next FIFA World Cup:", | ||
action: "WEB_SEARCH", | ||
}, | ||
}, | ||
], | ||
[ | ||
{ | ||
user: "{{user1}}", | ||
content: { text: "Check the latest stock price of Tesla." }, | ||
}, | ||
{ | ||
user: "{{agentName}}", | ||
content: { | ||
text: "Here is the latest stock price of Tesla I found:", | ||
action: "WEB_SEARCH", | ||
}, | ||
}, | ||
], | ||
[ | ||
{ | ||
user: "{{user1}}", | ||
content: { | ||
text: "What are the current trending movies in the US?", | ||
}, | ||
}, | ||
{ | ||
user: "{{agentName}}", | ||
content: { | ||
text: "Here are the current trending movies in the US:", | ||
action: "WEB_SEARCH", | ||
}, | ||
}, | ||
], | ||
[ | ||
{ | ||
user: "{{user1}}", | ||
content: { | ||
text: "What is the latest score in the NBA finals?", | ||
}, | ||
}, | ||
{ | ||
user: "{{agentName}}", | ||
content: { | ||
text: "Here is the latest score from the NBA finals:", | ||
action: "WEB_SEARCH", | ||
}, | ||
}, | ||
], | ||
[ | ||
{ | ||
user: "{{user1}}", | ||
content: { text: "When is the next Apple keynote event?" }, | ||
}, | ||
{ | ||
user: "{{agentName}}", | ||
content: { | ||
text: "Here is the information about the next Apple keynote event:", | ||
action: "WEB_SEARCH", | ||
}, | ||
}, | ||
], | ||
], | ||
} as Action; |
Oops, something went wrong.