isage-middleware 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of isage-middleware might be problematic. Click here for more details.
- isage_middleware-0.1.0.dist-info/METADATA +424 -0
- isage_middleware-0.1.0.dist-info/RECORD +191 -0
- isage_middleware-0.1.0.dist-info/WHEEL +5 -0
- isage_middleware-0.1.0.dist-info/top_level.txt +1 -0
- sage/__init__.py +2 -0
- sage/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/__init__.py +83 -0
- sage/middleware/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/api/__init__.py +22 -0
- sage/middleware/api/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/api/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/api/__pycache__/graph_api.cpython-311.opt-2.pyc +0 -0
- sage/middleware/api/__pycache__/graph_api.cpython-311.pyc +0 -0
- sage/middleware/api/__pycache__/kv_api.cpython-311.opt-2.pyc +0 -0
- sage/middleware/api/__pycache__/kv_api.cpython-311.pyc +0 -0
- sage/middleware/api/__pycache__/memory_api.cpython-311.opt-2.pyc +0 -0
- sage/middleware/api/__pycache__/memory_api.cpython-311.pyc +0 -0
- sage/middleware/api/__pycache__/vdb_api.cpython-311.opt-2.pyc +0 -0
- sage/middleware/api/__pycache__/vdb_api.cpython-311.pyc +0 -0
- sage/middleware/api/graph_api.py +74 -0
- sage/middleware/api/kv_api.py +45 -0
- sage/middleware/api/memory_api.py +64 -0
- sage/middleware/api/vdb_api.py +60 -0
- sage/middleware/enterprise/__init__.py +75 -0
- sage/middleware/enterprise/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/enterprise/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/enterprise/sage_db/__init__.py +132 -0
- sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
- sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-311.pyc +0 -0
- sage/middleware/enterprise/sage_db/python/__init__.py +7 -0
- sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
- sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-311.pyc +0 -0
- sage/middleware/enterprise/sage_db/python/sage_db.py +44 -0
- sage/middleware/enterprise/sage_db/sage_db.py +395 -0
- sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-311.opt-2.pyc +0 -0
- sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-311.pyc +0 -0
- sage/middleware/enterprise/sage_db/tests/test_python.py +144 -0
- sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.opt-2.pyc +0 -0
- sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.pyc +0 -0
- sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-311.pyc +0 -0
- sage/middleware/examples/__pycache__/microservices_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/examples/__pycache__/microservices_demo.cpython-311.pyc +0 -0
- sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-311.pyc +0 -0
- sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.pyc +0 -0
- sage/middleware/examples/api_usage_tutorial.py +339 -0
- sage/middleware/examples/dag_microservices_demo.py +220 -0
- sage/middleware/examples/microservices_demo.py +0 -0
- sage/middleware/examples/microservices_integration_demo.py +373 -0
- sage/middleware/examples/microservices_registration_demo.py +144 -0
- sage/middleware/py.typed +2 -0
- sage/middleware/services/graph/__init__.py +8 -0
- sage/middleware/services/graph/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/graph/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/services/graph/__pycache__/graph_index.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/graph/__pycache__/graph_index.cpython-311.pyc +0 -0
- sage/middleware/services/graph/__pycache__/graph_service.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/graph/__pycache__/graph_service.cpython-311.pyc +0 -0
- sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.pyc +0 -0
- sage/middleware/services/graph/examples/graph_demo.py +177 -0
- sage/middleware/services/graph/graph_index.py +194 -0
- sage/middleware/services/graph/graph_service.py +541 -0
- sage/middleware/services/graph/search_engine/__init__.py +0 -0
- sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.pyc +0 -0
- sage/middleware/services/graph/search_engine/base_graph_index.py +0 -0
- sage/middleware/services/kv/__init__.py +8 -0
- sage/middleware/services/kv/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/kv/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/services/kv/__pycache__/kv_service.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/kv/__pycache__/kv_service.cpython-311.pyc +0 -0
- sage/middleware/services/kv/examples/__pycache__/kv_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/kv/examples/__pycache__/kv_demo.cpython-311.pyc +0 -0
- sage/middleware/services/kv/examples/kv_demo.py +213 -0
- sage/middleware/services/kv/kv_service.py +306 -0
- sage/middleware/services/kv/search_engine/__init__.py +0 -0
- sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.pyc +0 -0
- sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.pyc +0 -0
- sage/middleware/services/kv/search_engine/base_kv_index.py +75 -0
- sage/middleware/services/kv/search_engine/bm25s_index.py +238 -0
- sage/middleware/services/memory/__init__.py +12 -0
- sage/middleware/services/memory/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/services/memory/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/__pycache__/memory_service.cpython-311.pyc +0 -0
- sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-311.pyc +0 -0
- sage/middleware/services/memory/examples/__pycache__/memory_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/examples/__pycache__/memory_demo.cpython-311.pyc +0 -0
- sage/middleware/services/memory/examples/dag_microservices_demo.py +220 -0
- sage/middleware/services/memory/examples/memory_demo.py +490 -0
- sage/middleware/services/memory/memory_collection/__pycache__/base_collection.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/memory_collection/__pycache__/base_collection.cpython-311.pyc +0 -0
- sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
- sage/middleware/services/memory/memory_collection/__pycache__/kv_collection.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/memory_collection/__pycache__/kv_collection.cpython-311.pyc +0 -0
- sage/middleware/services/memory/memory_collection/__pycache__/vdb_collection.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/memory_collection/__pycache__/vdb_collection.cpython-311.pyc +0 -0
- sage/middleware/services/memory/memory_collection/base_collection.py +0 -0
- sage/middleware/services/memory/memory_collection/graph_collection.py +0 -0
- sage/middleware/services/memory/memory_collection/kv_collection.py +0 -0
- sage/middleware/services/memory/memory_collection/vdb_collection.py +0 -0
- sage/middleware/services/memory/memory_service.py +474 -0
- sage/middleware/services/memory/utils/__init__.py +0 -0
- sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
- sage/middleware/services/memory/utils/path_utils.py +0 -0
- sage/middleware/services/vdb/__init__.py +8 -0
- sage/middleware/services/vdb/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/vdb/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.pyc +0 -0
- sage/middleware/services/vdb/examples/__pycache__/vdb_demo.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/vdb/examples/__pycache__/vdb_demo.cpython-311.pyc +0 -0
- sage/middleware/services/vdb/examples/vdb_demo.py +447 -0
- sage/middleware/services/vdb/search_engine/__init__.py +0 -0
- sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
- sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
- sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.pyc +0 -0
- sage/middleware/services/vdb/search_engine/base_vdb_index.py +58 -0
- sage/middleware/services/vdb/search_engine/faiss_index.py +461 -0
- sage/middleware/services/vdb/vdb_service.py +433 -0
- sage/middleware/utils/__init__.py +5 -0
- sage/middleware/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__init__.py +35 -0
- sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/hf.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/hf.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/jina.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/jina.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/openai.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/openai.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.opt-2.pyc +0 -0
- sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.pyc +0 -0
- sage/middleware/utils/embedding/_cohere.py +68 -0
- sage/middleware/utils/embedding/bedrock.py +174 -0
- sage/middleware/utils/embedding/embedding_api.py +12 -0
- sage/middleware/utils/embedding/embedding_model.py +150 -0
- sage/middleware/utils/embedding/hf.py +90 -0
- sage/middleware/utils/embedding/instructor.py +10 -0
- sage/middleware/utils/embedding/jina.py +115 -0
- sage/middleware/utils/embedding/lollms.py +100 -0
- sage/middleware/utils/embedding/mockembedder.py +46 -0
- sage/middleware/utils/embedding/nvidia_openai.py +97 -0
- sage/middleware/utils/embedding/ollama.py +97 -0
- sage/middleware/utils/embedding/openai.py +112 -0
- sage/middleware/utils/embedding/siliconcloud.py +133 -0
- sage/middleware/utils/embedding/zhipu.py +85 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import sys
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
if sys.version_info < (3, 9):
|
|
6
|
+
pass
|
|
7
|
+
else:
|
|
8
|
+
pass
|
|
9
|
+
|
|
10
|
+
import pipmaster as pm # Pipmaster for dynamic library install
|
|
11
|
+
|
|
12
|
+
# Dependencies should be installed via requirements.txt
|
|
13
|
+
# openai is required for this module
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
from openai import AsyncOpenAI
|
|
17
|
+
except ImportError:
|
|
18
|
+
raise ImportError(
|
|
19
|
+
"openai package is required for NVIDIA OpenAI embedding functionality. "
|
|
20
|
+
"Please install it via: pip install openai"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
async def nvidia_openai_embed(
|
|
24
|
+
text: str,
|
|
25
|
+
model: str = "nvidia/llama-3.2-nv-embedqa-1b-v1",
|
|
26
|
+
base_url: str = "https://integrate.api.nvidia.com/v1",
|
|
27
|
+
api_key: str = None,
|
|
28
|
+
input_type: str = "passage", # query for retrieval, passage for embedding
|
|
29
|
+
trunc: str = "NONE", # NONE or START or END
|
|
30
|
+
encode: str = "float", # float or base64
|
|
31
|
+
) -> list:
|
|
32
|
+
"""
|
|
33
|
+
Generate embedding for a single text using NVIDIA NIM-compatible OpenAI API.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
list[float]: The embedding vector.
|
|
37
|
+
"""
|
|
38
|
+
if api_key:
|
|
39
|
+
os.environ["OPENAI_API_KEY"] = api_key
|
|
40
|
+
|
|
41
|
+
openai_async_client = (
|
|
42
|
+
AsyncOpenAI() if base_url is None else AsyncOpenAI(base_url=base_url)
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
response = await openai_async_client.embeddings.create(
|
|
46
|
+
model=model,
|
|
47
|
+
input=text,
|
|
48
|
+
encoding_format=encode,
|
|
49
|
+
extra_body={"input_type": input_type, "truncate": trunc},
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
return response.data[0].embedding
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
import os
|
|
56
|
+
from openai import OpenAI # 同步 client
|
|
57
|
+
|
|
58
|
+
def nvidia_openai_embed_sync(
|
|
59
|
+
text: str,
|
|
60
|
+
model: str = "nvidia/llama-3.2-nv-embedqa-1b-v1",
|
|
61
|
+
base_url: str = "https://integrate.api.nvidia.com/v1",
|
|
62
|
+
api_key: str = None,
|
|
63
|
+
input_type: str = "passage", # query for retrieval, passage for embedding
|
|
64
|
+
trunc: str = "NONE", # NONE or START or END
|
|
65
|
+
encode: str = "float", # float or base64
|
|
66
|
+
) -> list[float]:
|
|
67
|
+
"""
|
|
68
|
+
同步版本:使用 NVIDIA NIM 接口生成文本 embedding。
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
text: 输入文本
|
|
72
|
+
model: 使用的模型 ID
|
|
73
|
+
base_url: 接口地址(默认为 NVIDIA 接口)
|
|
74
|
+
api_key: API 密钥(使用 OPENAI_API_KEY 环境变量)
|
|
75
|
+
input_type: 输入类型(passage / query)
|
|
76
|
+
trunc: 截断策略
|
|
77
|
+
encode: 返回格式(float / base64)
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
list[float]: 嵌入向量
|
|
81
|
+
"""
|
|
82
|
+
if api_key:
|
|
83
|
+
os.environ["OPENAI_API_KEY"] = api_key
|
|
84
|
+
|
|
85
|
+
client = OpenAI(base_url=base_url)
|
|
86
|
+
|
|
87
|
+
response = client.embeddings.create(
|
|
88
|
+
model=model,
|
|
89
|
+
input=text,
|
|
90
|
+
encoding_format=encode,
|
|
91
|
+
extra_body={
|
|
92
|
+
"input_type": input_type,
|
|
93
|
+
"truncate": trunc
|
|
94
|
+
},
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
return response.data[0].embedding
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
|
|
3
|
+
if sys.version_info < (3, 9):
|
|
4
|
+
from typing import AsyncIterator
|
|
5
|
+
else:
|
|
6
|
+
from collections.abc import AsyncIterator
|
|
7
|
+
|
|
8
|
+
import pipmaster as pm # Pipmaster for dynamic library install
|
|
9
|
+
|
|
10
|
+
# Dependencies should be installed via requirements.txt
|
|
11
|
+
# ollama and tenacity are required for this module to work
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
import ollama
|
|
15
|
+
except ImportError:
|
|
16
|
+
raise ImportError(
|
|
17
|
+
"ollama package is required for Ollama embedding functionality. "
|
|
18
|
+
"Please install it via: pip install ollama"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
import tenacity
|
|
23
|
+
except ImportError:
|
|
24
|
+
raise ImportError(
|
|
25
|
+
"tenacity package is required for Ollama embedding functionality. "
|
|
26
|
+
"Please install it via: pip install tenacity"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
import numpy as np
|
|
32
|
+
from typing import Union
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def ollama_embed(
|
|
38
|
+
text: str,
|
|
39
|
+
embed_model,
|
|
40
|
+
**kwargs
|
|
41
|
+
) -> list:
|
|
42
|
+
"""
|
|
43
|
+
Generate embedding for a single text using Ollama.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
text: A single input string
|
|
47
|
+
embed_model: The name of the Ollama embedding model
|
|
48
|
+
**kwargs: Optional arguments (e.g. base_url, api_key)
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
list[float]: The embedding vector
|
|
52
|
+
"""
|
|
53
|
+
import ollama
|
|
54
|
+
|
|
55
|
+
api_key = kwargs.pop("api_key", None)
|
|
56
|
+
headers = {
|
|
57
|
+
"Content-Type": "application/json",
|
|
58
|
+
"User-Agent": "SAGE/0.0",
|
|
59
|
+
}
|
|
60
|
+
if api_key:
|
|
61
|
+
headers["Authorization"] = api_key
|
|
62
|
+
kwargs["headers"] = headers
|
|
63
|
+
|
|
64
|
+
ollama_client = ollama.Client(**kwargs)
|
|
65
|
+
data = ollama_client.embed(model=embed_model, input=text)
|
|
66
|
+
return data["embedding"]
|
|
67
|
+
|
|
68
|
+
def ollama_embed_sync(
|
|
69
|
+
text: str,
|
|
70
|
+
embed_model,
|
|
71
|
+
**kwargs
|
|
72
|
+
) -> list[float]:
|
|
73
|
+
"""
|
|
74
|
+
同步版本:使用 Ollama 客户端生成 embedding 向量。
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
text: 输入文本
|
|
78
|
+
embed_model: 使用的模型名
|
|
79
|
+
**kwargs: 额外参数(可包含 base_url、api_key)
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
list[float]: embedding 向量
|
|
83
|
+
"""
|
|
84
|
+
import ollama
|
|
85
|
+
|
|
86
|
+
api_key = kwargs.pop("api_key", None)
|
|
87
|
+
headers = {
|
|
88
|
+
"Content-Type": "application/json",
|
|
89
|
+
"User-Agent": "SAGE/0.0",
|
|
90
|
+
}
|
|
91
|
+
if api_key:
|
|
92
|
+
headers["Authorization"] = api_key
|
|
93
|
+
kwargs["headers"] = headers
|
|
94
|
+
|
|
95
|
+
ollama_client = ollama.Client(**kwargs)
|
|
96
|
+
data = ollama_client.embed(model=embed_model, input=text)
|
|
97
|
+
return data["embedding"]
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import sys
|
|
3
|
+
import os
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if sys.version_info < (3, 9):
|
|
9
|
+
from typing import AsyncIterator
|
|
10
|
+
else:
|
|
11
|
+
from collections.abc import AsyncIterator
|
|
12
|
+
import pipmaster as pm # Pipmaster for dynamic library install
|
|
13
|
+
|
|
14
|
+
# Dependencies should be installed via requirements.txt
|
|
15
|
+
# openai is required for this module
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from openai import AsyncOpenAI # 确保导入了这个
|
|
19
|
+
except ImportError:
|
|
20
|
+
raise ImportError(
|
|
21
|
+
"openai package is required for OpenAI embedding functionality. "
|
|
22
|
+
"Please install it via: pip install openai"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
async def openai_embed(
|
|
26
|
+
text: str,
|
|
27
|
+
model: str = "text-embedding-3-small",
|
|
28
|
+
base_url: str = None,
|
|
29
|
+
api_key: str = None,
|
|
30
|
+
) -> list:
|
|
31
|
+
"""
|
|
32
|
+
Generate embedding for a single text using OpenAI Embedding API.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
text: Input string
|
|
36
|
+
model: OpenAI embedding model name
|
|
37
|
+
base_url: Optional custom endpoint
|
|
38
|
+
api_key: OpenAI API key
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
list[float]: The embedding vector
|
|
42
|
+
"""
|
|
43
|
+
if not api_key:
|
|
44
|
+
api_key = os.environ["OPENAI_API_KEY"]
|
|
45
|
+
|
|
46
|
+
default_headers = {
|
|
47
|
+
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_8) SAGE/0.0",
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
openai_async_client = (
|
|
52
|
+
AsyncOpenAI(default_headers=default_headers, api_key=api_key)
|
|
53
|
+
if base_url is None
|
|
54
|
+
else AsyncOpenAI(
|
|
55
|
+
base_url=base_url, default_headers=default_headers, api_key=api_key
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
response = await openai_async_client.embeddings.create(
|
|
60
|
+
model=model,
|
|
61
|
+
input=text,
|
|
62
|
+
encoding_format="float"
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
return response.data[0].embedding
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
import os
|
|
69
|
+
from openai import OpenAI # 同步版 client
|
|
70
|
+
from openai.types import CreateEmbeddingResponse
|
|
71
|
+
|
|
72
|
+
def openai_embed_sync(
|
|
73
|
+
text: str,
|
|
74
|
+
model: str = "text-embedding-3-small",
|
|
75
|
+
base_url: str = None,
|
|
76
|
+
api_key: str = None,
|
|
77
|
+
) -> list[float]:
|
|
78
|
+
"""
|
|
79
|
+
同步生成 OpenAI embedding。
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
text: 输入文本
|
|
83
|
+
model: OpenAI embedding 模型名
|
|
84
|
+
base_url: 可选自定义 API endpoint
|
|
85
|
+
api_key: OpenAI API 密钥
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
list[float]: embedding 向量
|
|
89
|
+
"""
|
|
90
|
+
if not api_key:
|
|
91
|
+
api_key = os.environ["OPENAI_API_KEY"]
|
|
92
|
+
|
|
93
|
+
default_headers = {
|
|
94
|
+
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_8) SAGE/0.0",
|
|
95
|
+
"Content-Type": "application/json",
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
openai_sync_client = (
|
|
99
|
+
OpenAI(default_headers=default_headers, api_key=api_key)
|
|
100
|
+
if base_url is None
|
|
101
|
+
else OpenAI(
|
|
102
|
+
base_url=base_url, default_headers=default_headers, api_key=api_key
|
|
103
|
+
)
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
response: CreateEmbeddingResponse = openai_sync_client.embeddings.create(
|
|
107
|
+
model=model,
|
|
108
|
+
input=text,
|
|
109
|
+
encoding_format="float"
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
return response.data[0].embedding
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
if sys.version_info < (3, 9):
|
|
6
|
+
pass
|
|
7
|
+
else:
|
|
8
|
+
pass
|
|
9
|
+
import pipmaster as pm # Pipmaster for dynamic library install
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
from openai import (
|
|
13
|
+
APIConnectionError,
|
|
14
|
+
RateLimitError,
|
|
15
|
+
APITimeoutError,
|
|
16
|
+
)
|
|
17
|
+
from tenacity import (
|
|
18
|
+
retry,
|
|
19
|
+
stop_after_attempt,
|
|
20
|
+
wait_exponential,
|
|
21
|
+
retry_if_exception_type,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
import numpy as np
|
|
25
|
+
import aiohttp
|
|
26
|
+
import base64
|
|
27
|
+
import struct
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
async def siliconcloud_embedding(
|
|
33
|
+
text: str,
|
|
34
|
+
model: str = "netease-youdao/bce-embedding-base_v1",
|
|
35
|
+
base_url: str = "https://api.siliconflow.cn/v1/embeddings",
|
|
36
|
+
max_token_size: int = 512,
|
|
37
|
+
api_key: str = None,
|
|
38
|
+
) -> list:
|
|
39
|
+
"""
|
|
40
|
+
Generate embedding for a single text using SiliconCloud (NetEase Youdao).
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
text: Input string
|
|
44
|
+
model: Embedding model name
|
|
45
|
+
base_url: API endpoint
|
|
46
|
+
max_token_size: Max text length in tokens (cut if needed)
|
|
47
|
+
api_key: Your SiliconCloud API key
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
list[float]: The embedding vector
|
|
51
|
+
"""
|
|
52
|
+
if api_key and not api_key.startswith("Bearer "):
|
|
53
|
+
api_key = "Bearer " + api_key
|
|
54
|
+
|
|
55
|
+
headers = {
|
|
56
|
+
"Authorization": api_key,
|
|
57
|
+
"Content-Type": "application/json",
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
text = text[:max_token_size]
|
|
61
|
+
payload = {
|
|
62
|
+
"model": model,
|
|
63
|
+
"input": [text],
|
|
64
|
+
"encoding_format": "base64",
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async with aiohttp.ClientSession() as session:
|
|
68
|
+
async with session.post(base_url, headers=headers, json=payload) as response:
|
|
69
|
+
content = await response.json()
|
|
70
|
+
if "code" in content:
|
|
71
|
+
raise ValueError(content)
|
|
72
|
+
base64_string = content["data"][0]["embedding"]
|
|
73
|
+
|
|
74
|
+
decode_bytes = base64.b64decode(base64_string)
|
|
75
|
+
n = len(decode_bytes) // 4
|
|
76
|
+
float_array = struct.unpack("<" + "f" * n, decode_bytes)
|
|
77
|
+
return list(float_array)
|
|
78
|
+
|
|
79
|
+
import requests
|
|
80
|
+
import base64
|
|
81
|
+
import struct
|
|
82
|
+
|
|
83
|
+
def siliconcloud_embedding_sync(
|
|
84
|
+
text: str,
|
|
85
|
+
model: str = "netease-youdao/bce-embedding-base_v1",
|
|
86
|
+
base_url: str = "https://api.siliconflow.cn/v1/embeddings",
|
|
87
|
+
max_token_size: int = 512,
|
|
88
|
+
api_key: str = None,
|
|
89
|
+
) -> list[float]:
|
|
90
|
+
"""
|
|
91
|
+
同步版本:使用 SiliconCloud (NetEase Youdao) 接口获取文本 embedding。
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
text: 输入文本
|
|
95
|
+
model: 模型名称
|
|
96
|
+
base_url: 接口地址
|
|
97
|
+
max_token_size: 截断长度(按字符)
|
|
98
|
+
api_key: API 密钥(可选,带或不带 "Bearer ")
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
list[float]: embedding 向量
|
|
102
|
+
"""
|
|
103
|
+
if api_key and not api_key.startswith("Bearer "):
|
|
104
|
+
api_key = "Bearer " + api_key
|
|
105
|
+
|
|
106
|
+
headers = {
|
|
107
|
+
"Authorization": api_key,
|
|
108
|
+
"Content-Type": "application/json",
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
text = text[:max_token_size]
|
|
112
|
+
payload = {
|
|
113
|
+
"model": model,
|
|
114
|
+
"input": [text],
|
|
115
|
+
"encoding_format": "base64",
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
response = requests.post(base_url, headers=headers, json=payload)
|
|
120
|
+
response.raise_for_status()
|
|
121
|
+
content = response.json()
|
|
122
|
+
|
|
123
|
+
if "code" in content:
|
|
124
|
+
raise ValueError(f"SiliconCloud API error: {content}")
|
|
125
|
+
|
|
126
|
+
base64_string = content["data"][0]["embedding"]
|
|
127
|
+
decode_bytes = base64.b64decode(base64_string)
|
|
128
|
+
n = len(decode_bytes) // 4
|
|
129
|
+
float_array = struct.unpack("<" + "f" * n, decode_bytes)
|
|
130
|
+
return list(float_array)
|
|
131
|
+
|
|
132
|
+
except Exception as e:
|
|
133
|
+
raise RuntimeError(f"SiliconCloud embedding failed: {str(e)}")
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import re
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
if sys.version_info < (3, 9):
|
|
7
|
+
pass
|
|
8
|
+
else:
|
|
9
|
+
pass
|
|
10
|
+
import pipmaster as pm # Pipmaster for dynamic library install
|
|
11
|
+
|
|
12
|
+
# Dependencies should be installed via requirements.txt
|
|
13
|
+
# zhipuai is required for this module
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
import zhipuai
|
|
17
|
+
except ImportError:
|
|
18
|
+
raise ImportError(
|
|
19
|
+
"zhipuai package is required for ZhipuAI embedding functionality. "
|
|
20
|
+
"Please install it via: pip install zhipuai"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
async def zhipu_embedding(
|
|
25
|
+
text: str,
|
|
26
|
+
model: str = "embedding-3",
|
|
27
|
+
api_key: str = None,
|
|
28
|
+
**kwargs
|
|
29
|
+
) -> list:
|
|
30
|
+
"""
|
|
31
|
+
Generate embedding for a single text using ZhipuAI.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
text: Input string
|
|
35
|
+
model: Embedding model name
|
|
36
|
+
api_key: ZhipuAI API key
|
|
37
|
+
**kwargs: Additional arguments to ZhipuAI client
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
list[float]: Embedding vector
|
|
41
|
+
"""
|
|
42
|
+
try:
|
|
43
|
+
from zhipuai import ZhipuAI
|
|
44
|
+
except ImportError:
|
|
45
|
+
raise ImportError("Please install zhipuai before using this backend.")
|
|
46
|
+
|
|
47
|
+
client = ZhipuAI(api_key=api_key) if api_key else ZhipuAI()
|
|
48
|
+
|
|
49
|
+
try:
|
|
50
|
+
response = client.embeddings.create(model=model, input=[text], **kwargs)
|
|
51
|
+
return response.data[0].embedding
|
|
52
|
+
except Exception as e:
|
|
53
|
+
raise Exception(f"Error calling ChatGLM Embedding API: {str(e)}")
|
|
54
|
+
|
|
55
|
+
def zhipu_embedding_sync(
|
|
56
|
+
text: str,
|
|
57
|
+
model: str = "embedding-3",
|
|
58
|
+
api_key: str = None,
|
|
59
|
+
**kwargs
|
|
60
|
+
) -> list[float]:
|
|
61
|
+
"""
|
|
62
|
+
同步调用 ZhipuAI 生成 embedding 向量。
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
text: 输入字符串
|
|
66
|
+
model: 使用的 ZhipuAI 模型名称
|
|
67
|
+
api_key: API 密钥(可选)
|
|
68
|
+
**kwargs: 额外参数
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
list[float]: 生成的 embedding 向量
|
|
72
|
+
"""
|
|
73
|
+
try:
|
|
74
|
+
from zhipuai import ZhipuAI
|
|
75
|
+
except ImportError:
|
|
76
|
+
raise ImportError("Please install zhipuai before using this backend.")
|
|
77
|
+
|
|
78
|
+
client = ZhipuAI(api_key=api_key) if api_key else ZhipuAI()
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
response = client.embeddings.create(model=model, input=[text], **kwargs)
|
|
82
|
+
return response.data[0].embedding
|
|
83
|
+
except Exception as e:
|
|
84
|
+
raise Exception(f"Error calling ChatGLM Embedding API: {str(e)}")
|
|
85
|
+
|