semioz commited on
Commit
85b2bbc
·
1 Parent(s): 89836e0
Files changed (3) hide show
  1. agent.py +25 -33
  2. pyproject.toml +1 -0
  3. uv.lock +154 -0
agent.py CHANGED
@@ -8,15 +8,16 @@ from langchain_huggingface import (
8
  )
9
  from langgraph.graph import START, MessagesState, StateGraph
10
  from langgraph.prebuilt import ToolNode, tools_condition
11
- from langchain_community.vectorstores import DuckDB
12
  from langchain.tools.retriever import create_retriever_tool
13
- from langchain_core.documents import Document
14
- import uuid
15
 
16
  from tools import tools
 
17
 
18
  logger = logging.getLogger(__name__)
19
 
 
20
  # ----- Initializing vector store and retriever tool -------
21
 
22
  with open("system_prompt.txt", encoding="utf-8") as f:
@@ -29,6 +30,21 @@ embeddings = HuggingFaceEmbeddings(
29
  model_name="sentence-transformers/all-mpnet-base-v2"
30
  )
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  def build_graph(provider: str = "groq"):
33
  """Build the graph"""
34
  if provider == "groq":
@@ -45,17 +61,7 @@ def build_graph(provider: str = "groq"):
45
  )
46
  else:
47
  raise ValueError("Invalid provider. Choose 'groq' or 'huggingface'.")
48
- llm_with_tools = llm.bind_tools(tools)
49
-
50
- def convert_messages_to_documents(messages: list[HumanMessage]) -> list[Document]:
51
- return [
52
- Document(
53
- page_content=msg.content,
54
- metadata={"role": "user", "index": idx, "id": str(uuid.uuid4())}
55
- )
56
- for idx, msg in enumerate(messages)
57
- ]
58
-
59
 
60
  # Node
61
  def assistant(state: MessagesState):
@@ -64,26 +70,12 @@ def build_graph(provider: str = "groq"):
64
 
65
 
66
  def retriever(state: MessagesState):
67
- """Retriever node using DuckDB"""
68
- docs = convert_messages_to_documents(state["messages"])
69
- vector_store = DuckDB.from_documents(docs, embedding=embeddings)
70
-
71
- create_retriever_tool = create_retriever_tool(
72
- retriever=vector_store.as_retriever(),
73
- name="Question Search",
74
- description="A tool to retrieve similar questions from a vector store.",
75
  )
76
-
77
- query = state["messages"][0].content
78
- similar = vector_store.similarity_search(query)
79
-
80
- if similar:
81
- example_msg = HumanMessage(
82
- content=f"Here I provide a similar question and answer for reference: \n\n{similar[0].page_content}"
83
- )
84
- return {"messages": [sys_msg] + state["messages"] + [example_msg]}
85
- else:
86
- return {"messages": [sys_msg] + state["messages"]}
87
 
88
 
89
  builder = StateGraph(MessagesState)
 
8
  )
9
  from langgraph.graph import START, MessagesState, StateGraph
10
  from langgraph.prebuilt import ToolNode, tools_condition
11
+ from langchain_community.vectorstores import SupabaseVectorStore
12
  from langchain.tools.retriever import create_retriever_tool
13
+ from supabase.client import Client, create_client
 
14
 
15
  from tools import tools
16
+ import os
17
 
18
  logger = logging.getLogger(__name__)
19
 
20
+
21
  # ----- Initializing vector store and retriever tool -------
22
 
23
  with open("system_prompt.txt", encoding="utf-8") as f:
 
30
  model_name="sentence-transformers/all-mpnet-base-v2"
31
  )
32
 
33
+ supabase: Client = create_client(
34
+ os.environ.get("SUPABASE_URL"),
35
+ os.environ.get("SUPABASE_SERVICE_KEY"))
36
+ vector_store = SupabaseVectorStore(
37
+ client=supabase,
38
+ embedding= embeddings,
39
+ table_name="documents",
40
+ query_name="match_documents_langchain",
41
+ )
42
+ create_retriever_tool = create_retriever_tool(
43
+ retriever=vector_store.as_retriever(),
44
+ name="Question Search",
45
+ description="A tool to retrieve similar questions from a vector store.",
46
+ )
47
+
48
  def build_graph(provider: str = "groq"):
49
  """Build the graph"""
50
  if provider == "groq":
 
61
  )
62
  else:
63
  raise ValueError("Invalid provider. Choose 'groq' or 'huggingface'.")
64
+ llm_with_tools = llm.bind_tools(tools)
 
 
 
 
 
 
 
 
 
 
65
 
66
  # Node
67
  def assistant(state: MessagesState):
 
70
 
71
 
72
  def retriever(state: MessagesState):
73
+ """Retriever node"""
74
+ similar_question = vector_store.similarity_search(state["messages"][0].content)
75
+ example_msg = HumanMessage(
76
+ content=f"Here I provide a similar question and answer for reference: \n\n{similar_question[0].page_content}",
 
 
 
 
77
  )
78
+ return {"messages": [sys_msg] + state["messages"] + [example_msg]}
 
 
 
 
 
 
 
 
 
 
79
 
80
 
81
  builder = StateGraph(MessagesState)
pyproject.toml CHANGED
@@ -10,6 +10,7 @@ dependencies = [
10
  "langgraph>=0.5.4",
11
  "polars>=1.31.0",
12
  "pytesseract>=0.3.13",
 
13
  ]
14
 
15
  [tool.ruff.lint]
 
10
  "langgraph>=0.5.4",
11
  "polars>=1.31.0",
12
  "pytesseract>=0.3.13",
13
+ "supabase>=2.17.0",
14
  ]
15
 
16
  [tool.ruff.lint]
uv.lock CHANGED
@@ -309,6 +309,18 @@ wheels = [
309
  { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" },
310
  ]
311
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  [[package]]
313
  name = "distro"
314
  version = "1.9.0"
@@ -419,6 +431,20 @@ wheels = [
419
  { url = "https://files.pythonhosted.org/packages/2f/e0/014d5d9d7a4564cf1c40b5039bc882db69fd881111e03ab3657ac0b218e2/fsspec-2025.7.0-py3-none-any.whl", hash = "sha256:8b012e39f63c7d5f10474de957f3ab793b47b45ae7d39f2fb735f8bbe25c0e21", size = 199597, upload-time = "2025-07-15T16:05:19.529Z" },
420
  ]
421
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
422
  [[package]]
423
  name = "gradio"
424
  version = "5.38.1"
@@ -545,6 +571,19 @@ wheels = [
545
  { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
546
  ]
547
 
 
 
 
 
 
 
 
 
 
 
 
 
 
548
  [[package]]
549
  name = "hf-xet"
550
  version = "1.1.5"
@@ -560,6 +599,15 @@ wheels = [
560
  { url = "https://files.pythonhosted.org/packages/f0/55/ef77a85ee443ae05a9e9cba1c9f0dd9241eb42da2aeba1dc50f51154c81a/hf_xet-1.1.5-cp37-abi3-win_amd64.whl", hash = "sha256:73e167d9807d166596b4b2f0b585c6d5bd84a26dea32843665a8b58f6edba245", size = 2738931, upload-time = "2025-06-20T21:48:39.482Z" },
561
  ]
562
 
 
 
 
 
 
 
 
 
 
563
  [[package]]
564
  name = "httpcore"
565
  version = "1.0.9"
@@ -588,6 +636,11 @@ wheels = [
588
  { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
589
  ]
590
 
 
 
 
 
 
591
  [[package]]
592
  name = "httpx-sse"
593
  version = "0.4.1"
@@ -616,6 +669,15 @@ wheels = [
616
  { url = "https://files.pythonhosted.org/packages/33/d5/d9e9b75d8dc9cf125fff16fb0cd51d864a29e8b46b6880d8808940989405/huggingface_hub-0.33.5-py3-none-any.whl", hash = "sha256:29b4e64982c2064006021af297e1b17d44c85a8aaf90a0d7efeff7e7d2426296", size = 515705, upload-time = "2025-07-24T12:30:29.55Z" },
617
  ]
618
 
 
 
 
 
 
 
 
 
 
619
  [[package]]
620
  name = "idna"
621
  version = "3.10"
@@ -637,6 +699,7 @@ dependencies = [
637
  { name = "langgraph" },
638
  { name = "polars" },
639
  { name = "pytesseract" },
 
640
  ]
641
 
642
  [package.metadata]
@@ -648,6 +711,7 @@ requires-dist = [
648
  { name = "langgraph", specifier = ">=0.5.4" },
649
  { name = "polars", specifier = ">=1.31.0" },
650
  { name = "pytesseract", specifier = ">=0.3.13" },
 
651
  ]
652
 
653
  [[package]]
@@ -1224,6 +1288,20 @@ wheels = [
1224
  { url = "https://files.pythonhosted.org/packages/40/4b/0673a68ac4d6527fac951970e929c3b4440c654f994f0c957bd5556deb38/polars-1.31.0-cp39-abi3-win_arm64.whl", hash = "sha256:62ef23bb9d10dca4c2b945979f9a50812ac4ace4ed9e158a6b5d32a7322e6f75", size = 31469078, upload-time = "2025-06-18T11:59:59.242Z" },
1225
  ]
1226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1227
  [[package]]
1228
  name = "propcache"
1229
  version = "0.3.2"
@@ -1379,6 +1457,15 @@ wheels = [
1379
  { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
1380
  ]
1381
 
 
 
 
 
 
 
 
 
 
1382
  [[package]]
1383
  name = "pytesseract"
1384
  version = "0.3.13"
@@ -1457,6 +1544,20 @@ wheels = [
1457
  { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
1458
  ]
1459
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1460
  [[package]]
1461
  name = "requests"
1462
  version = "2.32.4"
@@ -1612,6 +1713,59 @@ wheels = [
1612
  { url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" },
1613
  ]
1614
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1615
  [[package]]
1616
  name = "tenacity"
1617
  version = "9.1.2"
 
309
  { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" },
310
  ]
311
 
312
+ [[package]]
313
+ name = "deprecation"
314
+ version = "2.1.0"
315
+ source = { registry = "https://pypi.org/simple" }
316
+ dependencies = [
317
+ { name = "packaging" },
318
+ ]
319
+ sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788, upload-time = "2020-04-20T14:23:38.738Z" }
320
+ wheels = [
321
+ { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178, upload-time = "2020-04-20T14:23:36.581Z" },
322
+ ]
323
+
324
  [[package]]
325
  name = "distro"
326
  version = "1.9.0"
 
431
  { url = "https://files.pythonhosted.org/packages/2f/e0/014d5d9d7a4564cf1c40b5039bc882db69fd881111e03ab3657ac0b218e2/fsspec-2025.7.0-py3-none-any.whl", hash = "sha256:8b012e39f63c7d5f10474de957f3ab793b47b45ae7d39f2fb735f8bbe25c0e21", size = 199597, upload-time = "2025-07-15T16:05:19.529Z" },
432
  ]
433
 
434
+ [[package]]
435
+ name = "gotrue"
436
+ version = "2.12.3"
437
+ source = { registry = "https://pypi.org/simple" }
438
+ dependencies = [
439
+ { name = "httpx", extra = ["http2"] },
440
+ { name = "pydantic" },
441
+ { name = "pyjwt" },
442
+ ]
443
+ sdist = { url = "https://files.pythonhosted.org/packages/fe/67/ae47f68daae1bbb56a9fbf960dfb7d08b3dec52a6ad1e96f69c2ba5b3116/gotrue-2.12.3.tar.gz", hash = "sha256:f874cf9d0b2f0335bfbd0d6e29e3f7aff79998cd1c14d2ad814db8c06cee3852", size = 38323, upload-time = "2025-07-04T06:50:03.941Z" }
444
+ wheels = [
445
+ { url = "https://files.pythonhosted.org/packages/42/fa/4165d298ef89254c9f742faa3f99a61fe6fd3552b4ba44df6924f8d307d7/gotrue-2.12.3-py3-none-any.whl", hash = "sha256:b1a3c6a5fe3f92e854a026c4c19de58706a96fd5fbdcc3d620b2802f6a46a26b", size = 44022, upload-time = "2025-07-04T06:50:02.591Z" },
446
+ ]
447
+
448
  [[package]]
449
  name = "gradio"
450
  version = "5.38.1"
 
571
  { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
572
  ]
573
 
574
+ [[package]]
575
+ name = "h2"
576
+ version = "4.2.0"
577
+ source = { registry = "https://pypi.org/simple" }
578
+ dependencies = [
579
+ { name = "hpack" },
580
+ { name = "hyperframe" },
581
+ ]
582
+ sdist = { url = "https://files.pythonhosted.org/packages/1b/38/d7f80fd13e6582fb8e0df8c9a653dcc02b03ca34f4d72f34869298c5baf8/h2-4.2.0.tar.gz", hash = "sha256:c8a52129695e88b1a0578d8d2cc6842bbd79128ac685463b887ee278126ad01f", size = 2150682, upload-time = "2025-02-02T07:43:51.815Z" }
583
+ wheels = [
584
+ { url = "https://files.pythonhosted.org/packages/d0/9e/984486f2d0a0bd2b024bf4bc1c62688fcafa9e61991f041fb0e2def4a982/h2-4.2.0-py3-none-any.whl", hash = "sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0", size = 60957, upload-time = "2025-02-01T11:02:26.481Z" },
585
+ ]
586
+
587
  [[package]]
588
  name = "hf-xet"
589
  version = "1.1.5"
 
599
  { url = "https://files.pythonhosted.org/packages/f0/55/ef77a85ee443ae05a9e9cba1c9f0dd9241eb42da2aeba1dc50f51154c81a/hf_xet-1.1.5-cp37-abi3-win_amd64.whl", hash = "sha256:73e167d9807d166596b4b2f0b585c6d5bd84a26dea32843665a8b58f6edba245", size = 2738931, upload-time = "2025-06-20T21:48:39.482Z" },
600
  ]
601
 
602
+ [[package]]
603
+ name = "hpack"
604
+ version = "4.1.0"
605
+ source = { registry = "https://pypi.org/simple" }
606
+ sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" }
607
+ wheels = [
608
+ { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" },
609
+ ]
610
+
611
  [[package]]
612
  name = "httpcore"
613
  version = "1.0.9"
 
636
  { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
637
  ]
638
 
639
+ [package.optional-dependencies]
640
+ http2 = [
641
+ { name = "h2" },
642
+ ]
643
+
644
  [[package]]
645
  name = "httpx-sse"
646
  version = "0.4.1"
 
669
  { url = "https://files.pythonhosted.org/packages/33/d5/d9e9b75d8dc9cf125fff16fb0cd51d864a29e8b46b6880d8808940989405/huggingface_hub-0.33.5-py3-none-any.whl", hash = "sha256:29b4e64982c2064006021af297e1b17d44c85a8aaf90a0d7efeff7e7d2426296", size = 515705, upload-time = "2025-07-24T12:30:29.55Z" },
670
  ]
671
 
672
+ [[package]]
673
+ name = "hyperframe"
674
+ version = "6.1.0"
675
+ source = { registry = "https://pypi.org/simple" }
676
+ sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" }
677
+ wheels = [
678
+ { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" },
679
+ ]
680
+
681
  [[package]]
682
  name = "idna"
683
  version = "3.10"
 
699
  { name = "langgraph" },
700
  { name = "polars" },
701
  { name = "pytesseract" },
702
+ { name = "supabase" },
703
  ]
704
 
705
  [package.metadata]
 
711
  { name = "langgraph", specifier = ">=0.5.4" },
712
  { name = "polars", specifier = ">=1.31.0" },
713
  { name = "pytesseract", specifier = ">=0.3.13" },
714
+ { name = "supabase", specifier = ">=2.17.0" },
715
  ]
716
 
717
  [[package]]
 
1288
  { url = "https://files.pythonhosted.org/packages/40/4b/0673a68ac4d6527fac951970e929c3b4440c654f994f0c957bd5556deb38/polars-1.31.0-cp39-abi3-win_arm64.whl", hash = "sha256:62ef23bb9d10dca4c2b945979f9a50812ac4ace4ed9e158a6b5d32a7322e6f75", size = 31469078, upload-time = "2025-06-18T11:59:59.242Z" },
1289
  ]
1290
 
1291
+ [[package]]
1292
+ name = "postgrest"
1293
+ version = "1.1.1"
1294
+ source = { registry = "https://pypi.org/simple" }
1295
+ dependencies = [
1296
+ { name = "deprecation" },
1297
+ { name = "httpx", extra = ["http2"] },
1298
+ { name = "pydantic" },
1299
+ ]
1300
+ sdist = { url = "https://files.pythonhosted.org/packages/6e/3e/1b50568e1f5db0bdced4a82c7887e37326585faef7ca43ead86849cb4861/postgrest-1.1.1.tar.gz", hash = "sha256:f3bb3e8c4602775c75c844a31f565f5f3dd584df4d36d683f0b67d01a86be322", size = 15431, upload-time = "2025-06-23T19:21:34.742Z" }
1301
+ wheels = [
1302
+ { url = "https://files.pythonhosted.org/packages/a4/71/188a50ea64c17f73ff4df5196ec1553a8f1723421eb2d1069c73bab47d78/postgrest-1.1.1-py3-none-any.whl", hash = "sha256:98a6035ee1d14288484bfe36235942c5fb2d26af6d8120dfe3efbe007859251a", size = 22366, upload-time = "2025-06-23T19:21:33.637Z" },
1303
+ ]
1304
+
1305
  [[package]]
1306
  name = "propcache"
1307
  version = "0.3.2"
 
1457
  { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
1458
  ]
1459
 
1460
+ [[package]]
1461
+ name = "pyjwt"
1462
+ version = "2.10.1"
1463
+ source = { registry = "https://pypi.org/simple" }
1464
+ sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" }
1465
+ wheels = [
1466
+ { 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" },
1467
+ ]
1468
+
1469
  [[package]]
1470
  name = "pytesseract"
1471
  version = "0.3.13"
 
1544
  { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
1545
  ]
1546
 
1547
+ [[package]]
1548
+ name = "realtime"
1549
+ version = "2.6.0"
1550
+ source = { registry = "https://pypi.org/simple" }
1551
+ dependencies = [
1552
+ { name = "pydantic" },
1553
+ { name = "typing-extensions" },
1554
+ { name = "websockets" },
1555
+ ]
1556
+ sdist = { url = "https://files.pythonhosted.org/packages/fc/a8/83a691e9fd8f8724dac98948608371442ffb3ee4818130337ac400bd0415/realtime-2.6.0.tar.gz", hash = "sha256:f68743cff85d3113659fa19835a868674e720465649bf833e1cd47d7da0f7bbd", size = 18372, upload-time = "2025-07-10T19:51:44.399Z" }
1557
+ wheels = [
1558
+ { url = "https://files.pythonhosted.org/packages/46/a3/8a49cd4764cb96101d8b3374502dbc9a84f687a12f09e2af28d52035ebcd/realtime-2.6.0-py3-none-any.whl", hash = "sha256:a0512d71044c2621455bc87d1c171739967edc161381994de54e0989ca6c348e", size = 21803, upload-time = "2025-07-10T19:51:42.922Z" },
1559
+ ]
1560
+
1561
  [[package]]
1562
  name = "requests"
1563
  version = "2.32.4"
 
1713
  { url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" },
1714
  ]
1715
 
1716
+ [[package]]
1717
+ name = "storage3"
1718
+ version = "0.12.0"
1719
+ source = { registry = "https://pypi.org/simple" }
1720
+ dependencies = [
1721
+ { name = "deprecation" },
1722
+ { name = "httpx", extra = ["http2"] },
1723
+ { name = "python-dateutil" },
1724
+ ]
1725
+ sdist = { url = "https://files.pythonhosted.org/packages/c5/86/9eae84e8ad4ba73f575f3eaf5536d949f2fd7d6adc85829f9af04bce97e2/storage3-0.12.0.tar.gz", hash = "sha256:94243f20922d57738bf42e96b9f5582b4d166e8bf209eccf20b146909f3f71b0", size = 10024, upload-time = "2025-06-19T17:50:51.763Z" }
1726
+ wheels = [
1727
+ { url = "https://files.pythonhosted.org/packages/b0/7e/693d6d603db142eb5e6f3cb76eb6e9c439582b7539e2695e175e2de3ac44/storage3-0.12.0-py3-none-any.whl", hash = "sha256:1c4585693ca42243ded1512b58e54c697111e91a20916cd14783eebc37e7c87d", size = 18422, upload-time = "2025-06-19T17:50:50.294Z" },
1728
+ ]
1729
+
1730
+ [[package]]
1731
+ name = "strenum"
1732
+ version = "0.4.15"
1733
+ source = { registry = "https://pypi.org/simple" }
1734
+ sdist = { url = "https://files.pythonhosted.org/packages/85/ad/430fb60d90e1d112a62ff57bdd1f286ec73a2a0331272febfddd21f330e1/StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff", size = 23384, upload-time = "2023-06-29T22:02:58.399Z" }
1735
+ wheels = [
1736
+ { url = "https://files.pythonhosted.org/packages/81/69/297302c5f5f59c862faa31e6cb9a4cd74721cd1e052b38e464c5b402df8b/StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659", size = 8851, upload-time = "2023-06-29T22:02:56.947Z" },
1737
+ ]
1738
+
1739
+ [[package]]
1740
+ name = "supabase"
1741
+ version = "2.17.0"
1742
+ source = { registry = "https://pypi.org/simple" }
1743
+ dependencies = [
1744
+ { name = "gotrue" },
1745
+ { name = "httpx" },
1746
+ { name = "postgrest" },
1747
+ { name = "realtime" },
1748
+ { name = "storage3" },
1749
+ { name = "supafunc" },
1750
+ ]
1751
+ sdist = { url = "https://files.pythonhosted.org/packages/9d/e6/1f2ab6be273897d097574e792a2f9e469e21a604d9fe0ae4fb5925c4248e/supabase-2.17.0.tar.gz", hash = "sha256:3207314b540db7e3339fa2500bd977541517afb4d20b7ff93a89b97a05f9df38", size = 14710, upload-time = "2025-07-17T23:55:22.588Z" }
1752
+ wheels = [
1753
+ { url = "https://files.pythonhosted.org/packages/be/6a/e6f2bd8960d4a6baaa54b0c5ea514f6131af5eb533ffe3aeb08ebc47eb4a/supabase-2.17.0-py3-none-any.whl", hash = "sha256:2dd804fae8850cebccc9ab8711c2ee9e2f009e847f4c95c092a4423778e3c3f6", size = 17771, upload-time = "2025-07-17T23:55:19.976Z" },
1754
+ ]
1755
+
1756
+ [[package]]
1757
+ name = "supafunc"
1758
+ version = "0.10.1"
1759
+ source = { registry = "https://pypi.org/simple" }
1760
+ dependencies = [
1761
+ { name = "httpx", extra = ["http2"] },
1762
+ { name = "strenum" },
1763
+ ]
1764
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/4b/16f94bcae8a49f5e09544a4fb0e6ad1c2288038036cefdeedb72fcffd92c/supafunc-0.10.1.tar.gz", hash = "sha256:a5b33c8baecb6b5297d25da29a2503e2ec67ee6986f3d44c137e651b8a59a17d", size = 5036, upload-time = "2025-06-23T18:26:50.327Z" }
1765
+ wheels = [
1766
+ { url = "https://files.pythonhosted.org/packages/76/4a/9cbea12d86a741d4e73a6e278c2b1d6479fb03d1002efb00e8e71aea76db/supafunc-0.10.1-py3-none-any.whl", hash = "sha256:26df9bd25ff2ef56cb5bfb8962de98f43331f7f8ff69572bac3ed9c3a9672040", size = 8028, upload-time = "2025-06-23T18:26:49.176Z" },
1767
+ ]
1768
+
1769
  [[package]]
1770
  name = "tenacity"
1771
  version = "9.1.2"