From 05ae9df1f69e69301bb3311c45dac1bc6b946441 Mon Sep 17 00:00:00 2001
From: Luca Mannini <48441989+italianconcerto@users.noreply.github.com>
Date: Fri, 31 Jan 2025 14:27:50 +0100
Subject: [PATCH] fix: error in base.py and hybrid.py related to the unzipping
 of routes fixed

refactor: linter + formatter
---
 docs/source/conf.py                           |  2 +-
 semantic_router/__init__.py                   |  2 +-
 semantic_router/encoders/__init__.py          |  3 +--
 semantic_router/encoders/aurelio.py           |  4 ++--
 semantic_router/encoders/base.py              |  2 +-
 semantic_router/encoders/bedrock.py           |  4 +++-
 semantic_router/encoders/bm25.py              |  4 ++--
 semantic_router/encoders/clip.py              |  4 ++--
 semantic_router/encoders/huggingface.py       |  6 ++---
 semantic_router/encoders/openai.py            |  7 +++---
 semantic_router/encoders/zure.py              |  4 ++--
 semantic_router/index/base.py                 |  9 ++++---
 semantic_router/index/hybrid_local.py         |  5 ++--
 semantic_router/index/local.py                |  5 ++--
 semantic_router/index/pinecone.py             |  7 +++---
 semantic_router/index/postgres.py             |  2 +-
 semantic_router/llms/base.py                  |  2 +-
 semantic_router/llms/llamacpp.py              |  2 +-
 semantic_router/llms/openai.py                | 22 ++++++++---------
 semantic_router/llms/openrouter.py            |  3 +--
 semantic_router/llms/zure.py                  |  2 +-
 semantic_router/routers/__init__.py           |  2 +-
 semantic_router/routers/base.py               | 16 ++++++++-----
 semantic_router/routers/hybrid.py             | 24 +++++++++++--------
 semantic_router/routers/semantic.py           |  2 +-
 semantic_router/schema.py                     |  8 ++++---
 semantic_router/utils/function_call.py        |  3 +--
 .../encoders/test_openai_integration.py       |  2 ++
 tests/unit/encoders/test_azure.py             |  3 ++-
 tests/unit/encoders/test_bedrock.py           |  6 +++--
 tests/unit/encoders/test_bm25.py              |  4 ++--
 tests/unit/encoders/test_clip.py              |  4 +++-
 tests/unit/encoders/test_fastembed.py         |  4 ++--
 tests/unit/encoders/test_huggingface.py       |  2 +-
 tests/unit/encoders/test_mistral.py           |  1 -
 tests/unit/encoders/test_openai.py            |  3 ++-
 tests/unit/encoders/test_vit.py               |  2 +-
 tests/unit/llms/test_llm_base.py              |  4 +++-
 tests/unit/test_function_schema.py            |  1 +
 tests/unit/test_router.py                     | 17 ++++++-------
 tests/unit/test_sync.py                       | 21 ++++++++--------
 41 files changed, 123 insertions(+), 107 deletions(-)

diff --git a/docs/source/conf.py b/docs/source/conf.py
index 763e91ce..78249d78 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,6 +1,6 @@
-from typing import List
 import os
 import sys
+from typing import List
 
 sys.path.insert(0, os.path.abspath("../.."))  # Source code dir relative to this file
 
diff --git a/semantic_router/__init__.py b/semantic_router/__init__.py
index 2b446694..53c24327 100644
--- a/semantic_router/__init__.py
+++ b/semantic_router/__init__.py
@@ -1,5 +1,5 @@
-from semantic_router.routers import RouterConfig, SemanticRouter, HybridRouter
 from semantic_router.route import Route
+from semantic_router.routers import HybridRouter, RouterConfig, SemanticRouter
 
 __all__ = ["SemanticRouter", "HybridRouter", "Route", "RouterConfig"]
 
diff --git a/semantic_router/encoders/__init__.py b/semantic_router/encoders/__init__.py
index 07e468d8..5fdeb789 100644
--- a/semantic_router/encoders/__init__.py
+++ b/semantic_router/encoders/__init__.py
@@ -8,8 +8,7 @@ from semantic_router.encoders.clip import CLIPEncoder
 from semantic_router.encoders.cohere import CohereEncoder
 from semantic_router.encoders.fastembed import FastEmbedEncoder
 from semantic_router.encoders.google import GoogleEncoder
-from semantic_router.encoders.huggingface import HuggingFaceEncoder
-from semantic_router.encoders.huggingface import HFEndpointEncoder
+from semantic_router.encoders.huggingface import HFEndpointEncoder, HuggingFaceEncoder
 from semantic_router.encoders.mistral import MistralEncoder
 from semantic_router.encoders.openai import OpenAIEncoder
 from semantic_router.encoders.tfidf import TfidfEncoder
diff --git a/semantic_router/encoders/aurelio.py b/semantic_router/encoders/aurelio.py
index c50c6c4e..d1d40aa7 100644
--- a/semantic_router/encoders/aurelio.py
+++ b/semantic_router/encoders/aurelio.py
@@ -1,8 +1,8 @@
 import os
 from typing import Any, List, Optional
-from pydantic import Field
 
-from aurelio_sdk import AurelioClient, AsyncAurelioClient, EmbeddingResponse
+from aurelio_sdk import AsyncAurelioClient, AurelioClient, EmbeddingResponse
+from pydantic import Field
 
 from semantic_router.encoders.base import SparseEncoder
 from semantic_router.schema import SparseEmbedding
diff --git a/semantic_router/encoders/base.py b/semantic_router/encoders/base.py
index 993093c1..3e8cba21 100644
--- a/semantic_router/encoders/base.py
+++ b/semantic_router/encoders/base.py
@@ -1,7 +1,7 @@
 from typing import Any, Coroutine, List, Optional
 
-from pydantic import BaseModel, Field, field_validator
 import numpy as np
+from pydantic import BaseModel, Field, field_validator
 
 from semantic_router.schema import SparseEmbedding
 
diff --git a/semantic_router/encoders/bedrock.py b/semantic_router/encoders/bedrock.py
index 7adf60c7..f200bea8 100644
--- a/semantic_router/encoders/bedrock.py
+++ b/semantic_router/encoders/bedrock.py
@@ -17,10 +17,12 @@ Classes:
 """
 
 import json
-from typing import Dict, List, Optional, Any, Union
 import os
 from time import sleep
+from typing import Any, Dict, List, Optional, Union
+
 import tiktoken
+
 from semantic_router.encoders import DenseEncoder
 from semantic_router.utils.defaults import EncoderDefault
 from semantic_router.utils.logger import logger
diff --git a/semantic_router/encoders/bm25.py b/semantic_router/encoders/bm25.py
index f42bf9c2..6c180179 100644
--- a/semantic_router/encoders/bm25.py
+++ b/semantic_router/encoders/bm25.py
@@ -1,9 +1,9 @@
 from typing import Any, Dict, List, Optional
 
 from semantic_router.encoders.tfidf import TfidfEncoder
-from semantic_router.utils.logger import logger
-from semantic_router.schema import SparseEmbedding
 from semantic_router.route import Route
+from semantic_router.schema import SparseEmbedding
+from semantic_router.utils.logger import logger
 
 
 class BM25Encoder(TfidfEncoder):
diff --git a/semantic_router/encoders/clip.py b/semantic_router/encoders/clip.py
index 065ff115..1ecfe41c 100644
--- a/semantic_router/encoders/clip.py
+++ b/semantic_router/encoders/clip.py
@@ -1,8 +1,8 @@
-from typing import Any, List, Optional
+from typing import Any, Dict, List, Optional
 
 import numpy as np
 from pydantic import PrivateAttr
-from typing import Dict
+
 from semantic_router.encoders import DenseEncoder
 
 
diff --git a/semantic_router/encoders/huggingface.py b/semantic_router/encoders/huggingface.py
index f553a082..b659ebac 100644
--- a/semantic_router/encoders/huggingface.py
+++ b/semantic_router/encoders/huggingface.py
@@ -20,11 +20,11 @@ Classes:
     HFEndpointEncoder: A class for generating embeddings using a Huggingface endpoint.
 """
 
-import requests
-import time
 import os
-from typing import Any, List, Optional, Dict
+import time
+from typing import Any, Dict, List, Optional
 
+import requests
 from pydantic import PrivateAttr
 
 from semantic_router.encoders import DenseEncoder
diff --git a/semantic_router/encoders/openai.py b/semantic_router/encoders/openai.py
index 1ac5e56e..4865cc29 100644
--- a/semantic_router/encoders/openai.py
+++ b/semantic_router/encoders/openai.py
@@ -1,21 +1,20 @@
-from asyncio import sleep as asleep
 import os
+from asyncio import sleep as asleep
 from time import sleep
 from typing import Any, List, Optional, Union
-from pydantic import PrivateAttr
 
 import openai
+import tiktoken
 from openai import OpenAIError
 from openai._types import NotGiven
 from openai.types import CreateEmbeddingResponse
-import tiktoken
+from pydantic import PrivateAttr
 
 from semantic_router.encoders import DenseEncoder
 from semantic_router.schema import EncoderInfo
 from semantic_router.utils.defaults import EncoderDefault
 from semantic_router.utils.logger import logger
 
-
 model_configs = {
     "text-embedding-ada-002": EncoderInfo(
         name="text-embedding-ada-002",
diff --git a/semantic_router/encoders/zure.py b/semantic_router/encoders/zure.py
index fd8594a9..f16213dc 100644
--- a/semantic_router/encoders/zure.py
+++ b/semantic_router/encoders/zure.py
@@ -1,11 +1,11 @@
-from asyncio import sleep as asleep
 import os
+from asyncio import sleep as asleep
 from time import sleep
 from typing import List, Optional, Union
 
 import openai
-from openai._types import NotGiven
 from openai import OpenAIError
+from openai._types import NotGiven
 from openai.types import CreateEmbeddingResponse
 
 from semantic_router.encoders import DenseEncoder
diff --git a/semantic_router/index/base.py b/semantic_router/index/base.py
index 0025a0bb..cad75daf 100644
--- a/semantic_router/index/base.py
+++ b/semantic_router/index/base.py
@@ -1,17 +1,16 @@
 import asyncio
-from datetime import datetime
-import time
-from typing import Any, List, Optional, Tuple, Union, Dict
 import json
+import time
+from datetime import datetime
+from typing import Any, Dict, List, Optional, Tuple, Union
 
 import numpy as np
 from pydantic import BaseModel
 
-from semantic_router.schema import ConfigParameter, SparseEmbedding, Utterance
 from semantic_router.route import Route
+from semantic_router.schema import ConfigParameter, SparseEmbedding, Utterance
 from semantic_router.utils.logger import logger
 
-
 RETRY_WAIT_TIME = 2.5
 
 
diff --git a/semantic_router/index/hybrid_local.py b/semantic_router/index/hybrid_local.py
index 704df257..c473a56c 100644
--- a/semantic_router/index/hybrid_local.py
+++ b/semantic_router/index/hybrid_local.py
@@ -1,12 +1,11 @@
-from typing import List, Optional, Tuple, Dict
+from typing import Any, Dict, List, Optional, Tuple
 
 import numpy as np
 from numpy.linalg import norm
 
-from semantic_router.schema import ConfigParameter, SparseEmbedding, Utterance
 from semantic_router.index.local import LocalIndex
+from semantic_router.schema import ConfigParameter, SparseEmbedding, Utterance
 from semantic_router.utils.logger import logger
-from typing import Any
 
 
 class HybridLocalIndex(LocalIndex):
diff --git a/semantic_router/index/local.py b/semantic_router/index/local.py
index 9cccfc4a..d66f6159 100644
--- a/semantic_router/index/local.py
+++ b/semantic_router/index/local.py
@@ -1,12 +1,11 @@
-from typing import List, Optional, Tuple, Dict
+from typing import Any, Dict, List, Optional, Tuple
 
 import numpy as np
 
-from semantic_router.schema import ConfigParameter, SparseEmbedding, Utterance
 from semantic_router.index.base import BaseIndex, IndexConfig
 from semantic_router.linear import similarity_matrix, top_scores
+from semantic_router.schema import ConfigParameter, SparseEmbedding, Utterance
 from semantic_router.utils.logger import logger
-from typing import Any
 
 
 class LocalIndex(BaseIndex):
diff --git a/semantic_router/index/pinecone.py b/semantic_router/index/pinecone.py
index 15889013..75e01902 100644
--- a/semantic_router/index/pinecone.py
+++ b/semantic_router/index/pinecone.py
@@ -1,12 +1,11 @@
-import aiohttp
 import asyncio
 import hashlib
+import json
 import os
 import time
-import json
-
-from typing import Any, Dict, List, Optional, Union, Tuple
+from typing import Any, Dict, List, Optional, Tuple, Union
 
+import aiohttp
 import numpy as np
 from pydantic import BaseModel, Field
 
diff --git a/semantic_router/index/postgres.py b/semantic_router/index/postgres.py
index 6f4a9f2a..362741ef 100644
--- a/semantic_router/index/postgres.py
+++ b/semantic_router/index/postgres.py
@@ -1,7 +1,7 @@
 import os
 import uuid
 from enum import Enum
-from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING, Union
+from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
 
 import numpy as np
 from pydantic import BaseModel, Field
diff --git a/semantic_router/llms/base.py b/semantic_router/llms/base.py
index 02df2764..1ebc7aa5 100644
--- a/semantic_router/llms/base.py
+++ b/semantic_router/llms/base.py
@@ -1,5 +1,5 @@
 import json
-from typing import Any, List, Optional, Dict
+from typing import Any, Dict, List, Optional
 
 from pydantic import BaseModel
 
diff --git a/semantic_router/llms/llamacpp.py b/semantic_router/llms/llamacpp.py
index 8257593c..dda11bea 100644
--- a/semantic_router/llms/llamacpp.py
+++ b/semantic_router/llms/llamacpp.py
@@ -1,6 +1,6 @@
 from contextlib import contextmanager
 from pathlib import Path
-from typing import Any, Optional, List, Dict
+from typing import Any, Dict, List, Optional
 
 from pydantic import PrivateAttr
 
diff --git a/semantic_router/llms/openai.py b/semantic_router/llms/openai.py
index 7dc565e8..3e991148 100644
--- a/semantic_router/llms/openai.py
+++ b/semantic_router/llms/openai.py
@@ -1,24 +1,24 @@
+import inspect
+import json
 import os
-from typing import List, Optional, Any, Callable, Dict, Union
-from pydantic import PrivateAttr
+import re
+from typing import Any, Callable, Dict, List, Optional, Union
 
 import openai
-from openai._types import NotGiven, NOT_GIVEN
+from openai._types import NOT_GIVEN, NotGiven
+from openai.types.chat.chat_completion_message_tool_call import (
+    ChatCompletionMessageToolCall,
+)
+from pydantic import PrivateAttr
 
 from semantic_router.llms import BaseLLM
 from semantic_router.schema import Message
 from semantic_router.utils.defaults import EncoderDefault
-from semantic_router.utils.logger import logger
-import json
 from semantic_router.utils.function_call import (
-    get_schema,
     convert_python_type_to_json_type,
+    get_schema,
 )
-import inspect
-import re
-from openai.types.chat.chat_completion_message_tool_call import (
-    ChatCompletionMessageToolCall,
-)
+from semantic_router.utils.logger import logger
 
 
 class OpenAILLM(BaseLLM):
diff --git a/semantic_router/llms/openrouter.py b/semantic_router/llms/openrouter.py
index 03762364..34dc147d 100644
--- a/semantic_router/llms/openrouter.py
+++ b/semantic_router/llms/openrouter.py
@@ -1,9 +1,8 @@
 import os
 from typing import List, Optional
 
-from pydantic import PrivateAttr
-
 import openai
+from pydantic import PrivateAttr
 
 from semantic_router.llms import BaseLLM
 from semantic_router.schema import Message
diff --git a/semantic_router/llms/zure.py b/semantic_router/llms/zure.py
index ba833d04..fae5149d 100644
--- a/semantic_router/llms/zure.py
+++ b/semantic_router/llms/zure.py
@@ -1,8 +1,8 @@
 import os
 from typing import List, Optional
-from pydantic import PrivateAttr
 
 import openai
+from pydantic import PrivateAttr
 
 from semantic_router.llms import BaseLLM
 from semantic_router.schema import Message
diff --git a/semantic_router/routers/__init__.py b/semantic_router/routers/__init__.py
index 79987406..754ea17d 100644
--- a/semantic_router/routers/__init__.py
+++ b/semantic_router/routers/__init__.py
@@ -1,6 +1,6 @@
 from semantic_router.routers.base import BaseRouter, RouterConfig
-from semantic_router.routers.semantic import SemanticRouter
 from semantic_router.routers.hybrid import HybridRouter
+from semantic_router.routers.semantic import SemanticRouter
 
 __all__ = [
     "BaseRouter",
diff --git a/semantic_router/routers/base.py b/semantic_router/routers/base.py
index b5136f97..43f29d5b 100644
--- a/semantic_router/routers/base.py
+++ b/semantic_router/routers/base.py
@@ -1,15 +1,15 @@
+import hashlib
 import importlib
 import json
 import os
 import random
-import hashlib
 from typing import Any, Callable, Dict, List, Optional, Tuple, Union
-from typing_extensions import deprecated
-from pydantic import BaseModel, Field
 
 import numpy as np
 import yaml  # type: ignore
+from pydantic import BaseModel, Field
 from tqdm.auto import tqdm
+from typing_extensions import deprecated
 
 from semantic_router.encoders import (
     AutoEncoder,
@@ -1345,9 +1345,13 @@ class BaseRouter(BaseModel):
 
             remote_routes = self.index.get_utterances(include_metadata=True)
             # TODO Enhance by retrieving directly the vectors instead of embedding all utterances again
-            routes, utterances, function_schemas, metadata = map(
-                list, zip(*remote_routes)
-            )
+            routes = []
+            utterances = []
+            metadata = []
+            for route in remote_routes:
+                routes.append(route.route)
+                utterances.append(route.utterance)
+                metadata.append(route.metadata)
             embeddings = self.encoder(utterances)
             self.index = LocalIndex()
             self.index.add(
diff --git a/semantic_router/routers/hybrid.py b/semantic_router/routers/hybrid.py
index 94ef33a3..8bdc5a80 100644
--- a/semantic_router/routers/hybrid.py
+++ b/semantic_router/routers/hybrid.py
@@ -1,22 +1,22 @@
-from typing import Any, Dict, List, Optional, Union
-from tqdm.auto import tqdm
 import asyncio
-from pydantic import Field
+from typing import Any, Dict, List, Optional, Union
 
 import numpy as np
+from pydantic import Field
+from tqdm.auto import tqdm
 
 from semantic_router.encoders import (
+    BM25Encoder,
     DenseEncoder,
     SparseEncoder,
-    BM25Encoder,
     TfidfEncoder,
 )
-from semantic_router.route import Route
 from semantic_router.index import BaseIndex, HybridLocalIndex
+from semantic_router.llms import BaseLLM
+from semantic_router.route import Route
+from semantic_router.routers.base import BaseRouter, threshold_random_search, xq_reshape
 from semantic_router.schema import RouteChoice, SparseEmbedding, Utterance
 from semantic_router.utils.logger import logger
-from semantic_router.routers.base import BaseRouter, xq_reshape, threshold_random_search
-from semantic_router.llms import BaseLLM
 
 
 class HybridRouter(BaseRouter):
@@ -288,9 +288,13 @@ class HybridRouter(BaseRouter):
 
             remote_routes = self.index.get_utterances(include_metadata=True)
             # TODO Enhance by retrieving directly the vectors instead of embedding all utterances again
-            routes, utterances, function_schemas, metadata = map(
-                list, zip(*remote_routes)
-            )
+            routes = []
+            utterances = []
+            metadata = []
+            for route in remote_routes:
+                routes.append(route.route)
+                utterances.append(route.utterance)
+                metadata.append(route.metadata)
             embeddings = self.encoder(utterances)
             sparse_embeddings = self.sparse_encoder(utterances)
             self.index = HybridLocalIndex()
diff --git a/semantic_router/routers/semantic.py b/semantic_router/routers/semantic.py
index 5efa2e48..a468e0de 100644
--- a/semantic_router/routers/semantic.py
+++ b/semantic_router/routers/semantic.py
@@ -5,9 +5,9 @@ import numpy as np
 from semantic_router.encoders import DenseEncoder
 from semantic_router.index.base import BaseIndex
 from semantic_router.llms import BaseLLM
-from semantic_router.utils.logger import logger
 from semantic_router.route import Route
 from semantic_router.routers.base import BaseRouter
+from semantic_router.utils.logger import logger
 
 
 class SemanticRouter(BaseRouter):
diff --git a/semantic_router/schema.py b/semantic_router/schema.py
index 273043f5..2ba85b49 100644
--- a/semantic_router/schema.py
+++ b/semantic_router/schema.py
@@ -1,12 +1,14 @@
+import json
 from datetime import datetime, timezone
 from difflib import Differ
 from enum import Enum
-import json
+from typing import Any, Dict, List, Optional, Tuple, Union
+
 import numpy as np
-from typing import List, Optional, Union, Any, Dict, Tuple
+from aurelio_sdk.schema import BM25Embedding
 from pydantic import BaseModel, Field
+
 from semantic_router.utils.logger import logger
-from aurelio_sdk.schema import BM25Embedding
 
 
 class EncoderType(Enum):
diff --git a/semantic_router/utils/function_call.py b/semantic_router/utils/function_call.py
index f5fd5a87..e9c0afd1 100644
--- a/semantic_router/utils/function_call.py
+++ b/semantic_router/utils/function_call.py
@@ -1,12 +1,11 @@
 import inspect
 from typing import Any, Callable, Dict, List, Optional, Union
 
-from pydantic import BaseModel
+from pydantic import BaseModel, Field
 
 from semantic_router.llms import BaseLLM
 from semantic_router.schema import Message, RouteChoice
 from semantic_router.utils.logger import logger
-from pydantic import Field
 
 
 class Parameter(BaseModel):
diff --git a/tests/integration/encoders/test_openai_integration.py b/tests/integration/encoders/test_openai_integration.py
index 8c557d80..63c6968a 100644
--- a/tests/integration/encoders/test_openai_integration.py
+++ b/tests/integration/encoders/test_openai_integration.py
@@ -1,6 +1,8 @@
 import os
+
 import pytest
 from openai import OpenAIError
+
 from semantic_router.encoders.base import DenseEncoder
 from semantic_router.encoders.openai import OpenAIEncoder
 
diff --git a/tests/unit/encoders/test_azure.py b/tests/unit/encoders/test_azure.py
index 5a6841d7..01a495a4 100644
--- a/tests/unit/encoders/test_azure.py
+++ b/tests/unit/encoders/test_azure.py
@@ -1,5 +1,6 @@
-import pytest
 from unittest.mock import AsyncMock, Mock, patch
+
+import pytest
 from openai import OpenAIError
 from openai.types import CreateEmbeddingResponse, Embedding
 from openai.types.create_embedding_response import Usage
diff --git a/tests/unit/encoders/test_bedrock.py b/tests/unit/encoders/test_bedrock.py
index 619325ed..a1f40cc2 100644
--- a/tests/unit/encoders/test_bedrock.py
+++ b/tests/unit/encoders/test_bedrock.py
@@ -1,7 +1,9 @@
-import os
-import pytest
 import json
+import os
 from io import BytesIO
+
+import pytest
+
 from semantic_router.encoders import BedrockEncoder
 
 
diff --git a/tests/unit/encoders/test_bm25.py b/tests/unit/encoders/test_bm25.py
index a22b0cc2..6c213348 100644
--- a/tests/unit/encoders/test_bm25.py
+++ b/tests/unit/encoders/test_bm25.py
@@ -1,9 +1,9 @@
-import pytest
+import nltk
 import numpy as np
+import pytest
 
 from semantic_router.encoders import BM25Encoder
 from semantic_router.route import Route
-import nltk
 
 nltk.download("punkt_tab")
 
diff --git a/tests/unit/encoders/test_clip.py b/tests/unit/encoders/test_clip.py
index 29776151..ac87e6a0 100644
--- a/tests/unit/encoders/test_clip.py
+++ b/tests/unit/encoders/test_clip.py
@@ -1,12 +1,14 @@
 import os
+
 import numpy as np
 import pytest
 
 _ = pytest.importorskip("torch")
 
+from unittest.mock import patch  # noqa: E402
+
 import torch  # noqa: E402
 from PIL import Image  # noqa: E402
-from unittest.mock import patch  # noqa: E402
 
 from semantic_router.encoders import CLIPEncoder  # noqa: E402
 
diff --git a/tests/unit/encoders/test_fastembed.py b/tests/unit/encoders/test_fastembed.py
index f46303c1..a8ad3438 100644
--- a/tests/unit/encoders/test_fastembed.py
+++ b/tests/unit/encoders/test_fastembed.py
@@ -1,7 +1,7 @@
-from semantic_router.encoders import FastEmbedEncoder
-
 import pytest
 
+from semantic_router.encoders import FastEmbedEncoder
+
 _ = pytest.importorskip("fastembed")
 
 
diff --git a/tests/unit/encoders/test_huggingface.py b/tests/unit/encoders/test_huggingface.py
index 7f496e39..1677a450 100644
--- a/tests/unit/encoders/test_huggingface.py
+++ b/tests/unit/encoders/test_huggingface.py
@@ -1,6 +1,6 @@
+import os
 from unittest.mock import patch
 
-import os
 import numpy as np
 import pytest
 
diff --git a/tests/unit/encoders/test_mistral.py b/tests/unit/encoders/test_mistral.py
index a236ad16..25dba6b7 100644
--- a/tests/unit/encoders/test_mistral.py
+++ b/tests/unit/encoders/test_mistral.py
@@ -1,7 +1,6 @@
 from unittest.mock import patch
 
 import pytest
-
 from mistralai.exceptions import MistralException
 from mistralai.models.embeddings import EmbeddingObject, EmbeddingResponse, UsageInfo
 
diff --git a/tests/unit/encoders/test_openai.py b/tests/unit/encoders/test_openai.py
index 96171cce..a564f2e6 100644
--- a/tests/unit/encoders/test_openai.py
+++ b/tests/unit/encoders/test_openai.py
@@ -1,5 +1,6 @@
-import pytest
 from unittest.mock import AsyncMock, Mock, patch
+
+import pytest
 from openai import OpenAIError
 from openai.types import CreateEmbeddingResponse, Embedding
 from openai.types.create_embedding_response import Usage
diff --git a/tests/unit/encoders/test_vit.py b/tests/unit/encoders/test_vit.py
index 622b2268..c2488a1e 100644
--- a/tests/unit/encoders/test_vit.py
+++ b/tests/unit/encoders/test_vit.py
@@ -1,6 +1,6 @@
+import os
 from unittest.mock import patch
 
-import os
 import numpy as np
 import pytest
 
diff --git a/tests/unit/llms/test_llm_base.py b/tests/unit/llms/test_llm_base.py
index 7fe8c0f0..c849901d 100644
--- a/tests/unit/llms/test_llm_base.py
+++ b/tests/unit/llms/test_llm_base.py
@@ -1,6 +1,8 @@
+from unittest.mock import patch
+
 import pytest
+
 from semantic_router.llms import BaseLLM
-from unittest.mock import patch
 
 
 class TestBaseLLM:
diff --git a/tests/unit/test_function_schema.py b/tests/unit/test_function_schema.py
index 94a3f8e8..fbd2d7c6 100644
--- a/tests/unit/test_function_schema.py
+++ b/tests/unit/test_function_schema.py
@@ -1,4 +1,5 @@
 import inspect
+
 from semantic_router.utils.function_call import FunctionSchema
 
 
diff --git a/tests/unit/test_router.py b/tests/unit/test_router.py
index a210cc4c..771d44ef 100644
--- a/tests/unit/test_router.py
+++ b/tests/unit/test_router.py
@@ -1,22 +1,23 @@
 import importlib
-from functools import wraps
 import os
 import tempfile
-from unittest.mock import mock_open, patch
-from datetime import datetime
-import pytest
 import time
+from datetime import datetime
+from functools import wraps
+from platform import python_version
 from typing import Optional
-from semantic_router.encoders import DenseEncoder, CohereEncoder, OpenAIEncoder
+from unittest.mock import mock_open, patch
+
+import pytest
+
+from semantic_router.encoders import CohereEncoder, DenseEncoder, OpenAIEncoder
 from semantic_router.index.local import LocalIndex
 from semantic_router.index.pinecone import PineconeIndex
 from semantic_router.index.qdrant import QdrantIndex
-from semantic_router.routers import RouterConfig, SemanticRouter, HybridRouter
 from semantic_router.llms import BaseLLM, OpenAILLM
 from semantic_router.route import Route
+from semantic_router.routers import HybridRouter, RouterConfig, SemanticRouter
 from semantic_router.utils.logger import logger
-from platform import python_version
-
 
 PINECONE_SLEEP = 8
 RETRY_COUNT = 10
diff --git a/tests/unit/test_sync.py b/tests/unit/test_sync.py
index d40a57fb..02f4aa89 100644
--- a/tests/unit/test_sync.py
+++ b/tests/unit/test_sync.py
@@ -1,25 +1,26 @@
 import asyncio
-from functools import wraps
 import importlib
 import os
-from datetime import datetime
-import pytest
 import time
+from datetime import datetime
+from functools import wraps
+from platform import python_version
 from typing import Optional
-from semantic_router.encoders import DenseEncoder, CohereEncoder, OpenAIEncoder
+
+import pytest
+
+from semantic_router.encoders import CohereEncoder, DenseEncoder, OpenAIEncoder
 from semantic_router.index import (
-    PineconeIndex,
     HybridLocalIndex,
     LocalIndex,
-    QdrantIndex,
+    PineconeIndex,
     PostgresIndex,
+    QdrantIndex,
 )
-from semantic_router.schema import Utterance
-from semantic_router.routers import SemanticRouter, HybridRouter
 from semantic_router.route import Route
+from semantic_router.routers import HybridRouter, SemanticRouter
+from semantic_router.schema import Utterance
 from semantic_router.utils.logger import logger
-from platform import python_version
-
 
 PINECONE_SLEEP = 6
 RETRY_COUNT = 5
-- 
GitLab