-
Notifications
You must be signed in to change notification settings - Fork 0
/
agent.ts
89 lines (82 loc) · 2.94 KB
/
agent.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import {
ChatPromptTemplate,
MessagesPlaceholder,
} from "@langchain/core/prompts"
import { WikipediaQueryRun } from "@langchain/community/tools/wikipedia_query_run"
import { DynamicStructuredTool } from "@langchain/core/tools"
import { AgentExecutor, createOpenAIFunctionsAgent } from "langchain/agents"
import { z } from "zod"
import { AzureChatOpenAI } from "@langchain/openai"
import { TavilySearchResults } from "@langchain/community/tools/tavily_search"
import { Serialized } from "@langchain/core/load/serializable"
import { ChatMessageHistory } from "@langchain/community/stores/message/in_memory"
const messageHistory = new ChatMessageHistory()
export async function askAgent(text: string): Promise<string> {
const executor = await initializeAgent()
const messages = await messageHistory.getMessages()
const response = await executor.invoke({
input: text,
chat_history: messages,
})
await messageHistory.addUserMessage(response.input)
await messageHistory.addAIMessage(response.output)
return response.output
}
const wikipediaTool = new DynamicStructuredTool({
name: "wikipediaTool",
description:
"Hintergrundwissen zu einem bestimmten Thema und Fakt aus Wikipedia abrufen",
schema: z.object({
topic: z.string().describe("Der Titel des Wikipedia Artikels"),
}),
callbacks: [toolCallbackFor("Wikipedia")],
func: async ({ topic }) => {
const tool = new WikipediaQueryRun({
topKResults: 2,
maxDocContentLength: 3000,
baseUrl: "https://de.wikipedia.org/w/api.php",
})
return tool.invoke(topic)
},
})
function toolCallbackFor(name: string) {
return {
handleToolStart: async (tool: Serialized, input) => {
console.log(`Tool call for ${name}: ${input}`)
},
}
}
const prompt = ChatPromptTemplate.fromMessages([
[
"system",
`Du bist ein KI-Assistent für historische Bildung durch Rollenspiel. Deine Aufgaben:
Verkörpere historische Persönlichkeiten auf Anfrage des Nutzers.
WICHTIG: Nutze IMMER deine Recherche-Tools für JEDE Antwort. - Beginne mit Wikipedia - Nutze Tavily, wenn du in Wikipedia nichts zu der Frage gefunden hast
Antworte NUR basierend auf recherchierten Fakten. Erfinde NICHTS.
Bleibe in der Rolle der historischen Person, auch bei begrenzten Informationen.
Passe Sprachstil und Ton der jeweiligen Figur an.
Wenn keine Persona vorgegeben ist, frage nach einer.
Wenn du keine Informationen findest, sage: 'Als [Name der Persona] kann ich dazu leider nichts sagen.'`,
],
new MessagesPlaceholder("chat_history"),
new MessagesPlaceholder("agent_scratchpad"),
["user", "{input}"],
])
const tools = [
wikipediaTool,
new TavilySearchResults({
maxResults: 2,
callbacks: [toolCallbackFor("Tavily")],
}),
] as any
async function initializeAgent(): Promise<AgentExecutor> {
const agent = await createOpenAIFunctionsAgent({
llm: new AzureChatOpenAI() as any,
prompt: prompt as any,
tools,
})
return new AgentExecutor({
agent,
tools,
})
}