Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion api/core/ops/ops_trace_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import time
from collections.abc import Mapping
from datetime import timedelta
from typing import TYPE_CHECKING, Any, TypedDict
from typing import TYPE_CHECKING, Any, TypedDict, override
from uuid import UUID, uuid4

from cachetools import LRUCache
Expand Down Expand Up @@ -221,6 +221,7 @@ class TracingProviderConfigEntry(TypedDict):


class OpsTraceProviderConfigMap(collections.UserDict[str, TracingProviderConfigEntry]):
@override
def __getitem__(self, key: str) -> TracingProviderConfigEntry:
try:
match key:
Expand Down
6 changes: 5 additions & 1 deletion api/core/rag/embedding/cached_embedding.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import base64
import logging
import pickle
from typing import Any, cast
from typing import Any, cast, override

import numpy as np
from sqlalchemy import select
Expand All @@ -25,6 +25,7 @@ class CacheEmbedding(Embeddings):
def __init__(self, model_instance: ModelInstance):
self._model_instance = model_instance

@override
def embed_documents(self, texts: list[str]) -> list[list[float]]:
"""Embed search docs in batches of 10."""
# use doc embedding cache or store if not exists
Expand Down Expand Up @@ -106,6 +107,7 @@ def embed_documents(self, texts: list[str]) -> list[list[float]]:

return text_embeddings

@override
def embed_multimodal_documents(self, multimodel_documents: list[dict[str, Any]]) -> list[list[float]]:
"""Embed file documents."""
# use doc embedding cache or store if not exists
Expand Down Expand Up @@ -189,6 +191,7 @@ def embed_multimodal_documents(self, multimodel_documents: list[dict[str, Any]])

return multimodel_embeddings

@override
def embed_query(self, text: str) -> list[float]:
"""Embed query text."""
# use doc embedding cache or store if not exists
Expand Down Expand Up @@ -232,6 +235,7 @@ def embed_query(self, text: str) -> list[float]:

return embedding_results # type: ignore

@override
def embed_multimodal_query(self, multimodel_document: dict[str, Any]) -> list[float]:
"""Embed multimodal documents."""
# use doc embedding cache or store if not exists
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import logging
import re
import uuid
from typing import Any, TypedDict, cast
from typing import Any, TypedDict, cast, override

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -61,6 +61,7 @@ class ParagraphFormatPreviewDict(TypedDict):


class ParagraphIndexProcessor(BaseIndexProcessor):
@override
def extract(self, extract_setting: ExtractSetting, **kwargs) -> list[Document]:
text_docs = ExtractProcessor.extract(
extract_setting=extract_setting,
Expand All @@ -71,6 +72,7 @@ def extract(self, extract_setting: ExtractSetting, **kwargs) -> list[Document]:

return text_docs

@override
def transform(self, documents: list[Document], current_user: Account | None = None, **kwargs) -> list[Document]:
process_rule = kwargs.get("process_rule")
if not process_rule:
Expand Down Expand Up @@ -120,6 +122,7 @@ def transform(self, documents: list[Document], current_user: Account | None = No
all_documents.extend(split_documents)
return all_documents

@override
def load(
self,
dataset: Dataset,
Expand All @@ -142,6 +145,7 @@ def load(
else:
keyword.add_texts(documents)

@override
def clean(self, dataset: Dataset, node_ids: list[str] | None, with_keywords: bool = True, **kwargs) -> None:
# Note: Summary indexes are now disabled (not deleted) when segments are disabled.
# This method is called for actual deletion scenarios (e.g., when segment is deleted).
Expand Down Expand Up @@ -178,6 +182,7 @@ def clean(self, dataset: Dataset, node_ids: list[str] | None, with_keywords: boo
else:
keyword.delete()

@override
def retrieve(
self,
retrieval_method: RetrievalMethod,
Expand Down Expand Up @@ -206,6 +211,7 @@ def retrieve(
docs.append(doc)
return docs

@override
def index(self, dataset: Dataset, document: DatasetDocument, chunks: Any) -> None:
documents: list[Any] = []
all_multimodal_documents: list[Any] = []
Expand Down Expand Up @@ -271,6 +277,7 @@ def index(self, dataset: Dataset, document: DatasetDocument, chunks: Any) -> Non
keyword = Keyword(dataset)
keyword.add_texts(documents)

@override
def format_preview(self, chunks: Any) -> ParagraphFormatPreviewDict:
if isinstance(chunks, list):
preview = []
Expand All @@ -285,6 +292,7 @@ def format_preview(self, chunks: Any) -> ParagraphFormatPreviewDict:
else:
raise ValueError("Chunks is not a list")

@override
def generate_summary_preview(
self,
tenant_id: str,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import json
import logging
import uuid
from typing import Any, TypedDict
from typing import Any, TypedDict, override

from sqlalchemy import delete, select

Expand Down Expand Up @@ -44,6 +44,7 @@ class ParentChildFormatPreviewDict(TypedDict):


class ParentChildIndexProcessor(BaseIndexProcessor):
@override
def extract(self, extract_setting: ExtractSetting, **kwargs) -> list[Document]:
text_docs = ExtractProcessor.extract(
extract_setting=extract_setting,
Expand All @@ -54,6 +55,7 @@ def extract(self, extract_setting: ExtractSetting, **kwargs) -> list[Document]:

return text_docs

@override
def transform(self, documents: list[Document], current_user: Account | None = None, **kwargs) -> list[Document]:
process_rule = kwargs.get("process_rule")
if not process_rule:
Expand Down Expand Up @@ -129,6 +131,7 @@ def transform(self, documents: list[Document], current_user: Account | None = No

return all_documents

@override
def load(
self,
dataset: Dataset,
Expand All @@ -149,6 +152,7 @@ def load(
if multimodal_documents and dataset.is_multimodal:
vector.create_multimodal(multimodal_documents)

@override
def clean(self, dataset: Dataset, node_ids: list[str] | None, with_keywords: bool = True, **kwargs) -> None:
# node_ids is segment's node_ids
# Note: Summary indexes are now disabled (not deleted) when segments are disabled.
Expand Down Expand Up @@ -219,6 +223,7 @@ def clean(self, dataset: Dataset, node_ids: list[str] | None, with_keywords: boo
)
db.session.commit()

@override
def retrieve(
self,
retrieval_method: RetrievalMethod,
Expand Down Expand Up @@ -283,6 +288,7 @@ def _split_child_nodes(
child_nodes.append(child_document)
return child_nodes

@override
def index(self, dataset: Dataset, document: DatasetDocument, chunks: Any) -> None:
parent_childs = ParentChildStructureChunk.model_validate(chunks)
documents = []
Expand Down Expand Up @@ -356,6 +362,7 @@ def index(self, dataset: Dataset, document: DatasetDocument, chunks: Any) -> Non
if all_multimodal_documents and dataset.is_multimodal:
vector.create_multimodal(all_multimodal_documents)

@override
def format_preview(self, chunks: Any) -> ParentChildFormatPreviewDict:
parent_childs = ParentChildStructureChunk.model_validate(chunks)
preview = []
Expand All @@ -369,6 +376,7 @@ def format_preview(self, chunks: Any) -> ParentChildFormatPreviewDict:
}
return result

@override
def generate_summary_preview(
self,
tenant_id: str,
Expand Down
10 changes: 9 additions & 1 deletion api/core/rag/index_processor/processor/qa_index_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import re
import threading
import uuid
from typing import Any, TypedDict
from typing import Any, TypedDict, override

import pandas as pd
from flask import Flask, current_app
Expand Down Expand Up @@ -43,6 +43,7 @@ class QAFormatPreviewDict(TypedDict):


class QAIndexProcessor(BaseIndexProcessor):
@override
def extract(self, extract_setting: ExtractSetting, **kwargs) -> list[Document]:
text_docs = ExtractProcessor.extract(
extract_setting=extract_setting,
Expand All @@ -52,6 +53,7 @@ def extract(self, extract_setting: ExtractSetting, **kwargs) -> list[Document]:
)
return text_docs

@override
def transform(self, documents: list[Document], current_user: Account | None = None, **kwargs) -> list[Document]:
preview = kwargs.get("preview")
process_rule = kwargs.get("process_rule")
Expand Down Expand Up @@ -139,6 +141,7 @@ def format_by_template(self, file: FileStorage, **kwargs) -> list[Document]:
raise ValueError(str(e))
return text_docs

@override
def load(
self,
dataset: Dataset,
Expand All @@ -153,6 +156,7 @@ def load(
if multimodal_documents and dataset.is_multimodal:
vector.create_multimodal(multimodal_documents)

@override
def clean(self, dataset: Dataset, node_ids: list[str] | None, with_keywords: bool = True, **kwargs) -> None:
# Note: Summary indexes are now disabled (not deleted) when segments are disabled.
# This method is called for actual deletion scenarios (e.g., when segment is deleted).
Expand Down Expand Up @@ -183,6 +187,7 @@ def clean(self, dataset: Dataset, node_ids: list[str] | None, with_keywords: boo
else:
vector.delete()

@override
def retrieve(
self,
retrieval_method: RetrievalMethod,
Expand Down Expand Up @@ -211,6 +216,7 @@ def retrieve(
docs.append(doc)
return docs

@override
def index(self, dataset: Dataset, document: DatasetDocument, chunks: Any) -> None:
qa_chunks = QAStructureChunk.model_validate(chunks)
documents = []
Expand All @@ -234,6 +240,7 @@ def index(self, dataset: Dataset, document: DatasetDocument, chunks: Any) -> Non
else:
raise ValueError("Indexing technique must be high quality.")

@override
def format_preview(self, chunks: Any) -> QAFormatPreviewDict:
qa_chunks = QAStructureChunk.model_validate(chunks)
preview = []
Expand All @@ -246,6 +253,7 @@ def format_preview(self, chunks: Any) -> QAFormatPreviewDict:
}
return result

@override
def generate_summary_preview(
self,
tenant_id: str,
Expand Down
2 changes: 2 additions & 0 deletions api/core/rag/rerank/rerank_model.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import base64
from typing import override

from core.model_manager import ModelInstance, ModelManager
from core.rag.index_processor.constant.doc_type import DocType
Expand All @@ -16,6 +17,7 @@ class RerankModelRunner(BaseRerankRunner):
def __init__(self, rerank_model_instance: ModelInstance):
self.rerank_model_instance = rerank_model_instance

@override
def run(
self,
query: str,
Expand Down
2 changes: 2 additions & 0 deletions api/core/rag/rerank/weight_rerank.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import math
from collections import Counter
from typing import override

import numpy as np

Expand All @@ -19,6 +20,7 @@ def __init__(self, tenant_id: str, weights: Weights):
self.tenant_id = tenant_id
self.weights = weights

@override
def run(
self,
query: str,
Expand Down
3 changes: 2 additions & 1 deletion api/core/rag/splitter/fixed_text_splitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import codecs
import re
from collections.abc import Set as AbstractSet
from typing import Any, Literal
from typing import Any, Literal, override

from core.model_manager import ModelInstance
from core.rag.splitter.text_splitter import RecursiveCharacterTextSplitter
Expand Down Expand Up @@ -51,6 +51,7 @@ def __init__(self, fixed_separator: str = "\n\n", separators: list[str] | None =
self._fixed_separator = codecs.decode(fixed_separator, "unicode_escape")
self._separators = separators or ["\n\n", "\n", "。", ". ", " ", ""]

@override
def split_text(self, text: str) -> list[str]:
"""Split incoming text and return chunks."""
if self._fixed_separator:
Expand Down
6 changes: 5 additions & 1 deletion api/core/rag/splitter/text_splitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from collections.abc import Callable, Iterable, Sequence
from collections.abc import Set as AbstractSet
from dataclasses import dataclass
from typing import Any, Literal
from typing import Any, Literal, override

from core.rag.models.document import BaseDocumentTransformer, Document

Expand Down Expand Up @@ -148,10 +148,12 @@ def _huggingface_tokenizer_length(text: str) -> int:
)
return cls(length_function=lambda x: [_huggingface_tokenizer_length(text) for text in x], **kwargs)

@override
def transform_documents(self, documents: Sequence[Document], **kwargs: Any) -> Sequence[Document]:
"""Transform sequence of documents by splitting them."""
return self.split_documents(list(documents))

@override
async def atransform_documents(self, documents: Sequence[Document], **kwargs: Any) -> Sequence[Document]:
"""Asynchronously transform a sequence of documents by splitting them."""
raise NotImplementedError
Expand Down Expand Up @@ -211,6 +213,7 @@ def __init__(
self._allowed_special: Literal["all"] | AbstractSet[str] = allowed_special
self._disallowed_special: Literal["all"] | AbstractSet[str] = disallowed_special

@override
def split_text(self, text: str) -> list[str]:
def _encode(_text: str) -> list[int]:
return self._tokenizer.encode(
Expand Down Expand Up @@ -287,5 +290,6 @@ def _split_text(self, text: str, separators: list[str]) -> list[str]:

return final_chunks

@override
def split_text(self, text: str) -> list[str]:
return self._split_text(text, self._separators)
4 changes: 3 additions & 1 deletion api/core/tools/builtin_tool/provider.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from abc import abstractmethod
from os import listdir, path
from typing import Any
from typing import Any, override

from core.entities.provider_entities import ProviderConfig
from core.helper.module_import_helper import load_single_subclass_from_source
Expand Down Expand Up @@ -105,6 +105,7 @@ def _get_builtin_tools(self) -> list[BuiltinTool]:
"""
return self.tools

@override
def get_credentials_schema(self) -> list[ProviderConfig]:
"""
returns the credentials schema of the provider
Expand Down Expand Up @@ -182,6 +183,7 @@ def need_credentials(self) -> bool:
)

@property
@override
def provider_type(self) -> ToolProviderType:
"""
returns the type of the provider
Expand Down
3 changes: 2 additions & 1 deletion api/core/tools/builtin_tool/providers/audio/audio.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from typing import Any
from typing import Any, override

from core.tools.builtin_tool.provider import BuiltinToolProviderController


class AudioToolProvider(BuiltinToolProviderController):
@override
def _validate_credentials(self, user_id: str, credentials: dict[str, Any]):
pass
Loading
Loading