sliitguy commited on
Commit
331d9d4
·
1 Parent(s): a608524

updated corrections in the agent

Browse files
Dockerfile CHANGED
@@ -25,4 +25,4 @@ COPY --chown=user . /app
25
  EXPOSE 7860
26
 
27
  # Run the application
28
- CMD ["gunicorn", "-b", "0.0.0.0:7860", "app:app"]
 
25
  EXPOSE 7860
26
 
27
  # Run the application
28
+ CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:7860", "app:app"]
README.md CHANGED
@@ -1,8 +1,8 @@
1
  ---
2
  title: Sparrow Agent
3
- colorFrom: green
4
- colorTo: red
 
5
  sdk: docker
6
- app_file: app.py
7
  pinned: false
8
  ---
 
1
  ---
2
  title: Sparrow Agent
3
+ emoji: 🌖
4
+ colorFrom: red
5
+ colorTo: indigo
6
  sdk: docker
 
7
  pinned: false
8
  ---
app.py CHANGED
@@ -7,8 +7,10 @@ import threading
7
  import time
8
  from src.graphs.finalAgentGraph import sparrowAgent
9
  from langchain_core.messages import HumanMessage, AIMessage
 
10
 
11
  app = Flask(__name__)
 
12
  app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'your-secret-key-here')
13
 
14
  logging.basicConfig(level=logging.INFO)
 
7
  import time
8
  from src.graphs.finalAgentGraph import sparrowAgent
9
  from langchain_core.messages import HumanMessage, AIMessage
10
+ from flask_cors import CORS
11
 
12
  app = Flask(__name__)
13
+ CORS(app, supports_credentials=True)
14
  app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'your-secret-key-here')
15
 
16
  logging.basicConfig(level=logging.INFO)
pyproject.toml CHANGED
@@ -7,6 +7,7 @@ requires-python = ">=3.11"
7
  dependencies = [
8
  "fastapi>=0.116.1",
9
  "flask>=3.1.2",
 
10
  "gradio>=5.49.1",
11
  "langchain>=0.3.27",
12
  "langchain-community>=0.3.27",
@@ -14,6 +15,9 @@ dependencies = [
14
  "langchain-groq>=0.3.7",
15
  "langgraph>=0.6.6",
16
  "langgraph-cli[inmem]>=0.3.8",
 
 
 
17
  "streamlit>=1.48.1",
18
  "tavily-python>=0.7.11",
19
  "uuid>=1.30",
 
7
  dependencies = [
8
  "fastapi>=0.116.1",
9
  "flask>=3.1.2",
10
+ "flask-cors>=6.0.1",
11
  "gradio>=5.49.1",
12
  "langchain>=0.3.27",
13
  "langchain-community>=0.3.27",
 
15
  "langchain-groq>=0.3.7",
16
  "langgraph>=0.6.6",
17
  "langgraph-cli[inmem]>=0.3.8",
18
+ "pymongo>=4.15.3",
19
+ "python-dotenv>=1.1.1",
20
+ "requests>=2.32.5",
21
  "streamlit>=1.48.1",
22
  "tavily-python>=0.7.11",
23
  "uuid>=1.30",
requirements.txt CHANGED
@@ -14,4 +14,6 @@ python-dotenv
14
  requests
15
  pymongo
16
  uuid
17
- gradio
 
 
 
14
  requests
15
  pymongo
16
  uuid
17
+ gradio
18
+ flask_cors
19
+ gunicorn
src/graphs/actionGraph.py CHANGED
@@ -29,7 +29,6 @@ class ExecutorGraphBuilder:
29
  self.graph.add_node("tool_node", self.executor_node_obj.tool_node)
30
  self.graph.add_node("compress_execution", self.executor_node_obj.compress_execution)
31
 
32
- # Flow
33
  self.graph.add_edge(START, "llm_call")
34
  self.graph.add_conditional_edges(
35
  "llm_call",
@@ -50,6 +49,6 @@ class ExecutorGraphBuilder:
50
 
51
  llm=GroqLLM().get_llm()
52
 
53
- ## Creating the graph
54
  graph_builder=ExecutorGraphBuilder(llm)
55
  graph=graph_builder.build_executor_graph().compile()
 
29
  self.graph.add_node("tool_node", self.executor_node_obj.tool_node)
30
  self.graph.add_node("compress_execution", self.executor_node_obj.compress_execution)
31
 
 
32
  self.graph.add_edge(START, "llm_call")
33
  self.graph.add_conditional_edges(
34
  "llm_call",
 
49
 
50
  llm=GroqLLM().get_llm()
51
 
52
+
53
  graph_builder=ExecutorGraphBuilder(llm)
54
  graph=graph_builder.build_executor_graph().compile()
src/utils/prompts.py CHANGED
@@ -1,58 +1,81 @@
1
  clarification_with_user_instructions = """
2
- These are the messages that have been exchanged so far regarding the user's parcel request or tracking inquiry:
3
  <Messages>
4
  {messages}
5
  </Messages>
6
 
7
  Today's date is {date}.
8
 
9
- You are Sparrow, a friendly and helpful parcel operations assistant. Your goal is to help users with their parcel tracking and delivery needs in a warm, conversational manner.
10
-
11
- Assess whether you need to ask a clarifying question, or if the user has already provided enough information for you to proceed.
12
- IMPORTANT: If you can see in the messages history that you have already asked a clarifying question, you almost always do not need to ask another one. Only ask another question if ABSOLUTELY NECESSARY.
13
-
14
- If you need to ask a question, follow these guidelines:
15
- - Be friendly, warm, and conversational - imagine you're helping a friend
16
- - Use a casual, approachable tone (e.g., "I'd be happy to help!", "Let me check that for you!")
17
- - Show empathy and understanding (e.g., "I understand you're waiting for your package")
18
- - Keep it brief and to the point
19
- - Use emojis sparingly and appropriately to add warmth (📦, ✅, 🚚)
20
- - Make the user feel comfortable and valued
21
- - Use bullet points or numbered lists if appropriate for clarity
22
- - Do not ask for unnecessary information or information the user has already provided
23
-
24
- Respond in valid JSON format with these exact keys:
25
- "need_clarification": boolean,
26
- "question": "<question to ask the user to clarify their parcel request>",
27
- "verification": "<verification message that we will start processing the parcel request>"
28
-
29
- If you need to ask a clarifying question, return:
30
- "need_clarification": "yes",
31
- "question": "<your friendly clarifying question>",
32
- "verification": ""
33
-
34
- Example friendly questions:
35
- - "I'd be happy to help you track your package! Could you share the tracking number with me?"
36
- - "Great! Just to make sure I get this right, what's the tracking number for your parcel?"
37
- - "No problem! To give you the most accurate delivery estimate, could you tell me the distance or the origin and destination?"
38
-
39
- If you do not need to ask a clarifying question, return:
40
- "need_clarification": "no",
41
- "question": "",
42
- "verification": "<friendly acknowledgement message>"
43
-
44
- Example friendly verification messages:
45
- - "Perfect! I've got all the details I need. Let me check that for you right away! 📦"
46
- - "Great! I'll track down that package for you now. Just a moment!"
47
- - "Awesome! Let me look into this and get you those delivery details. "
48
- - "Got it! I'll pull up the tracking information for you right now."
49
-
50
- For the verification message when no clarification is needed:
51
- - Start with a friendly acknowledgement ("Perfect!", "Great!", "Awesome!", "Got it!")
52
- - Briefly mention what you'll do ("Let me track that for you", "I'll look that up")
53
- - Add a friendly closing ("Just a moment!", "One sec!", "Right away!")
54
- - Keep it warm, concise, and reassuring
55
- - Optional: Use a relevant emoji (📦, 🚚, ✅)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  """
57
 
58
  transform_messages_into_customer_query_brief_prompt = """
 
1
  clarification_with_user_instructions = """
2
+ These are the messages exchanged so far regarding the user's parcel tracking or delivery inquiry:
3
  <Messages>
4
  {messages}
5
  </Messages>
6
 
7
  Today's date is {date}.
8
 
9
+ You are Sparrow, a friendly and professional parcel operations assistant integrated with Agentic AI and machine learning for ETA prediction on a parcel consolidation platform. Your mission is to assist users with their parcel tracking, delivery status, and shipping needs in a warm, empathetic, and conversational manner. You are both a knowledgeable expert and a helpful friend.
10
+
11
+ Tone Guidelines:
12
+ - Be warm, approachable, and polite—like a trusted friend helping with a sensitive request.
13
+ - Use clear and concise language to keep communication efficient and respectful.
14
+ - Show empathy for users’ concerns about delays or issues.
15
+ - Maintain professionalism while balancing friendliness and expertise.
16
+
17
+ Emoji Use Guidelines:
18
+ - Use emojis sparingly and thoughtfully to add warmth and clarity.
19
+ - Appropriate emojis include: 📦 (package), (confirmation), 🚚 (delivery), 😊 (friendly), and 🙏 (apology/thanks).
20
+ - Match emoji tone to the message:
21
+ * Positive/confirmation: 📦, ✅, 🚚
22
+ * Friendly engagement/clarification: 😊
23
+ * Apologies/errors: 🙏
24
+ - Avoid overusing emojis to maintain professionalism.
25
+
26
+ Engaging Greetings for Casual or Repetitive Inputs:
27
+ - When users send simple greetings or unrelated small talk (e.g., "hi", "hello"):
28
+ * Rotate through varied, warm, and conversational greetings.
29
+ * Examples:
30
+ "Hey there! 👋 Ready to track a parcel or just saying hi? I’m here to help!"
31
+ "Hello! 😊 I’m Sparrow, your friendly shipping buddy. Want to tell me about your parcel?"
32
+ "Hi! 🚀 Curious about your package or shipping info? Let’s chat!"
33
+ "Hey! Just dropping in to say hi? Great! If you need parcel help or tracking, I got you! 📦"
34
+ "Hello, friend! 🌟 Want to check on a shipment or ask me anything about deliveries?"
35
+ * Always gently guide toward parcel-related queries:
36
+ *"Let me know your tracking number or how I can assist!"*
37
+
38
+ Response Examples for Different User States:
39
+
40
+ 1. Clarification Needed:
41
+ Tone: Soft, friendly, encouraging.
42
+ Emoji: 😊
43
+ Example: "I'd be happy to help! Could you share the tracking number for your parcel? 😊"
44
+
45
+ 2. Sufficient Information Provided:
46
+ Tone: Confident, reassuring, prompt.
47
+ Emoji: 📦 or
48
+ Example: "Perfect! I've got all the details I need. Let me check that for you right away! 📦"
49
+
50
+ 3. Processing/Retrieving Information:
51
+ Tone: Courteous, informative.
52
+ Emoji: 🚚
53
+ Example: "Great! I'll track your package now. Just a moment! 🚚"
54
+
55
+ 4. Errors or Unexpected Input:
56
+ Tone: Apologetic, positive, helpful.
57
+ Emoji: 🙏 and 😊
58
+ Examples:
59
+ "Sorry, something went wrong on my end. Could you try again or provide more info? I'm here to help! 🙏😊"
60
+ "Oops! I didn’t quite catch that. Could you give me a bit more detail so I can assist you better? 😊"
61
+
62
+ 5. Reassuring During Delays:
63
+ Tone: Empathetic, patient, encouraging.
64
+ Emoji: 🙏 and 😊
65
+ Example: "I understand you're waiting for your package. Thanks for your patience! I'll get you the latest update soon. 🙏😊"
66
+
67
+ Response Format:
68
+ Return a JSON object with keys:
69
+ - "need_clarification": boolean
70
+ - "question": "<friendly clarifying question or empty string>"
71
+ - "verification": "<warm acknowledgement or fallback message or empty string>"
72
+
73
+ Rules:
74
+ - For clarification: `"need_clarification": true`, provide warm question, empty `"verification"`.
75
+ - For ready processing: `"need_clarification": false`, empty `"question"`, warm verification.
76
+ - For errors/fallback: `"need_clarification": false`, empty `"question"`, gentle fallback in `"verification"`.
77
+
78
+ Always keep replies warm, empathetic, professional, engaging, and concise to make users feel valued and supported.
79
  """
80
 
81
  transform_messages_into_customer_query_brief_prompt = """
src/utils/utils.py CHANGED
@@ -17,13 +17,13 @@ from src.llms.groqllm import GroqLLM
17
  logger = logging.getLogger(__name__)
18
 
19
  # Configuration for MongoDB
20
- MONGODB_URI = os.getenv("MONGODB_URI", None)
21
- MONGODB_DATABASE = os.getenv("MONGODB_DATABASE", "parcel_tracking")
22
  MONGODB_COLLECTION = os.getenv("MONGODB_COLLECTION", "parcels")
23
  MONGODB_TIMEOUT = int(os.getenv("MONGODB_TIMEOUT", "5000")) # milliseconds
24
 
25
  # Configuration for ETA API
26
- ETA_API_BASE_URL = os.getenv("ETA_API_BASE_URL", "http://localhost:8000")
27
  ETA_API_TIMEOUT = int(os.getenv("ETA_API_TIMEOUT", "10")) # seconds
28
 
29
  # MongoDB client singleton
 
17
  logger = logging.getLogger(__name__)
18
 
19
  # Configuration for MongoDB
20
+ MONGODB_URI = os.getenv("MONGODB_URI", "mongodb+srv://nivakaran:Pk3XVsGvtqcVDf04@cluster0.6yoqtds.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0")
21
+ MONGODB_DATABASE = os.getenv("MONGODB_DATABASE", "test")
22
  MONGODB_COLLECTION = os.getenv("MONGODB_COLLECTION", "parcels")
23
  MONGODB_TIMEOUT = int(os.getenv("MONGODB_TIMEOUT", "5000")) # milliseconds
24
 
25
  # Configuration for ETA API
26
+ ETA_API_BASE_URL = os.getenv("ETA_API_BASE_URL", "https://nivakaran-eta-service.hf.space")
27
  ETA_API_TIMEOUT = int(os.getenv("ETA_API_TIMEOUT", "10")) # seconds
28
 
29
  # MongoDB client singleton
uv.lock CHANGED
@@ -494,6 +494,15 @@ wheels = [
494
  { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" },
495
  ]
496
 
 
 
 
 
 
 
 
 
 
497
  [[package]]
498
  name = "fastapi"
499
  version = "0.116.1"
@@ -543,6 +552,19 @@ wheels = [
543
  { url = "https://files.pythonhosted.org/packages/ec/f9/7f9263c5695f4bd0023734af91bedb2ff8209e8de6ead162f35d8dc762fd/flask-3.1.2-py3-none-any.whl", hash = "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c", size = 103308, upload-time = "2025-08-19T21:03:19.499Z" },
544
  ]
545
 
 
 
 
 
 
 
 
 
 
 
 
 
 
546
  [[package]]
547
  name = "forbiddenfruit"
548
  version = "0.1.4"
@@ -1953,6 +1975,67 @@ wheels = [
1953
  { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" },
1954
  ]
1955
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1956
  [[package]]
1957
  name = "python-dateutil"
1958
  version = "2.9.0.post0"
@@ -2343,6 +2426,7 @@ source = { virtual = "." }
2343
  dependencies = [
2344
  { name = "fastapi" },
2345
  { name = "flask" },
 
2346
  { name = "gradio" },
2347
  { name = "langchain" },
2348
  { name = "langchain-community" },
@@ -2350,6 +2434,9 @@ dependencies = [
2350
  { name = "langchain-groq" },
2351
  { name = "langgraph" },
2352
  { name = "langgraph-cli", extra = ["inmem"] },
 
 
 
2353
  { name = "streamlit" },
2354
  { name = "tavily-python" },
2355
  { name = "uuid" },
@@ -2361,6 +2448,7 @@ dependencies = [
2361
  requires-dist = [
2362
  { name = "fastapi", specifier = ">=0.116.1" },
2363
  { name = "flask", specifier = ">=3.1.2" },
 
2364
  { name = "gradio", specifier = ">=5.49.1" },
2365
  { name = "langchain", specifier = ">=0.3.27" },
2366
  { name = "langchain-community", specifier = ">=0.3.27" },
@@ -2368,6 +2456,9 @@ requires-dist = [
2368
  { name = "langchain-groq", specifier = ">=0.3.7" },
2369
  { name = "langgraph", specifier = ">=0.6.6" },
2370
  { name = "langgraph-cli", extras = ["inmem"], specifier = ">=0.3.8" },
 
 
 
2371
  { name = "streamlit", specifier = ">=1.48.1" },
2372
  { name = "tavily-python", specifier = ">=0.7.11" },
2373
  { name = "uuid", specifier = ">=1.30" },
 
494
  { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" },
495
  ]
496
 
497
+ [[package]]
498
+ name = "dnspython"
499
+ version = "2.8.0"
500
+ source = { registry = "https://pypi.org/simple" }
501
+ sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" }
502
+ wheels = [
503
+ { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" },
504
+ ]
505
+
506
  [[package]]
507
  name = "fastapi"
508
  version = "0.116.1"
 
552
  { url = "https://files.pythonhosted.org/packages/ec/f9/7f9263c5695f4bd0023734af91bedb2ff8209e8de6ead162f35d8dc762fd/flask-3.1.2-py3-none-any.whl", hash = "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c", size = 103308, upload-time = "2025-08-19T21:03:19.499Z" },
553
  ]
554
 
555
+ [[package]]
556
+ name = "flask-cors"
557
+ version = "6.0.1"
558
+ source = { registry = "https://pypi.org/simple" }
559
+ dependencies = [
560
+ { name = "flask" },
561
+ { name = "werkzeug" },
562
+ ]
563
+ sdist = { url = "https://files.pythonhosted.org/packages/76/37/bcfa6c7d5eec777c4c7cf45ce6b27631cebe5230caf88d85eadd63edd37a/flask_cors-6.0.1.tar.gz", hash = "sha256:d81bcb31f07b0985be7f48406247e9243aced229b7747219160a0559edd678db", size = 13463, upload-time = "2025-06-11T01:32:08.518Z" }
564
+ wheels = [
565
+ { url = "https://files.pythonhosted.org/packages/17/f8/01bf35a3afd734345528f98d0353f2a978a476528ad4d7e78b70c4d149dd/flask_cors-6.0.1-py3-none-any.whl", hash = "sha256:c7b2cbfb1a31aa0d2e5341eea03a6805349f7a61647daee1a15c46bbe981494c", size = 13244, upload-time = "2025-06-11T01:32:07.352Z" },
566
+ ]
567
+
568
  [[package]]
569
  name = "forbiddenfruit"
570
  version = "0.1.4"
 
1975
  { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" },
1976
  ]
1977
 
1978
+ [[package]]
1979
+ name = "pymongo"
1980
+ version = "4.15.3"
1981
+ source = { registry = "https://pypi.org/simple" }
1982
+ dependencies = [
1983
+ { name = "dnspython" },
1984
+ ]
1985
+ sdist = { url = "https://files.pythonhosted.org/packages/9d/7b/a709c85dc716eb85b69f71a4bb375cf1e72758a7e872103f27551243319c/pymongo-4.15.3.tar.gz", hash = "sha256:7a981271347623b5319932796690c2d301668ac3a1965974ac9f5c3b8a22cea5", size = 2470801, upload-time = "2025-10-07T21:57:50.384Z" }
1986
+ wheels = [
1987
+ { url = "https://files.pythonhosted.org/packages/73/04/3dbc426c5868961d8308f19750243f8472f587f5f8a5029ce6953ba74b82/pymongo-4.15.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a13d8f7141294404ce46dfbabb2f2d17e9b1192456651ae831fa351f86fbeb", size = 865889, upload-time = "2025-10-07T21:56:14.165Z" },
1988
+ { url = "https://files.pythonhosted.org/packages/8c/39/7f7652f53dd0eb0c4c3420a175183da757e9c53f9a2bf3ebc589758a1b9e/pymongo-4.15.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:17d13458baf4a6a9f2e787d95adf8ec50d412accb9926a044bd1c41029c323b2", size = 866230, upload-time = "2025-10-07T21:56:15.587Z" },
1989
+ { url = "https://files.pythonhosted.org/packages/6a/0b/84e119e6bab7b19cf4fa1ebb9b4c29bf6c0e76521ed8221b44e3f94a3a37/pymongo-4.15.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fe4bcb8acfb288e238190397d4a699aeb4adb70e8545a6f4e44f99d4e8096ab1", size = 1429788, upload-time = "2025-10-07T21:56:17.362Z" },
1990
+ { url = "https://files.pythonhosted.org/packages/30/39/9905fcb99903de6ac8483114d1c85efe56bc5df735857bdfcc372cf8a3ec/pymongo-4.15.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d09d895c7f08bcbed4d2e96a00e52e9e545ae5a37b32d2dc10099b205a21fc6d", size = 1456758, upload-time = "2025-10-07T21:56:18.841Z" },
1991
+ { url = "https://files.pythonhosted.org/packages/08/58/3c3ac32b8d6ebb654083d53f58e4621cd4c7f306b3b85acef667b80acf08/pymongo-4.15.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:21c0a95a4db72562fd0805e2f76496bf432ba2e27a5651f4b9c670466260c258", size = 1514666, upload-time = "2025-10-07T21:56:20.488Z" },
1992
+ { url = "https://files.pythonhosted.org/packages/19/e2/52f41de224218dc787b7e1187a1ca1a51946dcb979ee553ec917745ccd8d/pymongo-4.15.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:89e45d7fa987f4e246cdf43ff001e3f911f73eb19ba9dabc2a6d80df5c97883b", size = 1500703, upload-time = "2025-10-07T21:56:21.874Z" },
1993
+ { url = "https://files.pythonhosted.org/packages/34/0d/a5271073339ba6fc8a5f4e3a62baaa5dd8bf35246c37b512317e2a22848e/pymongo-4.15.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1246a82fa6dd73ac2c63aa7e463752d5d1ca91e0c7a23396b78f21273befd3a7", size = 1452013, upload-time = "2025-10-07T21:56:23.526Z" },
1994
+ { url = "https://files.pythonhosted.org/packages/a0/3b/f39b721ca0db9f0820e12eeffec84eb87b7502abb13a685226c5434f9618/pymongo-4.15.3-cp311-cp311-win32.whl", hash = "sha256:9483521c03f6017336f54445652ead3145154e8d3ea06418e52cea57fee43292", size = 844461, upload-time = "2025-10-07T21:56:24.867Z" },
1995
+ { url = "https://files.pythonhosted.org/packages/12/72/e58b9df862edbf238a1d71fa32749a6eaf30a3f60289602681351c29093a/pymongo-4.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:c57dad9f289d72af1d7c47a444c4d9fa401f951cedbbcc54c7dd0c2107d6d786", size = 859200, upload-time = "2025-10-07T21:56:26.393Z" },
1996
+ { url = "https://files.pythonhosted.org/packages/81/8f/64c15df5e87de759412c3b962950561202c9b39e5cc604061e056043e163/pymongo-4.15.3-cp311-cp311-win_arm64.whl", hash = "sha256:2fd3b99520f2bb013960ac29dece1b43f2f1b6d94351ca33ba1b1211ecf79a09", size = 848372, upload-time = "2025-10-07T21:56:27.994Z" },
1997
+ { url = "https://files.pythonhosted.org/packages/5b/92/7491a2046b41bfd3641da0a23529c88e27eac67c681de3cd9fbef4113d38/pymongo-4.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bd0497c564b0ae34fb816464ffc09986dd9ca29e2772a0f7af989e472fecc2ad", size = 920953, upload-time = "2025-10-07T21:56:29.737Z" },
1998
+ { url = "https://files.pythonhosted.org/packages/ce/0c/98864cbfa8fbc954ae7480c91a35f0dc4e3339dab0c55f669e4dbeac808f/pymongo-4.15.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:292fd5a3f045751a823a54cdea75809b2216a62cc5f74a1a96b337db613d46a8", size = 920690, upload-time = "2025-10-07T21:56:31.094Z" },
1999
+ { url = "https://files.pythonhosted.org/packages/b8/a6/7dc8043a10a1c30153be2d6847ab37911b169d53a6b05d21871b35b3de82/pymongo-4.15.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:959ef69c5e687b6b749fbf2140c7062abdb4804df013ae0507caabf30cba6875", size = 1690357, upload-time = "2025-10-07T21:56:32.466Z" },
2000
+ { url = "https://files.pythonhosted.org/packages/0b/96/3d85da60094d2022217f2849e1b61a79af9d51ed8d05455d7413d68ab88e/pymongo-4.15.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de3bc878c3be54ae41c2cabc9e9407549ed4fec41f4e279c04e840dddd7c630c", size = 1726102, upload-time = "2025-10-07T21:56:33.952Z" },
2001
+ { url = "https://files.pythonhosted.org/packages/ac/fd/dfd6ddee0330171f2f52f7e5344c02d25d2dd8dfa95ce0e5e413579f52fd/pymongo-4.15.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07bcc36d11252f24fe671e7e64044d39a13d997b0502c6401161f28cc144f584", size = 1800630, upload-time = "2025-10-07T21:56:35.632Z" },
2002
+ { url = "https://files.pythonhosted.org/packages/1c/3b/e19a5f2de227ff720bc76c41d166d508e6fbe1096ba1ad18ade43b790b5e/pymongo-4.15.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b63bac343b79bd209e830aac1f5d9d552ff415f23a924d3e51abbe3041265436", size = 1785478, upload-time = "2025-10-07T21:56:37.39Z" },
2003
+ { url = "https://files.pythonhosted.org/packages/75/d2/927c9b1383c6708fc50c3700ecb1c2876e67dde95ad5fb1d29d04e8ac083/pymongo-4.15.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b33d59bf6fa1ca1d7d96d4fccff51e41312358194190d53ef70a84c070f5287e", size = 1718548, upload-time = "2025-10-07T21:56:38.754Z" },
2004
+ { url = "https://files.pythonhosted.org/packages/fe/10/a63592d1445f894b18d04865c2d4c235e2261f3d63f31f45ba4fe0486ec4/pymongo-4.15.3-cp312-cp312-win32.whl", hash = "sha256:b3a0ec660d61efb91c16a5962ec937011fe3572c4338216831f102e53d294e5c", size = 891301, upload-time = "2025-10-07T21:56:40.043Z" },
2005
+ { url = "https://files.pythonhosted.org/packages/be/ba/a8fdc43044408ed769c83108fa569aa52ee87968bdbf1e2ea142b109c268/pymongo-4.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:f6b0513e5765fdde39f36e6a29a36c67071122b5efa748940ae51075beb5e4bc", size = 910928, upload-time = "2025-10-07T21:56:41.401Z" },
2006
+ { url = "https://files.pythonhosted.org/packages/b4/61/d53c17fdfaa9149864ab1fa84436ae218b72c969f00e4c124e017e461ce6/pymongo-4.15.3-cp312-cp312-win_arm64.whl", hash = "sha256:c4fdd8e6eab8ff77c1c8041792b5f760d48508623cd10b50d5639e73f1eec049", size = 896347, upload-time = "2025-10-07T21:56:43.271Z" },
2007
+ { url = "https://files.pythonhosted.org/packages/46/a4/e1ce9d408a1c1bcb1554ff61251b108e16cefd7db91b33faa2afc92294de/pymongo-4.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a47a3218f7900f65bf0f36fcd1f2485af4945757360e7e143525db9d715d2010", size = 975329, upload-time = "2025-10-07T21:56:44.674Z" },
2008
+ { url = "https://files.pythonhosted.org/packages/74/3c/6796f653d22be43cc0b13c07dbed84133eebbc334ebed4426459b7250163/pymongo-4.15.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09440e78dff397b2f34a624f445ac8eb44c9756a2688b85b3bf344d351d198e1", size = 975129, upload-time = "2025-10-07T21:56:46.104Z" },
2009
+ { url = "https://files.pythonhosted.org/packages/88/33/22453dbfe11031e89c9cbdfde6405c03960daaf5da1b4dfdd458891846b5/pymongo-4.15.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:97f9babdb98c31676f97d468f7fe2dc49b8a66fb6900effddc4904c1450196c8", size = 1950979, upload-time = "2025-10-07T21:56:47.877Z" },
2010
+ { url = "https://files.pythonhosted.org/packages/ba/07/094598e403112e2410a3376fb7845c69e2ec2dfc5ab5cc00b29dc2d26559/pymongo-4.15.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71413cd8f091ae25b1fec3af7c2e531cf9bdb88ce4079470e64835f6a664282a", size = 1995271, upload-time = "2025-10-07T21:56:49.396Z" },
2011
+ { url = "https://files.pythonhosted.org/packages/47/9a/29e44f3dee68defc56e50ed7c9d3802ebf967ab81fefb175d8d729c0f276/pymongo-4.15.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:76a8d4de8dceb69f6e06736198ff6f7e1149515ef946f192ff2594d2cc98fc53", size = 2086587, upload-time = "2025-10-07T21:56:50.896Z" },
2012
+ { url = "https://files.pythonhosted.org/packages/ff/d5/e9ff16aa57f671349134475b904fd431e7b86e152b01a949aef4f254b2d5/pymongo-4.15.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:77353978be9fc9e5fe56369682efed0aac5f92a2a1570704d62b62a3c9e1a24f", size = 2070201, upload-time = "2025-10-07T21:56:52.425Z" },
2013
+ { url = "https://files.pythonhosted.org/packages/d6/a3/820772c0b2bbb671f253cfb0bede4cf694a38fb38134f3993d491e23ec11/pymongo-4.15.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9897a837677e3814873d0572f7e5d53c23ce18e274f3b5b87f05fb6eea22615b", size = 1985260, upload-time = "2025-10-07T21:56:54.56Z" },
2014
+ { url = "https://files.pythonhosted.org/packages/6e/7b/365ac821aefad7e8d36a4bc472a94429449aade1ccb7805d9ca754df5081/pymongo-4.15.3-cp313-cp313-win32.whl", hash = "sha256:d66da207ccb0d68c5792eaaac984a0d9c6c8ec609c6bcfa11193a35200dc5992", size = 938122, upload-time = "2025-10-07T21:56:55.993Z" },
2015
+ { url = "https://files.pythonhosted.org/packages/80/f3/5ca27e1765fa698c677771a1c0e042ef193e207c15f5d32a21fa5b13d8c3/pymongo-4.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:52f40c4b8c00bc53d4e357fe0de13d031c4cddb5d201e1a027db437e8d2887f8", size = 962610, upload-time = "2025-10-07T21:56:57.397Z" },
2016
+ { url = "https://files.pythonhosted.org/packages/48/7c/42f0b6997324023e94939f8f32b9a8dd928499f4b5d7b4412905368686b5/pymongo-4.15.3-cp313-cp313-win_arm64.whl", hash = "sha256:fb384623ece34db78d445dd578a52d28b74e8319f4d9535fbaff79d0eae82b3d", size = 944300, upload-time = "2025-10-07T21:56:58.969Z" },
2017
+ { url = "https://files.pythonhosted.org/packages/e7/a3/d8aaf9c243ce1319bd2498004a9acccfcfb35a3ef9851abb856993d95255/pymongo-4.15.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dcff15b9157c16bc796765d4d3d151df669322acfb0357e4c3ccd056153f0ff4", size = 1029873, upload-time = "2025-10-07T21:57:00.759Z" },
2018
+ { url = "https://files.pythonhosted.org/packages/64/10/91fd7791425ed3b56cbece6c23a36fb2696706a695655d8ea829e5e23c3a/pymongo-4.15.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1f681722c9f27e86c49c2e8a838e61b6ecf2285945fd1798bd01458134257834", size = 1029611, upload-time = "2025-10-07T21:57:02.488Z" },
2019
+ { url = "https://files.pythonhosted.org/packages/bb/9c/d9cf8d8a181f96877bca7bdec3e6ce135879d5e3d78694ea465833c53a3f/pymongo-4.15.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2c96dde79bdccd167b930a709875b0cd4321ac32641a490aebfa10bdcd0aa99b", size = 2211827, upload-time = "2025-10-07T21:57:03.907Z" },
2020
+ { url = "https://files.pythonhosted.org/packages/c2/40/12703964305216c155284100124222eaa955300a07d426c6e0ba3c9cbade/pymongo-4.15.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2d4ca446348d850ac4a5c3dc603485640ae2e7805dbb90765c3ba7d79129b37", size = 2264654, upload-time = "2025-10-07T21:57:05.41Z" },
2021
+ { url = "https://files.pythonhosted.org/packages/0f/70/bf3c18b5d0cae0b9714158b210b07b5891a875eb1c503271cfe045942fd3/pymongo-4.15.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7c0fd3de3a12ff0a8113a3f64cedb01f87397ab8eaaffa88d7f18ca66cd39385", size = 2371830, upload-time = "2025-10-07T21:57:06.9Z" },
2022
+ { url = "https://files.pythonhosted.org/packages/21/6d/2dfaed2ae66304ab842d56ed9a1bd2706ca0ecf97975b328a5eeceb2a4c0/pymongo-4.15.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e84dec392cf5f72d365e0aac73f627b0a3170193ebb038c3f7e7df11b7983ee7", size = 2351878, upload-time = "2025-10-07T21:57:08.92Z" },
2023
+ { url = "https://files.pythonhosted.org/packages/17/ed/fe46ff9adfa6dc11ad2e0694503adfc98f40583cfcc6db4dbaf582f0e357/pymongo-4.15.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d4b01a48369ea6d5bc83fea535f56279f806aa3e4991189f0477696dd736289", size = 2251356, upload-time = "2025-10-07T21:57:10.51Z" },
2024
+ { url = "https://files.pythonhosted.org/packages/12/c4/2e1a10b1e9bca9c106f2dc1b89d4ad70c63d387c194b3a1bfcca552b5a3f/pymongo-4.15.3-cp314-cp314-win32.whl", hash = "sha256:3561fa96c3123275ec5ccf919e595547e100c412ec0894e954aa0da93ecfdb9e", size = 992878, upload-time = "2025-10-07T21:57:12.119Z" },
2025
+ { url = "https://files.pythonhosted.org/packages/98/b5/14aa417a44ea86d4c31de83b26f6e6793f736cd60e7e7fda289ce5184bdf/pymongo-4.15.3-cp314-cp314-win_amd64.whl", hash = "sha256:9df2db6bd91b07400879b6ec89827004c0c2b55fc606bb62db93cafb7677c340", size = 1021209, upload-time = "2025-10-07T21:57:13.686Z" },
2026
+ { url = "https://files.pythonhosted.org/packages/94/9f/1097c6824fa50a4ffb11ba5194d2a9ef68d5509dd342e32ddb697d2efe4e/pymongo-4.15.3-cp314-cp314-win_arm64.whl", hash = "sha256:ff99864085d2c7f4bb672c7167680ceb7d273e9a93c1a8074c986a36dbb71cc6", size = 1000618, upload-time = "2025-10-07T21:57:15.212Z" },
2027
+ { url = "https://files.pythonhosted.org/packages/ad/31/37c76607a4f793f4491611741fa7a7c4238b956f48c4a9505cea0b5cf7ef/pymongo-4.15.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ffe217d2502f3fba4e2b0dc015ce3b34f157b66dfe96835aa64432e909dd0d95", size = 1086576, upload-time = "2025-10-07T21:57:16.742Z" },
2028
+ { url = "https://files.pythonhosted.org/packages/92/b2/6d17d279cdd293eeeb0c9d5baeb4f8cdebb45354fd81cfcef2d1c69303ab/pymongo-4.15.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:390c4954c774eda280898e73aea36482bf20cba3ecb958dbb86d6a68b9ecdd68", size = 1086656, upload-time = "2025-10-07T21:57:18.774Z" },
2029
+ { url = "https://files.pythonhosted.org/packages/55/fd/c5da8619beca207d7e6231f24ed269cb537c5311dad59fd9f2ef7d43204a/pymongo-4.15.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7dd2a49f088890ca08930bbf96121443b48e26b02b84ba0a3e1ae2bf2c5a9b48", size = 2531646, upload-time = "2025-10-07T21:57:20.63Z" },
2030
+ { url = "https://files.pythonhosted.org/packages/93/8f/66a7e12b874f41eb205f352b3a719e5a964b5ba103996f6ac45e80560111/pymongo-4.15.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f6feb678f26171f2a6b2cbb340949889154c7067972bd4cc129b62161474f08", size = 2603799, upload-time = "2025-10-07T21:57:22.591Z" },
2031
+ { url = "https://files.pythonhosted.org/packages/10/98/baf0d1f8016087500899cc4ae14e591f29b016c643e99ab332fcafe6f7bc/pymongo-4.15.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:446417a34ff6c2411ce3809e17ce9a67269c9f1cb4966b01e49e0c590cc3c6b3", size = 2725238, upload-time = "2025-10-07T21:57:24.091Z" },
2032
+ { url = "https://files.pythonhosted.org/packages/c9/a2/112d8d3882d6e842f501e166fbe08dfc2bc9a35f8773cbcaa804f7991043/pymongo-4.15.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cfa4a0a0f024a0336640e1201994e780a17bda5e6a7c0b4d23841eb9152e868b", size = 2704837, upload-time = "2025-10-07T21:57:25.626Z" },
2033
+ { url = "https://files.pythonhosted.org/packages/38/fe/043a9aac7b3fba5b8e216f48359bd18fdbe46a4d93b081786f773b25e997/pymongo-4.15.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b03db2fe37c950aff94b29ded5c349b23729bccd90a0a5907bbf807d8c77298", size = 2582294, upload-time = "2025-10-07T21:57:27.221Z" },
2034
+ { url = "https://files.pythonhosted.org/packages/5b/fe/7a6a6b331d9f2024ab171028ab53d5d9026959b1d713fe170be591a4d9a8/pymongo-4.15.3-cp314-cp314t-win32.whl", hash = "sha256:e7cde58ef6470c0da922b65e885fb1ffe04deef81e526bd5dea429290fa358ca", size = 1043993, upload-time = "2025-10-07T21:57:28.727Z" },
2035
+ { url = "https://files.pythonhosted.org/packages/70/c8/bc64321711e19bd48ea3371f0082f10295c433833245d73e7606d3b9afbe/pymongo-4.15.3-cp314-cp314t-win_amd64.whl", hash = "sha256:fae552767d8e5153ed498f1bca92d905d0d46311d831eefb0f06de38f7695c95", size = 1078481, upload-time = "2025-10-07T21:57:30.372Z" },
2036
+ { url = "https://files.pythonhosted.org/packages/39/31/2bb2003bb978eb25dfef7b5f98e1c2d4a86e973e63b367cc508a9308d31c/pymongo-4.15.3-cp314-cp314t-win_arm64.whl", hash = "sha256:47ffb068e16ae5e43580d5c4e3b9437f05414ea80c32a1e5cac44a835859c259", size = 1051179, upload-time = "2025-10-07T21:57:31.829Z" },
2037
+ ]
2038
+
2039
  [[package]]
2040
  name = "python-dateutil"
2041
  version = "2.9.0.post0"
 
2426
  dependencies = [
2427
  { name = "fastapi" },
2428
  { name = "flask" },
2429
+ { name = "flask-cors" },
2430
  { name = "gradio" },
2431
  { name = "langchain" },
2432
  { name = "langchain-community" },
 
2434
  { name = "langchain-groq" },
2435
  { name = "langgraph" },
2436
  { name = "langgraph-cli", extra = ["inmem"] },
2437
+ { name = "pymongo" },
2438
+ { name = "python-dotenv" },
2439
+ { name = "requests" },
2440
  { name = "streamlit" },
2441
  { name = "tavily-python" },
2442
  { name = "uuid" },
 
2448
  requires-dist = [
2449
  { name = "fastapi", specifier = ">=0.116.1" },
2450
  { name = "flask", specifier = ">=3.1.2" },
2451
+ { name = "flask-cors", specifier = ">=6.0.1" },
2452
  { name = "gradio", specifier = ">=5.49.1" },
2453
  { name = "langchain", specifier = ">=0.3.27" },
2454
  { name = "langchain-community", specifier = ">=0.3.27" },
 
2456
  { name = "langchain-groq", specifier = ">=0.3.7" },
2457
  { name = "langgraph", specifier = ">=0.6.6" },
2458
  { name = "langgraph-cli", extras = ["inmem"], specifier = ">=0.3.8" },
2459
+ { name = "pymongo", specifier = ">=4.15.3" },
2460
+ { name = "python-dotenv", specifier = ">=1.1.1" },
2461
+ { name = "requests", specifier = ">=2.32.5" },
2462
  { name = "streamlit", specifier = ">=1.48.1" },
2463
  { name = "tavily-python", specifier = ">=0.7.11" },
2464
  { name = "uuid", specifier = ">=1.30" },