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.

Files changed (191) hide show
  1. isage_middleware-0.1.0.dist-info/METADATA +424 -0
  2. isage_middleware-0.1.0.dist-info/RECORD +191 -0
  3. isage_middleware-0.1.0.dist-info/WHEEL +5 -0
  4. isage_middleware-0.1.0.dist-info/top_level.txt +1 -0
  5. sage/__init__.py +2 -0
  6. sage/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  7. sage/__pycache__/__init__.cpython-311.pyc +0 -0
  8. sage/middleware/__init__.py +83 -0
  9. sage/middleware/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  10. sage/middleware/__pycache__/__init__.cpython-311.pyc +0 -0
  11. sage/middleware/api/__init__.py +22 -0
  12. sage/middleware/api/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  13. sage/middleware/api/__pycache__/__init__.cpython-311.pyc +0 -0
  14. sage/middleware/api/__pycache__/graph_api.cpython-311.opt-2.pyc +0 -0
  15. sage/middleware/api/__pycache__/graph_api.cpython-311.pyc +0 -0
  16. sage/middleware/api/__pycache__/kv_api.cpython-311.opt-2.pyc +0 -0
  17. sage/middleware/api/__pycache__/kv_api.cpython-311.pyc +0 -0
  18. sage/middleware/api/__pycache__/memory_api.cpython-311.opt-2.pyc +0 -0
  19. sage/middleware/api/__pycache__/memory_api.cpython-311.pyc +0 -0
  20. sage/middleware/api/__pycache__/vdb_api.cpython-311.opt-2.pyc +0 -0
  21. sage/middleware/api/__pycache__/vdb_api.cpython-311.pyc +0 -0
  22. sage/middleware/api/graph_api.py +74 -0
  23. sage/middleware/api/kv_api.py +45 -0
  24. sage/middleware/api/memory_api.py +64 -0
  25. sage/middleware/api/vdb_api.py +60 -0
  26. sage/middleware/enterprise/__init__.py +75 -0
  27. sage/middleware/enterprise/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  28. sage/middleware/enterprise/__pycache__/__init__.cpython-311.pyc +0 -0
  29. sage/middleware/enterprise/sage_db/__init__.py +132 -0
  30. sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  31. sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-311.pyc +0 -0
  32. sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  33. sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-311.pyc +0 -0
  34. sage/middleware/enterprise/sage_db/python/__init__.py +7 -0
  35. sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  36. sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-311.pyc +0 -0
  37. sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  38. sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-311.pyc +0 -0
  39. sage/middleware/enterprise/sage_db/python/sage_db.py +44 -0
  40. sage/middleware/enterprise/sage_db/sage_db.py +395 -0
  41. sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-311.opt-2.pyc +0 -0
  42. sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-311.pyc +0 -0
  43. sage/middleware/enterprise/sage_db/tests/test_python.py +144 -0
  44. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.opt-2.pyc +0 -0
  45. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.pyc +0 -0
  46. sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-311.opt-2.pyc +0 -0
  47. sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-311.pyc +0 -0
  48. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.opt-2.pyc +0 -0
  49. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.pyc +0 -0
  50. sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-311.opt-2.pyc +0 -0
  51. sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-311.pyc +0 -0
  52. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.opt-2.pyc +0 -0
  53. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.pyc +0 -0
  54. sage/middleware/examples/api_usage_tutorial.py +339 -0
  55. sage/middleware/examples/dag_microservices_demo.py +220 -0
  56. sage/middleware/examples/microservices_demo.py +0 -0
  57. sage/middleware/examples/microservices_integration_demo.py +373 -0
  58. sage/middleware/examples/microservices_registration_demo.py +144 -0
  59. sage/middleware/py.typed +2 -0
  60. sage/middleware/services/graph/__init__.py +8 -0
  61. sage/middleware/services/graph/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  62. sage/middleware/services/graph/__pycache__/__init__.cpython-311.pyc +0 -0
  63. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.opt-2.pyc +0 -0
  64. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.pyc +0 -0
  65. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.opt-2.pyc +0 -0
  66. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.pyc +0 -0
  67. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.opt-2.pyc +0 -0
  68. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.pyc +0 -0
  69. sage/middleware/services/graph/examples/graph_demo.py +177 -0
  70. sage/middleware/services/graph/graph_index.py +194 -0
  71. sage/middleware/services/graph/graph_service.py +541 -0
  72. sage/middleware/services/graph/search_engine/__init__.py +0 -0
  73. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  74. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  75. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
  76. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.pyc +0 -0
  77. sage/middleware/services/graph/search_engine/base_graph_index.py +0 -0
  78. sage/middleware/services/kv/__init__.py +8 -0
  79. sage/middleware/services/kv/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  80. sage/middleware/services/kv/__pycache__/__init__.cpython-311.pyc +0 -0
  81. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.opt-2.pyc +0 -0
  82. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.pyc +0 -0
  83. sage/middleware/services/kv/examples/__pycache__/kv_demo.cpython-311.opt-2.pyc +0 -0
  84. sage/middleware/services/kv/examples/__pycache__/kv_demo.cpython-311.pyc +0 -0
  85. sage/middleware/services/kv/examples/kv_demo.py +213 -0
  86. sage/middleware/services/kv/kv_service.py +306 -0
  87. sage/middleware/services/kv/search_engine/__init__.py +0 -0
  88. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  89. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  90. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
  91. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.pyc +0 -0
  92. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
  93. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.pyc +0 -0
  94. sage/middleware/services/kv/search_engine/base_kv_index.py +75 -0
  95. sage/middleware/services/kv/search_engine/bm25s_index.py +238 -0
  96. sage/middleware/services/memory/__init__.py +12 -0
  97. sage/middleware/services/memory/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  98. sage/middleware/services/memory/__pycache__/__init__.cpython-311.pyc +0 -0
  99. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
  100. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.pyc +0 -0
  101. sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-311.opt-2.pyc +0 -0
  102. sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-311.pyc +0 -0
  103. sage/middleware/services/memory/examples/__pycache__/memory_demo.cpython-311.opt-2.pyc +0 -0
  104. sage/middleware/services/memory/examples/__pycache__/memory_demo.cpython-311.pyc +0 -0
  105. sage/middleware/services/memory/examples/dag_microservices_demo.py +220 -0
  106. sage/middleware/services/memory/examples/memory_demo.py +490 -0
  107. sage/middleware/services/memory/memory_collection/__pycache__/base_collection.cpython-311.opt-2.pyc +0 -0
  108. sage/middleware/services/memory/memory_collection/__pycache__/base_collection.cpython-311.pyc +0 -0
  109. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
  110. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
  111. sage/middleware/services/memory/memory_collection/__pycache__/kv_collection.cpython-311.opt-2.pyc +0 -0
  112. sage/middleware/services/memory/memory_collection/__pycache__/kv_collection.cpython-311.pyc +0 -0
  113. sage/middleware/services/memory/memory_collection/__pycache__/vdb_collection.cpython-311.opt-2.pyc +0 -0
  114. sage/middleware/services/memory/memory_collection/__pycache__/vdb_collection.cpython-311.pyc +0 -0
  115. sage/middleware/services/memory/memory_collection/base_collection.py +0 -0
  116. sage/middleware/services/memory/memory_collection/graph_collection.py +0 -0
  117. sage/middleware/services/memory/memory_collection/kv_collection.py +0 -0
  118. sage/middleware/services/memory/memory_collection/vdb_collection.py +0 -0
  119. sage/middleware/services/memory/memory_service.py +474 -0
  120. sage/middleware/services/memory/utils/__init__.py +0 -0
  121. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  122. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  123. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
  124. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
  125. sage/middleware/services/memory/utils/path_utils.py +0 -0
  126. sage/middleware/services/vdb/__init__.py +8 -0
  127. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  128. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.pyc +0 -0
  129. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.opt-2.pyc +0 -0
  130. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.pyc +0 -0
  131. sage/middleware/services/vdb/examples/__pycache__/vdb_demo.cpython-311.opt-2.pyc +0 -0
  132. sage/middleware/services/vdb/examples/__pycache__/vdb_demo.cpython-311.pyc +0 -0
  133. sage/middleware/services/vdb/examples/vdb_demo.py +447 -0
  134. sage/middleware/services/vdb/search_engine/__init__.py +0 -0
  135. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  136. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  137. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
  138. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
  139. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
  140. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.pyc +0 -0
  141. sage/middleware/services/vdb/search_engine/base_vdb_index.py +58 -0
  142. sage/middleware/services/vdb/search_engine/faiss_index.py +461 -0
  143. sage/middleware/services/vdb/vdb_service.py +433 -0
  144. sage/middleware/utils/__init__.py +5 -0
  145. sage/middleware/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  146. sage/middleware/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  147. sage/middleware/utils/embedding/__init__.py +35 -0
  148. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  149. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.pyc +0 -0
  150. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.opt-2.pyc +0 -0
  151. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.pyc +0 -0
  152. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.opt-2.pyc +0 -0
  153. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.pyc +0 -0
  154. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.opt-2.pyc +0 -0
  155. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.pyc +0 -0
  156. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.opt-2.pyc +0 -0
  157. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.pyc +0 -0
  158. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.opt-2.pyc +0 -0
  159. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.pyc +0 -0
  160. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.opt-2.pyc +0 -0
  161. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.pyc +0 -0
  162. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.opt-2.pyc +0 -0
  163. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.pyc +0 -0
  164. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.opt-2.pyc +0 -0
  165. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.pyc +0 -0
  166. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.opt-2.pyc +0 -0
  167. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.pyc +0 -0
  168. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.opt-2.pyc +0 -0
  169. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.pyc +0 -0
  170. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.opt-2.pyc +0 -0
  171. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.pyc +0 -0
  172. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.opt-2.pyc +0 -0
  173. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.pyc +0 -0
  174. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.opt-2.pyc +0 -0
  175. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.pyc +0 -0
  176. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.opt-2.pyc +0 -0
  177. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.pyc +0 -0
  178. sage/middleware/utils/embedding/_cohere.py +68 -0
  179. sage/middleware/utils/embedding/bedrock.py +174 -0
  180. sage/middleware/utils/embedding/embedding_api.py +12 -0
  181. sage/middleware/utils/embedding/embedding_model.py +150 -0
  182. sage/middleware/utils/embedding/hf.py +90 -0
  183. sage/middleware/utils/embedding/instructor.py +10 -0
  184. sage/middleware/utils/embedding/jina.py +115 -0
  185. sage/middleware/utils/embedding/lollms.py +100 -0
  186. sage/middleware/utils/embedding/mockembedder.py +46 -0
  187. sage/middleware/utils/embedding/nvidia_openai.py +97 -0
  188. sage/middleware/utils/embedding/ollama.py +97 -0
  189. sage/middleware/utils/embedding/openai.py +112 -0
  190. sage/middleware/utils/embedding/siliconcloud.py +133 -0
  191. 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
+