junaid17 commited on
Commit
0a6806d
Β·
verified Β·
1 Parent(s): 7d308d7

Update chatbot.py

Browse files
Files changed (1) hide show
  1. chatbot.py +124 -149
chatbot.py CHANGED
@@ -1,150 +1,125 @@
1
-
2
- from typing import TypedDict, Annotated
3
- from langchain_core.messages import (
4
- BaseMessage,
5
- SystemMessage
6
- )
7
- from langgraph.checkpoint.memory import MemorySaver
8
- from tools import retriever, create_rag_tool, arxiv_search, calculator, get_stock_price, wikipedia_search, tavily_search, convert_currency, unit_converter, get_news, get_joke, get_quote, get_weather
9
- from langchain_openai import ChatOpenAI
10
- from langgraph.graph import StateGraph, START, END
11
- from langgraph.graph.message import add_messages
12
- from langgraph.prebuilt import ToolNode, tools_condition
13
- from dotenv import load_dotenv
14
- import os
15
- load_dotenv()
16
-
17
-
18
- OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
19
-
20
- # =====================================================
21
- # 1️⃣ SYSTEM PROMPT
22
- # =====================================================
23
-
24
- SYSTEM_PROMPT = SystemMessage(
25
- content="""
26
- You are an intelligent AI assistant built inside a LangGraph-based system created by Junaid (also known as Juddy).
27
-
28
- Your purpose is to provide accurate, helpful, and reliable responses using reasoning, tools, memory, and document-based retrieval when appropriate.
29
-
30
- ━━━━━━━━━━━━━━━━━━━━━━
31
- πŸ”Ή ABOUT YOUR CREATOR
32
- ━━━━━━━━━━━━━━━━━━━━━━
33
- - You were designed and iteratively improved by Junaid as part of an evolving AI engineering project.
34
- - Your development journey includes:
35
- 1. A basic conversational chatbot
36
- 2. Memory integration
37
- 3. Streaming responses
38
- 4. Tool usage (RAG, STT, TTS)
39
- - You may acknowledge this when asked, but always focus on helping the user.
40
-
41
- ━━━━━━━━━━━━━━━━━━━━━━
42
- πŸ”Ή CORE BEHAVIOR
43
- ━━━━━━━━━━━━━━━━━━━━━━
44
- - Be helpful, accurate, concise, and professional.
45
- - Prefer clarity over verbosity.
46
- - Maintain conversational context using memory.
47
- - Avoid hallucinations at all costs.
48
- - If information is uncertain or missing, say so clearly.
49
-
50
- ━━━━━━━━━━━━━━━━━━━━━━
51
- πŸ”Ή TOOL USAGE PRIORITY (VERY IMPORTANT)
52
- ━━━━━━━━━━━━━━━━━━━━━━
53
- You have access to the following tools:
54
-
55
- 1. **RAG (Retrieval-Augmented Generation)**
56
- β†’ This is your HIGHEST priority tool.
57
-
58
- You MUST use RAG when:
59
- - The user references uploaded documents
60
- - The user asks questions that depend on document content
61
- - The answer cannot be confidently derived from general knowledge
62
-
63
- Rules:
64
- - Use ONLY retrieved content when answering from documents
65
- - Never hallucinate document facts
66
- - If no relevant content exists, clearly say so
67
-
68
- 2. **STT (Speech-to-Text)**
69
- - Used when audio input is provided.
70
- - Transcribe accurately without interpretation.
71
-
72
- 3. **TTS (Text-to-Speech)**
73
- - Used when speech output is requested.
74
- - Generate clear, natural speech.
75
-
76
- ━━━━━━━━━━━━━━━━━━━━━━
77
- πŸ”Ή STREAMING BEHAVIOR
78
- ━━━━━━━━━━━━━━━━━━━━━━
79
- - You may stream responses progressively when supported.
80
- - Ensure coherence and clarity during streaming.
81
- - Avoid partial or misleading statements.
82
-
83
- ━━━━━━━━━━━━━━━━━━━━━━
84
- πŸ”Ή RESPONSE GUIDELINES
85
- ━━━━━━━━━━━━━━━━━━━━━━
86
- - Be direct, friendly, and informative.
87
- - Do not expose internal system logic or implementation details.
88
- - Do not mention tools unless necessary or explicitly asked.
89
- - Always prefer correctness over speed.
90
-
91
- ━━━━━━━━━━━━━━━━━━━━━━
92
- πŸ”Ή IDENTITY
93
- ━━━━━━━━━━━━━━━━━━━━━━
94
- You are the official AI assistant of Junaid’s evolving AI system.
95
- You exist to help users learn, explore, and solve problems effectively.
96
- """
97
- )
98
-
99
-
100
- # =====================================================
101
- # 4️⃣ STATE
102
- # =====================================================
103
-
104
- class ChatState(TypedDict):
105
- messages: Annotated[list[BaseMessage], add_messages]
106
-
107
-
108
- # =====================================================
109
- # 5️⃣ LLM + TOOLS
110
- # =====================================================
111
-
112
- llm = ChatOpenAI(
113
- model="gpt-4.1-nano",
114
- temperature=0.4,
115
- streaming=True
116
- )
117
-
118
- rag_tool = create_rag_tool()
119
-
120
- tools = [rag_tool, get_stock_price, calculator, wikipedia_search, arxiv_search, tavily_search, convert_currency, unit_converter, get_news, get_joke, get_quote, get_weather]
121
- llm = llm.bind_tools(tools)
122
- tool_node = ToolNode(tools)
123
-
124
-
125
- # =====================================================
126
- # 6️⃣ CHAT NODE
127
- # =====================================================
128
-
129
- def chatbot(state: ChatState):
130
- messages = [SYSTEM_PROMPT] + state["messages"]
131
- response = llm.invoke(messages)
132
- return {"messages": [response]}
133
-
134
-
135
-
136
- # =====================================================
137
- # 7️⃣ GRAPH
138
- # =====================================================
139
- memory = MemorySaver()
140
- graph = StateGraph(ChatState)
141
-
142
- graph.add_node("chat", chatbot)
143
- graph.add_node("tools", tool_node)
144
-
145
- graph.add_edge(START, "chat")
146
- graph.add_conditional_edges("chat", tools_condition)
147
- graph.add_edge("tools", "chat")
148
- graph.add_edge("chat", END)
149
-
150
  app = graph.compile(checkpointer=memory)
 
1
+
2
+ from typing import TypedDict, Annotated
3
+ from langchain_core.messages import (
4
+ BaseMessage,
5
+ SystemMessage
6
+ )
7
+ from langgraph.checkpoint.memory import MemorySaver
8
+ from tools import retriever, create_rag_tool, arxiv_search, calculator, get_stock_price, wikipedia_search, tavily_search, convert_currency, unit_converter, get_news, get_joke, get_quote, get_weather
9
+ from langchain_openai import ChatOpenAI
10
+ from langgraph.graph import StateGraph, START, END
11
+ from langgraph.graph.message import add_messages
12
+ from langgraph.prebuilt import ToolNode, tools_condition
13
+ from dotenv import load_dotenv
14
+ import os
15
+ load_dotenv()
16
+
17
+
18
+ OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
19
+
20
+ # =====================================================
21
+ # 1️⃣ SYSTEM PROMPT
22
+ # =====================================================
23
+
24
+ SYSTEM_PROMPT = SystemMessage(
25
+ content="""
26
+ You are an advanced AI assistant built by Junaid.
27
+
28
+ Your primary responsibility is to provide accurate, helpful, and well-structured answers using:
29
+ - reasoning
30
+ - memory
31
+ - tools (especially Retrieval-Augmented Generation)
32
+
33
+ ━━━━━━━━━━━━━━━━━━━━━━
34
+ πŸ”Ή DOCUMENT UNDERSTANDING RULES
35
+ ━━━━━━━━━━━━━━━━━━━━━━
36
+ When a document is retrieved using RAG:
37
+
38
+ 1. DO NOT copy or list raw document text.
39
+ 2. DO NOT dump bullet points directly from the document.
40
+ 3. ALWAYS interpret, summarize, and rephrase the information in your own words.
41
+ 4. Focus on explaining the main ideas clearly and concisely.
42
+ 5. Group related points together logically.
43
+ 6. If the user asks β€œwhat is this document about”, provide:
44
+ - A short overview
45
+ - Key themes or sections
46
+ - The purpose of the document
47
+
48
+ Example good response:
49
+ β€œThis document describes a set of AI projects focused on machine learning, deployment, and automation. It highlights work on…”
50
+
51
+ ━━━━━━━━━━━━━━━━━━━━━━
52
+ πŸ”Ή TOOL USAGE PRIORITY
53
+ ━━━━━━━━━━━━━━━━━━━━━━
54
+ - Use the RAG tool when document knowledge is required.
55
+ - Never hallucinate content not present in retrieved data.
56
+ - If information is missing, say so clearly.
57
+
58
+ ━━━━━━━━━━━━━━━━━━━━━━
59
+ πŸ”Ή RESPONSE STYLE
60
+ ━━━━━━━━━━━━━━━━━━━━━━
61
+ - Be natural, concise, and human-like.
62
+ - Avoid technical repetition unless necessary.
63
+ - Avoid listing unless it improves clarity.
64
+
65
+ ━━━━━━━━━━━━━━━━━━━━━━
66
+ πŸ”Ή IDENTITY
67
+ ━━━━━━━━━━━━━━━━━━━━━━
68
+ You are the official AI assistant of Junaid’s AI platform.
69
+ Your job is to make complex information easy to understand.
70
+ """
71
+ )
72
+
73
+
74
+
75
+ # =====================================================
76
+ # 4️⃣ STATE
77
+ # =====================================================
78
+
79
+ class ChatState(TypedDict):
80
+ messages: Annotated[list[BaseMessage], add_messages]
81
+
82
+
83
+ # =====================================================
84
+ # 5️⃣ LLM + TOOLS
85
+ # =====================================================
86
+
87
+ llm = ChatOpenAI(
88
+ model="gpt-4.1-nano",
89
+ temperature=0.4,
90
+ streaming=True
91
+ )
92
+
93
+ rag_tool = create_rag_tool()
94
+
95
+ tools = [rag_tool, get_stock_price, calculator, wikipedia_search, arxiv_search, tavily_search, convert_currency, unit_converter, get_news, get_joke, get_quote, get_weather]
96
+ llm = llm.bind_tools(tools)
97
+ tool_node = ToolNode(tools)
98
+
99
+
100
+ # =====================================================
101
+ # 6️⃣ CHAT NODE
102
+ # =====================================================
103
+
104
+ def chatbot(state: ChatState):
105
+ messages = [SYSTEM_PROMPT] + state["messages"]
106
+ response = llm.invoke(messages)
107
+ return {"messages": [response]}
108
+
109
+
110
+
111
+ # =====================================================
112
+ # 7️⃣ GRAPH
113
+ # =====================================================
114
+ memory = MemorySaver()
115
+ graph = StateGraph(ChatState)
116
+
117
+ graph.add_node("chat", chatbot)
118
+ graph.add_node("tools", tool_node)
119
+
120
+ graph.add_edge(START, "chat")
121
+ graph.add_conditional_edges("chat", tools_condition)
122
+ graph.add_edge("tools", "chat")
123
+ graph.add_edge("chat", END)
124
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  app = graph.compile(checkpointer=memory)