mbudisic commited on
Commit
86d2982
Β·
1 Parent(s): c14216b

tidy: ruff autofixes

Browse files
TODO.md CHANGED
@@ -1,6 +1,5 @@
1
  # πŸ“ TODOs in Codebase
2
 
3
- - `./app.py:251:# TODO: Clean up imports.`
4
- - `./app.py:254:# TODO: This should be fixed - new comment`
5
 
6
  Keep up the great work! πŸš€
 
1
  # πŸ“ TODOs in Codebase
2
 
3
+ - `./app.py:245:# TODO: Clean up imports.`
 
4
 
5
  Keep up the great work! πŸš€
app.py CHANGED
@@ -1,26 +1,22 @@
1
- from pstuts_rag.configuration import Configuration
2
  import asyncio
3
- from typing import cast
4
  import signal
 
5
  from datetime import datetime
 
 
6
 
7
  import chainlit as cl
 
 
8
  from dotenv import load_dotenv
9
-
10
- from langgraph.checkpoint.memory import MemorySaver
11
-
12
  from langchain_core.runnables import Runnable
 
13
 
 
14
  from pstuts_rag.datastore import Datastore
15
  from pstuts_rag.nodes import FinalAnswer, TutorialState, initialize
16
-
17
- import nest_asyncio
18
- from uuid import uuid4
19
-
20
- import logging
21
-
22
  from pstuts_rag.utils import get_unique
23
- import httpx
24
 
25
  # Track the single active session
26
  active_session = {"id": None, "timestamp": None}
@@ -113,7 +109,7 @@ def format_video_reference(doc: Document):
113
  display="side",
114
  )
115
  video_message = cl.Message(
116
- content=f'πŸ“Ό Watch {video_link.name} (_@ {v["start_min"]}_)', # text has to include video name
117
  elements=[video_link],
118
  )
119
 
@@ -246,14 +242,9 @@ class ChainlitCallbackHandler(BaseCallbackHandler):
246
  print(f"Error in on_chain_error: {e}")
247
 
248
 
249
- import time
250
-
251
  # TODO: Clean up imports.
252
 
253
 
254
- # TODO: This should be fixed - new comment
255
-
256
-
257
  @cl.on_message
258
  async def main(input_message: cl.Message):
259
  """
 
 
1
  import asyncio
2
+ import logging
3
  import signal
4
+ import time
5
  from datetime import datetime
6
+ from typing import cast
7
+ from uuid import uuid4
8
 
9
  import chainlit as cl
10
+ import httpx
11
+ import nest_asyncio
12
  from dotenv import load_dotenv
 
 
 
13
  from langchain_core.runnables import Runnable
14
+ from langgraph.checkpoint.memory import MemorySaver
15
 
16
+ from pstuts_rag.configuration import Configuration
17
  from pstuts_rag.datastore import Datastore
18
  from pstuts_rag.nodes import FinalAnswer, TutorialState, initialize
 
 
 
 
 
 
19
  from pstuts_rag.utils import get_unique
 
20
 
21
  # Track the single active session
22
  active_session = {"id": None, "timestamp": None}
 
109
  display="side",
110
  )
111
  video_message = cl.Message(
112
+ content=f"πŸ“Ό Watch {video_link.name} (_@ {v['start_min']}_)", # text has to include video name
113
  elements=[video_link],
114
  )
115
 
 
242
  print(f"Error in on_chain_error: {e}")
243
 
244
 
 
 
245
  # TODO: Clean up imports.
246
 
247
 
 
 
 
248
  @cl.on_message
249
  async def main(input_message: cl.Message):
250
  """
pstuts_rag/pstuts_rag/datastore.py CHANGED
@@ -1,32 +1,26 @@
1
  import asyncio
2
  import atexit
3
- import json
4
  import glob
5
- import aiofiles
6
- from pathlib import Path
7
- from typing import List, Dict, Iterator, Any, Callable, Optional, Self
8
- import uuid
9
  import logging
10
  import threading
 
 
11
 
 
12
  import chainlit as cl
13
- from langchain_core.document_loaders import BaseLoader
14
- from langchain_experimental.text_splitter import SemanticChunker
15
- from langchain_huggingface import HuggingFaceEmbeddings
16
- from langchain_openai.embeddings import OpenAIEmbeddings
17
- from langchain_ollama.embeddings import OllamaEmbeddings
18
  from langchain_core.documents import Document
19
  from langchain_core.embeddings import Embeddings
20
-
21
  from langchain_core.vectorstores import VectorStoreRetriever
22
-
23
  from langchain_qdrant import QdrantVectorStore
24
- from pstuts_rag.configuration import Configuration, ModelAPI
25
  from qdrant_client import QdrantClient
26
  from qdrant_client.http.models import Distance, VectorParams
27
  from qdrant_client.models import PointStruct
28
- from pstuts_rag.utils import get_embeddings_api, flatten, batch
29
- from pathvalidate import sanitize_filename, sanitize_filepath
 
30
 
31
 
32
  class QdrantClientSingleton:
 
1
  import asyncio
2
  import atexit
 
3
  import glob
4
+ import json
 
 
 
5
  import logging
6
  import threading
7
+ from pathlib import Path
8
+ from typing import Any, Callable, Dict, Iterator, List, Optional, Self
9
 
10
+ import aiofiles
11
  import chainlit as cl
 
 
 
 
 
12
  from langchain_core.documents import Document
13
  from langchain_core.embeddings import Embeddings
 
14
  from langchain_core.vectorstores import VectorStoreRetriever
15
+ from langchain_experimental.text_splitter import SemanticChunker
16
  from langchain_qdrant import QdrantVectorStore
17
+ from pathvalidate import sanitize_filename, sanitize_filepath
18
  from qdrant_client import QdrantClient
19
  from qdrant_client.http.models import Distance, VectorParams
20
  from qdrant_client.models import PointStruct
21
+
22
+ from pstuts_rag.configuration import Configuration
23
+ from pstuts_rag.utils import batch, flatten, get_embeddings_api
24
 
25
 
26
  class QdrantClientSingleton:
pstuts_rag/pstuts_rag/evaluator_utils.py CHANGED
@@ -1,20 +1,17 @@
 
1
  import uuid
2
- import pandas as pd
3
- import numpy as np
4
  from functools import partial
5
- from ragas import EvaluationDataset
6
- from langchain_core.runnables import Runnable
7
- from typing import Set, Tuple, Dict, List
8
- from sklearn.model_selection import train_test_split
9
  import bidict
10
- from typing import Mapping
11
- from itertools import chain
12
- import asyncio
13
- from typing import Optional
14
- from tqdm import tqdm
15
- from .datastore import batch
16
  import numpy as np
 
 
 
17
  from scipy.stats import norm
 
 
 
18
 
19
 
20
  async def apply_rag_chain_inplace(
 
1
+ import asyncio
2
  import uuid
 
 
3
  from functools import partial
4
+ from typing import Dict, Mapping, Set, Tuple
5
+
 
 
6
  import bidict
 
 
 
 
 
 
7
  import numpy as np
8
+ import pandas as pd
9
+ from langchain_core.runnables import Runnable
10
+ from ragas import EvaluationDataset
11
  from scipy.stats import norm
12
+ from sklearn.model_selection import train_test_split
13
+
14
+ from .datastore import batch
15
 
16
 
17
  async def apply_rag_chain_inplace(
pstuts_rag/pstuts_rag/nodes.py CHANGED
@@ -1,32 +1,27 @@
1
  # nodes.py
2
- from enum import Enum
3
- from typing import Annotated, Any, Callable, Dict, Literal, Tuple, Union
4
- import functools
5
  import asyncio
6
- import os
7
  import logging
8
  import operator
9
- from langchain_openai import ChatOpenAI
10
- from langgraph.graph import StateGraph, MessagesState, START, END
11
- from langgraph.types import Command
 
 
12
  from langchain_core.documents import Document
 
13
  from langchain_core.runnables import RunnableConfig
14
- from langchain_core.messages import HumanMessage, AIMessage, BaseMessage
15
- from langgraph.checkpoint.memory import MemorySaver
16
- from numpy import add
17
- from langchain_community.tools.tavily_search import TavilySearchResults
18
  from langchain_tavily import TavilyExtract
19
-
20
- from pydantic import BaseModel, Field, HttpUrl
21
-
22
- from langgraph.types import interrupt
23
  from langgraph.checkpoint.memory import MemorySaver
 
 
 
24
 
25
- from pstuts_rag.utils import get_chat_api, get_title_streaming
26
  from pstuts_rag.configuration import Configuration
27
  from pstuts_rag.datastore import Datastore
28
  from pstuts_rag.prompts import NODE_PROMPTS
29
  from pstuts_rag.rag_for_transcripts import create_transcript_rag_chain
 
30
 
31
 
32
  class YesNoAsk(Enum):
 
1
  # nodes.py
 
 
 
2
  import asyncio
3
+ import functools
4
  import logging
5
  import operator
6
+ import os
7
+ from enum import Enum
8
+ from typing import Annotated, Dict, Literal, Tuple
9
+
10
+ from langchain_community.tools.tavily_search import TavilySearchResults
11
  from langchain_core.documents import Document
12
+ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
13
  from langchain_core.runnables import RunnableConfig
 
 
 
 
14
  from langchain_tavily import TavilyExtract
 
 
 
 
15
  from langgraph.checkpoint.memory import MemorySaver
16
+ from langgraph.graph import END, START, MessagesState, StateGraph
17
+ from langgraph.types import interrupt
18
+ from pydantic import BaseModel, Field, HttpUrl
19
 
 
20
  from pstuts_rag.configuration import Configuration
21
  from pstuts_rag.datastore import Datastore
22
  from pstuts_rag.prompts import NODE_PROMPTS
23
  from pstuts_rag.rag_for_transcripts import create_transcript_rag_chain
24
+ from pstuts_rag.utils import get_chat_api, get_title_streaming
25
 
26
 
27
  class YesNoAsk(Enum):
pstuts_rag/pstuts_rag/rag_for_transcripts.py CHANGED
@@ -1,28 +1,24 @@
1
- import functools
2
  import json
3
- import asyncio
4
- from operator import itemgetter
5
- from typing import Any, Dict, Union, Optional, Callable
6
- import logging
7
  import re
 
 
8
 
9
  from langchain.prompts import ChatPromptTemplate
10
  from langchain_core.messages import AIMessage
11
  from langchain_core.runnables import (
12
  Runnable,
13
- RunnableParallel,
14
- RunnablePassthrough,
15
  RunnableConfig,
16
  RunnableLambda,
 
 
17
  )
18
  from langchain_openai import ChatOpenAI
19
- from langchain_huggingface import ChatHuggingFace
20
- from langchain_ollama import ChatOllama
 
21
 
22
  from .datastore import Datastore
23
  from .prompts import RAG_PROMPT_TEMPLATES
24
- from pstuts_rag.utils import ChatAPISelector
25
- from pstuts_rag.configuration import Configuration, ModelAPI
26
 
27
 
28
  def post_process_response(
@@ -57,11 +53,6 @@ def post_process_response(
57
  if configurable.eva_strip_think
58
  else answer.content
59
  )
60
- # Only append references if the model provided a substantive answer
61
- # if "I don't know" not in answer.content:
62
- # text_w_references = "\n".join(
63
- # [str(text_w_references), "**REFERENCES**", references]
64
- # )
65
 
66
  if "I don't know." in answer_text:
67
  attachments = []
 
 
1
  import json
 
 
 
 
2
  import re
3
+ from operator import itemgetter
4
+ from typing import Any, Dict
5
 
6
  from langchain.prompts import ChatPromptTemplate
7
  from langchain_core.messages import AIMessage
8
  from langchain_core.runnables import (
9
  Runnable,
 
 
10
  RunnableConfig,
11
  RunnableLambda,
12
+ RunnableParallel,
13
+ RunnablePassthrough,
14
  )
15
  from langchain_openai import ChatOpenAI
16
+
17
+ from pstuts_rag.configuration import Configuration
18
+ from pstuts_rag.utils import ChatAPISelector
19
 
20
  from .datastore import Datastore
21
  from .prompts import RAG_PROMPT_TEMPLATES
 
 
22
 
23
 
24
  def post_process_response(
 
53
  if configurable.eva_strip_think
54
  else answer.content
55
  )
 
 
 
 
 
56
 
57
  if "I don't know." in answer_text:
58
  attachments = []
pstuts_rag/pstuts_rag/state.py CHANGED
@@ -1,8 +1,8 @@
1
- from pydantic import BaseModel, Field
2
- from langchain_core.messages import BaseMessage
3
- from typing import List, Optional, Tuple, Dict, Annotated
4
-
5
  import operator
 
 
 
 
6
 
7
 
8
  class PsTutsTeamState(BaseModel):
 
 
 
 
 
1
  import operator
2
+ from typing import Annotated, Dict, List, Optional, Tuple
3
+
4
+ from langchain_core.messages import BaseMessage
5
+ from pydantic import BaseModel, Field
6
 
7
 
8
  class PsTutsTeamState(BaseModel):
pstuts_rag/pstuts_rag/utils.py CHANGED
@@ -1,27 +1,16 @@
1
- from typing import Dict, List, Type, Any, Iterator
2
-
3
- from langchain_openai import ChatOpenAI
4
- from langchain_openai.embeddings import OpenAIEmbeddings
5
-
6
- from langchain_huggingface import ChatHuggingFace
7
- from langchain_huggingface import HuggingFaceEmbeddings
8
 
 
 
 
9
  from langchain_ollama import ChatOllama
10
  from langchain_ollama.embeddings import OllamaEmbeddings
 
 
11
 
12
  from pstuts_rag.configuration import ModelAPI
13
- import logging
14
-
15
- from contextvars import ContextVar
16
- from functools import wraps
17
- from typing import Callable, Optional
18
- import time
19
- import traceback
20
-
21
-
22
- import requests
23
- import re
24
- from bs4 import BeautifulSoup
25
 
26
  # Chat model selector dictionary
27
  ChatAPISelector: Dict[
 
1
+ import logging
2
+ import re
3
+ from typing import Any, Dict, Iterator, List, Type
 
 
 
 
4
 
5
+ import requests
6
+ from bs4 import BeautifulSoup
7
+ from langchain_huggingface import ChatHuggingFace, HuggingFaceEmbeddings
8
  from langchain_ollama import ChatOllama
9
  from langchain_ollama.embeddings import OllamaEmbeddings
10
+ from langchain_openai import ChatOpenAI
11
+ from langchain_openai.embeddings import OpenAIEmbeddings
12
 
13
  from pstuts_rag.configuration import ModelAPI
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
  # Chat model selector dictionary
16
  ChatAPISelector: Dict[
pyproject.toml CHANGED
@@ -53,8 +53,6 @@ dependencies = [
53
  "beautifulsoup4>=4.13.4",
54
  "pathvalidate>=3.2.3",
55
  "pydantic-settings>=2.9.1",
56
- "flake8-todos>=0.3.1",
57
- "ruff>=0.11.0",
58
  ]
59
  authors = [{ name = "Marko Budisic", email = "mbudisic@gmail.com" }]
60
  license = "MIT"
@@ -70,13 +68,11 @@ packages = ["pstuts_rag/pstuts_rag"]
70
  dev = [
71
  "pytest>=7.0.0",
72
  "black>=22.0.0",
73
- "flake8>=4.0.0",
74
- "flake8-todos>=0.3.1",
75
  "mypy>=0.900",
76
- "isort>=6.0.1",
77
  "pylint-venv>=3.0.4",
78
  "ipdb>=0.13.13",
79
  "deptry>=0.23.0",
 
80
  ]
81
 
82
  web = [
@@ -92,13 +88,12 @@ line-length = 79
92
  target-version = "py311"
93
 
94
  [tool.ruff.lint]
95
- select = ["E", "F", "I", "N", "W"]
96
- extend-select = ["TD"]
97
- ignore = []
98
- task-tags = ["TODO", "FIXME", "BUG", "HACK", "XXX"]
 
99
 
100
- [tool.ruff.isort]
101
- known-first-party = ["src"]
102
 
103
  [tool.black]
104
  line-length = 79
 
53
  "beautifulsoup4>=4.13.4",
54
  "pathvalidate>=3.2.3",
55
  "pydantic-settings>=2.9.1",
 
 
56
  ]
57
  authors = [{ name = "Marko Budisic", email = "mbudisic@gmail.com" }]
58
  license = "MIT"
 
68
  dev = [
69
  "pytest>=7.0.0",
70
  "black>=22.0.0",
 
 
71
  "mypy>=0.900",
 
72
  "pylint-venv>=3.0.4",
73
  "ipdb>=0.13.13",
74
  "deptry>=0.23.0",
75
+ "ruff"
76
  ]
77
 
78
  web = [
 
88
  target-version = "py311"
89
 
90
  [tool.ruff.lint]
91
+ select = ["E", "F", "I", "N", "W", "TD"]
92
+ fixable = ["I", "E", "F", "W", "B"]
93
+
94
+ [tool.ruff.lint.isort]
95
+ known-first-party = ["pstuts_rag"]
96
 
 
 
97
 
98
  [tool.black]
99
  line-length = 79
uv.lock CHANGED
@@ -781,33 +781,6 @@ wheels = [
781
  { url = "https://files.pythonhosted.org/packages/18/79/1b8fa1bb3568781e84c9200f951c735f3f157429f44be0495da55894d620/filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25", size = 19970 },
782
  ]
783
 
784
- [[package]]
785
- name = "flake8"
786
- version = "7.2.0"
787
- source = { registry = "https://pypi.org/simple" }
788
- dependencies = [
789
- { name = "mccabe" },
790
- { name = "pycodestyle" },
791
- { name = "pyflakes" },
792
- ]
793
- sdist = { url = "https://files.pythonhosted.org/packages/e7/c4/5842fc9fc94584c455543540af62fd9900faade32511fab650e9891ec225/flake8-7.2.0.tar.gz", hash = "sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426", size = 48177 }
794
- wheels = [
795
- { url = "https://files.pythonhosted.org/packages/83/5c/0627be4c9976d56b1217cb5187b7504e7fd7d3503f8bfd312a04077bd4f7/flake8-7.2.0-py2.py3-none-any.whl", hash = "sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343", size = 57786 },
796
- ]
797
-
798
- [[package]]
799
- name = "flake8-todos"
800
- version = "0.3.1"
801
- source = { registry = "https://pypi.org/simple" }
802
- dependencies = [
803
- { name = "flake8" },
804
- { name = "pycodestyle" },
805
- ]
806
- sdist = { url = "https://files.pythonhosted.org/packages/88/69/e4ecde7f50c3c874046f03dc7bda67d7be8e7cc28380f3f44c07456b45ad/flake8_todos-0.3.1.tar.gz", hash = "sha256:942101a08f831d7d9f7d864d86169f3bcfaf8b6d56a004c0280eb51725266b16", size = 7851 }
807
- wheels = [
808
- { url = "https://files.pythonhosted.org/packages/ba/8e/805907f920d171eda033ac825d23595072a1c04dd716106c8bc8ec9eec9e/flake8_todos-0.3.1-py3-none-any.whl", hash = "sha256:0b4faca80bec49be7bf8e5dd46eec12f619e09cecac8a84a87775272300222b2", size = 7358 },
809
- ]
810
-
811
  [[package]]
812
  name = "forbiddenfruit"
813
  version = "0.1.4"
@@ -1307,15 +1280,6 @@ wheels = [
1307
  { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 },
1308
  ]
1309
 
1310
- [[package]]
1311
- name = "isort"
1312
- version = "6.0.1"
1313
- source = { registry = "https://pypi.org/simple" }
1314
- sdist = { url = "https://files.pythonhosted.org/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955 }
1315
- wheels = [
1316
- { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186 },
1317
- ]
1318
-
1319
  [[package]]
1320
  name = "jedi"
1321
  version = "0.19.2"
@@ -2208,15 +2172,6 @@ wheels = [
2208
  { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
2209
  ]
2210
 
2211
- [[package]]
2212
- name = "mccabe"
2213
- version = "0.7.0"
2214
- source = { registry = "https://pypi.org/simple" }
2215
- sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658 }
2216
- wheels = [
2217
- { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 },
2218
- ]
2219
-
2220
  [[package]]
2221
  name = "mcp"
2222
  version = "1.9.2"
@@ -3756,7 +3711,6 @@ dependencies = [
3756
  { name = "bidict" },
3757
  { name = "chainlit" },
3758
  { name = "datasets" },
3759
- { name = "flake8-todos" },
3760
  { name = "google" },
3761
  { name = "ipykernel" },
3762
  { name = "ipywidgets" },
@@ -3785,7 +3739,6 @@ dependencies = [
3785
  { name = "qdrant-client" },
3786
  { name = "ragas" },
3787
  { name = "requests" },
3788
- { name = "ruff" },
3789
  { name = "scikit-learn" },
3790
  { name = "scipy" },
3791
  { name = "sentence-transformers" },
@@ -3802,13 +3755,11 @@ dependencies = [
3802
  dev = [
3803
  { name = "black" },
3804
  { name = "deptry" },
3805
- { name = "flake8" },
3806
- { name = "flake8-todos" },
3807
  { name = "ipdb" },
3808
- { name = "isort" },
3809
  { name = "mypy" },
3810
  { name = "pylint-venv" },
3811
  { name = "pytest" },
 
3812
  ]
3813
  web = [
3814
  { name = "fastapi" },
@@ -3828,15 +3779,11 @@ requires-dist = [
3828
  { name = "datasets", specifier = ">=3.6.0" },
3829
  { name = "deptry", marker = "extra == 'dev'", specifier = ">=0.23.0" },
3830
  { name = "fastapi", marker = "extra == 'web'", specifier = ">=0.115.3,<0.116" },
3831
- { name = "flake8", marker = "extra == 'dev'", specifier = ">=4.0.0" },
3832
- { name = "flake8-todos", specifier = ">=0.3.1" },
3833
- { name = "flake8-todos", marker = "extra == 'dev'", specifier = ">=0.3.1" },
3834
  { name = "google", specifier = ">=3.0.0" },
3835
  { name = "httpx", marker = "extra == 'web'", specifier = "==0.27.0" },
3836
  { name = "ipdb", marker = "extra == 'dev'", specifier = ">=0.13.13" },
3837
  { name = "ipykernel", specifier = ">=6.29.5" },
3838
  { name = "ipywidgets", specifier = ">=8.1.7" },
3839
- { name = "isort", marker = "extra == 'dev'", specifier = ">=6.0.1" },
3840
  { name = "jupyter", specifier = ">=1.1.1" },
3841
  { name = "jupyter-contrib-nbextensions", specifier = ">=0.7.0" },
3842
  { name = "langchain", specifier = ">=0.3.25" },
@@ -3866,7 +3813,7 @@ requires-dist = [
3866
  { name = "qdrant-client", specifier = ">=1.8.0" },
3867
  { name = "ragas", specifier = ">=0.2.15" },
3868
  { name = "requests", specifier = ">=2.31.0" },
3869
- { name = "ruff", specifier = ">=0.11.0" },
3870
  { name = "scikit-learn", specifier = ">=1.0.0" },
3871
  { name = "scipy", specifier = ">=1.10.0" },
3872
  { name = "sentence-transformers", specifier = ">=3.4.1" },
@@ -3959,15 +3906,6 @@ wheels = [
3959
  { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982 },
3960
  ]
3961
 
3962
- [[package]]
3963
- name = "pycodestyle"
3964
- version = "2.13.0"
3965
- source = { registry = "https://pypi.org/simple" }
3966
- sdist = { url = "https://files.pythonhosted.org/packages/04/6e/1f4a62078e4d95d82367f24e685aef3a672abfd27d1a868068fed4ed2254/pycodestyle-2.13.0.tar.gz", hash = "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae", size = 39312 }
3967
- wheels = [
3968
- { url = "https://files.pythonhosted.org/packages/07/be/b00116df1bfb3e0bb5b45e29d604799f7b91dd861637e4d448b4e09e6a3e/pycodestyle-2.13.0-py2.py3-none-any.whl", hash = "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", size = 31424 },
3969
- ]
3970
-
3971
  [[package]]
3972
  name = "pycparser"
3973
  version = "2.22"
@@ -4058,15 +3996,6 @@ wheels = [
4058
  { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356 },
4059
  ]
4060
 
4061
- [[package]]
4062
- name = "pyflakes"
4063
- version = "3.3.2"
4064
- source = { registry = "https://pypi.org/simple" }
4065
- sdist = { url = "https://files.pythonhosted.org/packages/af/cc/1df338bd7ed1fa7c317081dcf29bf2f01266603b301e6858856d346a12b3/pyflakes-3.3.2.tar.gz", hash = "sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b", size = 64175 }
4066
- wheels = [
4067
- { url = "https://files.pythonhosted.org/packages/15/40/b293a4fa769f3b02ab9e387c707c4cbdc34f073f945de0386107d4e669e6/pyflakes-3.3.2-py2.py3-none-any.whl", hash = "sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a", size = 63164 },
4068
- ]
4069
-
4070
  [[package]]
4071
  name = "pygments"
4072
  version = "2.19.1"
 
781
  { url = "https://files.pythonhosted.org/packages/18/79/1b8fa1bb3568781e84c9200f951c735f3f157429f44be0495da55894d620/filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25", size = 19970 },
782
  ]
783
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
784
  [[package]]
785
  name = "forbiddenfruit"
786
  version = "0.1.4"
 
1280
  { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 },
1281
  ]
1282
 
 
 
 
 
 
 
 
 
 
1283
  [[package]]
1284
  name = "jedi"
1285
  version = "0.19.2"
 
2172
  { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
2173
  ]
2174
 
 
 
 
 
 
 
 
 
 
2175
  [[package]]
2176
  name = "mcp"
2177
  version = "1.9.2"
 
3711
  { name = "bidict" },
3712
  { name = "chainlit" },
3713
  { name = "datasets" },
 
3714
  { name = "google" },
3715
  { name = "ipykernel" },
3716
  { name = "ipywidgets" },
 
3739
  { name = "qdrant-client" },
3740
  { name = "ragas" },
3741
  { name = "requests" },
 
3742
  { name = "scikit-learn" },
3743
  { name = "scipy" },
3744
  { name = "sentence-transformers" },
 
3755
  dev = [
3756
  { name = "black" },
3757
  { name = "deptry" },
 
 
3758
  { name = "ipdb" },
 
3759
  { name = "mypy" },
3760
  { name = "pylint-venv" },
3761
  { name = "pytest" },
3762
+ { name = "ruff" },
3763
  ]
3764
  web = [
3765
  { name = "fastapi" },
 
3779
  { name = "datasets", specifier = ">=3.6.0" },
3780
  { name = "deptry", marker = "extra == 'dev'", specifier = ">=0.23.0" },
3781
  { name = "fastapi", marker = "extra == 'web'", specifier = ">=0.115.3,<0.116" },
 
 
 
3782
  { name = "google", specifier = ">=3.0.0" },
3783
  { name = "httpx", marker = "extra == 'web'", specifier = "==0.27.0" },
3784
  { name = "ipdb", marker = "extra == 'dev'", specifier = ">=0.13.13" },
3785
  { name = "ipykernel", specifier = ">=6.29.5" },
3786
  { name = "ipywidgets", specifier = ">=8.1.7" },
 
3787
  { name = "jupyter", specifier = ">=1.1.1" },
3788
  { name = "jupyter-contrib-nbextensions", specifier = ">=0.7.0" },
3789
  { name = "langchain", specifier = ">=0.3.25" },
 
3813
  { name = "qdrant-client", specifier = ">=1.8.0" },
3814
  { name = "ragas", specifier = ">=0.2.15" },
3815
  { name = "requests", specifier = ">=2.31.0" },
3816
+ { name = "ruff", marker = "extra == 'dev'" },
3817
  { name = "scikit-learn", specifier = ">=1.0.0" },
3818
  { name = "scipy", specifier = ">=1.10.0" },
3819
  { name = "sentence-transformers", specifier = ">=3.4.1" },
 
3906
  { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982 },
3907
  ]
3908
 
 
 
 
 
 
 
 
 
 
3909
  [[package]]
3910
  name = "pycparser"
3911
  version = "2.22"
 
3996
  { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356 },
3997
  ]
3998
 
 
 
 
 
 
 
 
 
 
3999
  [[package]]
4000
  name = "pygments"
4001
  version = "2.19.1"