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,339 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SAGE Services API Usage Tutorial
|
|
3
|
+
展示如何正确使用SAGE微服务的API接口
|
|
4
|
+
"""
|
|
5
|
+
import asyncio
|
|
6
|
+
import numpy as np
|
|
7
|
+
from typing import List, Dict, Any
|
|
8
|
+
|
|
9
|
+
# 导入API接口
|
|
10
|
+
from sage.middleware.api import KVServiceAPI, VDBServiceAPI, MemoryServiceAPI, GraphServiceAPI
|
|
11
|
+
|
|
12
|
+
# 导入具体服务实现和工厂函数
|
|
13
|
+
from sage.middleware import (
|
|
14
|
+
KVService, VDBService, MemoryService, GraphService,
|
|
15
|
+
create_kv_service_factory, create_vdb_service_factory,
|
|
16
|
+
create_memory_service_factory, create_graph_service_factory
|
|
17
|
+
)
|
|
18
|
+
from sage.core.api.local_environment import LocalEnvironment
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ServiceAPITutorial:
|
|
22
|
+
"""SAGE服务API使用教程"""
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
self.env = LocalEnvironment("api_tutorial_demo")
|
|
26
|
+
self.setup_services()
|
|
27
|
+
|
|
28
|
+
def setup_services(self):
|
|
29
|
+
"""设置所有服务"""
|
|
30
|
+
print("🚀 Setting up SAGE Services for API Tutorial")
|
|
31
|
+
print("=" * 60)
|
|
32
|
+
|
|
33
|
+
# 注册KV服务
|
|
34
|
+
kv_factory = create_kv_service_factory(
|
|
35
|
+
service_name="tutorial_kv",
|
|
36
|
+
backend_type="memory",
|
|
37
|
+
max_size=10000
|
|
38
|
+
)
|
|
39
|
+
self.env.register_service_factory("tutorial_kv", kv_factory)
|
|
40
|
+
|
|
41
|
+
# 注册VDB服务
|
|
42
|
+
vdb_factory = create_vdb_service_factory(
|
|
43
|
+
service_name="tutorial_vdb",
|
|
44
|
+
embedding_dimension=384,
|
|
45
|
+
max_vectors=10000
|
|
46
|
+
)
|
|
47
|
+
self.env.register_service_factory("tutorial_vdb", vdb_factory)
|
|
48
|
+
|
|
49
|
+
# 注册Memory服务
|
|
50
|
+
memory_factory = create_memory_service_factory(
|
|
51
|
+
service_name="tutorial_memory",
|
|
52
|
+
kv_service_name="tutorial_kv",
|
|
53
|
+
vdb_service_name="tutorial_vdb"
|
|
54
|
+
)
|
|
55
|
+
self.env.register_service_factory("tutorial_memory", memory_factory)
|
|
56
|
+
|
|
57
|
+
print("✅ All services registered successfully")
|
|
58
|
+
|
|
59
|
+
def demonstrate_kv_api(self):
|
|
60
|
+
"""演示KV API的正确使用方式"""
|
|
61
|
+
print("\n📦 KV Service API Tutorial")
|
|
62
|
+
print("-" * 40)
|
|
63
|
+
|
|
64
|
+
# 在实际应用中,你会从环境中获取服务代理
|
|
65
|
+
# 这里我们模拟API调用的预期行为
|
|
66
|
+
|
|
67
|
+
print("💡 KV Service API Interface:")
|
|
68
|
+
print(" - put(key, value) -> bool")
|
|
69
|
+
print(" - get(key) -> Any")
|
|
70
|
+
print(" - delete(key) -> bool")
|
|
71
|
+
print(" - exists(key) -> bool")
|
|
72
|
+
print(" - list_keys(prefix) -> List[str]")
|
|
73
|
+
print(" - size() -> int")
|
|
74
|
+
print(" - clear() -> bool")
|
|
75
|
+
|
|
76
|
+
print("\n📝 Expected Usage Pattern:")
|
|
77
|
+
usage_example = '''
|
|
78
|
+
# 获取KV服务代理
|
|
79
|
+
kv_service = env.get_service_proxy("tutorial_kv")
|
|
80
|
+
|
|
81
|
+
# 基本操作
|
|
82
|
+
success = kv_service.put("user:123", {"name": "Alice", "age": 30})
|
|
83
|
+
user_data = kv_service.get("user:123")
|
|
84
|
+
exists = kv_service.exists("user:123")
|
|
85
|
+
|
|
86
|
+
# 批量操作
|
|
87
|
+
keys = kv_service.list_keys("user:")
|
|
88
|
+
total_size = kv_service.size()
|
|
89
|
+
|
|
90
|
+
# 删除操作
|
|
91
|
+
deleted = kv_service.delete("user:123")
|
|
92
|
+
'''
|
|
93
|
+
print(usage_example)
|
|
94
|
+
|
|
95
|
+
# 模拟执行结果
|
|
96
|
+
print("🎯 Expected Results:")
|
|
97
|
+
print(" put() -> True")
|
|
98
|
+
print(" get() -> {'name': 'Alice', 'age': 30}")
|
|
99
|
+
print(" exists() -> True")
|
|
100
|
+
print(" list_keys('user:') -> ['user:123']")
|
|
101
|
+
print(" size() -> 1")
|
|
102
|
+
print(" delete() -> True")
|
|
103
|
+
|
|
104
|
+
def demonstrate_vdb_api(self):
|
|
105
|
+
"""演示VDB API的正确使用方式"""
|
|
106
|
+
print("\n🗂️ VDB Service API Tutorial")
|
|
107
|
+
print("-" * 40)
|
|
108
|
+
|
|
109
|
+
print("💡 VDB Service API Interface:")
|
|
110
|
+
print(" - add_vectors(documents) -> List[str]")
|
|
111
|
+
print(" - search(query_vector, top_k, threshold) -> List[Dict]")
|
|
112
|
+
print(" - get_vector(doc_id) -> Dict")
|
|
113
|
+
print(" - delete_vectors(doc_ids) -> bool")
|
|
114
|
+
print(" - update_vector(doc_id, document) -> bool")
|
|
115
|
+
print(" - count() -> int")
|
|
116
|
+
print(" - save_index(path) -> bool")
|
|
117
|
+
print(" - load_index(path) -> bool")
|
|
118
|
+
|
|
119
|
+
print("\n📝 Expected Usage Pattern:")
|
|
120
|
+
usage_example = '''
|
|
121
|
+
# 获取VDB服务代理
|
|
122
|
+
vdb_service = env.get_service_proxy("tutorial_vdb")
|
|
123
|
+
|
|
124
|
+
# 添加向量文档
|
|
125
|
+
documents = [{
|
|
126
|
+
"id": "doc_001",
|
|
127
|
+
"vector": [0.1, 0.2, 0.3, ...], # 384维向量
|
|
128
|
+
"text": "这是一个示例文档",
|
|
129
|
+
"metadata": {"category": "example"}
|
|
130
|
+
}]
|
|
131
|
+
doc_ids = vdb_service.add_vectors(documents)
|
|
132
|
+
|
|
133
|
+
# 向量搜索
|
|
134
|
+
query_vector = [0.1, 0.2, 0.3, ...] # 查询向量
|
|
135
|
+
results = vdb_service.search(
|
|
136
|
+
query_vector=query_vector,
|
|
137
|
+
top_k=5,
|
|
138
|
+
similarity_threshold=0.8
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# 获取特定文档
|
|
142
|
+
document = vdb_service.get_vector("doc_001")
|
|
143
|
+
|
|
144
|
+
# 更新和删除
|
|
145
|
+
updated = vdb_service.update_vector("doc_001", new_document)
|
|
146
|
+
deleted = vdb_service.delete_vectors(["doc_001"])
|
|
147
|
+
'''
|
|
148
|
+
print(usage_example)
|
|
149
|
+
|
|
150
|
+
print("🎯 Expected Results:")
|
|
151
|
+
print(" add_vectors() -> ['doc_001']")
|
|
152
|
+
print(" search() -> [{'id': 'doc_001', 'score': 0.95, ...}]")
|
|
153
|
+
print(" get_vector() -> {'id': 'doc_001', 'vector': [...], ...}")
|
|
154
|
+
print(" count() -> 1")
|
|
155
|
+
|
|
156
|
+
def demonstrate_memory_api(self):
|
|
157
|
+
"""演示Memory API的正确使用方式"""
|
|
158
|
+
print("\n🧠 Memory Service API Tutorial")
|
|
159
|
+
print("-" * 40)
|
|
160
|
+
|
|
161
|
+
print("💡 Memory Service API Interface (High-level):")
|
|
162
|
+
print(" - store_memory(content, vector, session_id, ...) -> str")
|
|
163
|
+
print(" - retrieve_memories(query_vector, session_id, ...) -> List[Dict]")
|
|
164
|
+
print(" - get_memory(memory_id) -> Dict")
|
|
165
|
+
print(" - delete_memory(memory_id) -> bool")
|
|
166
|
+
print(" - search_memories(query, session_id, ...) -> List[Dict]")
|
|
167
|
+
print(" - get_session_memories(session_id) -> List[Dict]")
|
|
168
|
+
print(" - clear_session_memories(session_id) -> bool")
|
|
169
|
+
|
|
170
|
+
print("\n📝 Expected Usage Pattern:")
|
|
171
|
+
usage_example = '''
|
|
172
|
+
# 获取Memory服务代理(高级编排服务)
|
|
173
|
+
memory_service = env.get_service_proxy("tutorial_memory")
|
|
174
|
+
|
|
175
|
+
# 存储记忆(自动同时存储到KV和VDB)
|
|
176
|
+
memory_id = memory_service.store_memory(
|
|
177
|
+
content="用户询问了关于Python的问题",
|
|
178
|
+
vector=[0.1, 0.2, 0.3, ...], # 内容的向量表示
|
|
179
|
+
session_id="session_123",
|
|
180
|
+
memory_type="conversation",
|
|
181
|
+
metadata={"topic": "programming", "language": "python"}
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# 检索相关记忆(基于向量相似性)
|
|
185
|
+
related_memories = memory_service.retrieve_memories(
|
|
186
|
+
query_vector=[0.1, 0.2, 0.3, ...],
|
|
187
|
+
session_id="session_123",
|
|
188
|
+
top_k=5
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
# 文本搜索记忆
|
|
192
|
+
search_results = memory_service.search_memories(
|
|
193
|
+
query="Python",
|
|
194
|
+
session_id="session_123",
|
|
195
|
+
top_k=10
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# 获取会话的所有记忆
|
|
199
|
+
session_memories = memory_service.get_session_memories("session_123")
|
|
200
|
+
'''
|
|
201
|
+
print(usage_example)
|
|
202
|
+
|
|
203
|
+
print("🎯 Expected Results:")
|
|
204
|
+
print(" store_memory() -> 'memory_uuid_123'")
|
|
205
|
+
print(" retrieve_memories() -> [{'id': 'memory_uuid_123', 'score': 0.92, ...}]")
|
|
206
|
+
print(" search_memories() -> [{'id': 'memory_uuid_123', 'content': '...', ...}]")
|
|
207
|
+
|
|
208
|
+
def demonstrate_api_composition(self):
|
|
209
|
+
"""演示如何组合使用多个API"""
|
|
210
|
+
print("\n🔗 API Composition Tutorial")
|
|
211
|
+
print("-" * 40)
|
|
212
|
+
|
|
213
|
+
print("💡 实际应用场景: 智能问答系统")
|
|
214
|
+
|
|
215
|
+
composition_example = '''
|
|
216
|
+
class IntelligentQASystem:
|
|
217
|
+
"""智能问答系统 - 展示API组合使用"""
|
|
218
|
+
|
|
219
|
+
def __init__(self, env):
|
|
220
|
+
# 获取各种服务代理
|
|
221
|
+
self.kv_service = env.get_service_proxy("tutorial_kv")
|
|
222
|
+
self.vdb_service = env.get_service_proxy("tutorial_vdb")
|
|
223
|
+
self.memory_service = env.get_service_proxy("tutorial_memory")
|
|
224
|
+
|
|
225
|
+
async def process_question(self, user_id: str, question: str):
|
|
226
|
+
"""处理用户问题"""
|
|
227
|
+
|
|
228
|
+
# 1. 从KV服务获取用户上下文
|
|
229
|
+
user_context = self.kv_service.get(f"user_context:{user_id}")
|
|
230
|
+
|
|
231
|
+
# 2. 将问题转换为向量(使用embedding工具)
|
|
232
|
+
question_vector = embed_text(question) # 假设的embedding函数
|
|
233
|
+
|
|
234
|
+
# 3. 使用Memory服务检索相关记忆
|
|
235
|
+
related_memories = self.memory_service.retrieve_memories(
|
|
236
|
+
query_vector=question_vector,
|
|
237
|
+
session_id=user_context.get("session_id"),
|
|
238
|
+
top_k=5
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# 4. 直接在VDB中搜索知识库
|
|
242
|
+
knowledge_results = self.vdb_service.search(
|
|
243
|
+
query_vector=question_vector,
|
|
244
|
+
top_k=10,
|
|
245
|
+
similarity_threshold=0.7
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# 5. 生成回答(使用LLM)
|
|
249
|
+
answer = generate_answer(question, related_memories, knowledge_results)
|
|
250
|
+
|
|
251
|
+
# 6. 存储新的对话记忆
|
|
252
|
+
self.memory_service.store_memory(
|
|
253
|
+
content=f"Q: {question}\\nA: {answer}",
|
|
254
|
+
vector=question_vector,
|
|
255
|
+
session_id=user_context.get("session_id"),
|
|
256
|
+
memory_type="qa_pair"
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
# 7. 更新用户上下文
|
|
260
|
+
user_context["last_question"] = question
|
|
261
|
+
self.kv_service.put(f"user_context:{user_id}", user_context)
|
|
262
|
+
|
|
263
|
+
return answer
|
|
264
|
+
'''
|
|
265
|
+
print(composition_example)
|
|
266
|
+
|
|
267
|
+
print("\n🎯 这个例子展示了:")
|
|
268
|
+
print(" ✅ KV服务用于快速的上下文存取")
|
|
269
|
+
print(" ✅ VDB服务用于语义相似性搜索")
|
|
270
|
+
print(" ✅ Memory服务用于高级记忆管理")
|
|
271
|
+
print(" ✅ 各服务协同工作完成复杂任务")
|
|
272
|
+
|
|
273
|
+
def demonstrate_error_handling(self):
|
|
274
|
+
"""演示API错误处理最佳实践"""
|
|
275
|
+
print("\n⚠️ Error Handling Best Practices")
|
|
276
|
+
print("-" * 40)
|
|
277
|
+
|
|
278
|
+
error_handling_example = '''
|
|
279
|
+
# 正确的错误处理方式
|
|
280
|
+
try:
|
|
281
|
+
# 尝试获取服务代理
|
|
282
|
+
kv_service = env.get_service_proxy("tutorial_kv")
|
|
283
|
+
|
|
284
|
+
# API调用
|
|
285
|
+
result = kv_service.get("some_key")
|
|
286
|
+
if result is None:
|
|
287
|
+
print("Key not found")
|
|
288
|
+
else:
|
|
289
|
+
print(f"Retrieved: {result}")
|
|
290
|
+
|
|
291
|
+
except ServiceNotAvailableError:
|
|
292
|
+
print("KV service is not available")
|
|
293
|
+
except ServiceTimeoutError:
|
|
294
|
+
print("KV service call timed out")
|
|
295
|
+
except Exception as e:
|
|
296
|
+
print(f"Unexpected error: {e}")
|
|
297
|
+
|
|
298
|
+
# 批量操作的错误处理
|
|
299
|
+
documents = [...] # 大量文档
|
|
300
|
+
batch_size = 100
|
|
301
|
+
|
|
302
|
+
for i in range(0, len(documents), batch_size):
|
|
303
|
+
batch = documents[i:i+batch_size]
|
|
304
|
+
try:
|
|
305
|
+
doc_ids = vdb_service.add_vectors(batch)
|
|
306
|
+
print(f"Successfully added batch {i//batch_size + 1}")
|
|
307
|
+
except Exception as e:
|
|
308
|
+
print(f"Failed to add batch {i//batch_size + 1}: {e}")
|
|
309
|
+
# 可以选择重试或跳过
|
|
310
|
+
'''
|
|
311
|
+
print(error_handling_example)
|
|
312
|
+
|
|
313
|
+
def run_tutorial(self):
|
|
314
|
+
"""运行完整的API教程"""
|
|
315
|
+
print("🎓 SAGE Services API Complete Tutorial")
|
|
316
|
+
print("=" * 60)
|
|
317
|
+
|
|
318
|
+
self.demonstrate_kv_api()
|
|
319
|
+
self.demonstrate_vdb_api()
|
|
320
|
+
self.demonstrate_memory_api()
|
|
321
|
+
self.demonstrate_api_composition()
|
|
322
|
+
self.demonstrate_error_handling()
|
|
323
|
+
|
|
324
|
+
print("\n🎉 Tutorial Complete!")
|
|
325
|
+
print("\n📚 Next Steps:")
|
|
326
|
+
print(" 1. 查看具体服务的实现代码")
|
|
327
|
+
print(" 2. 运行真实的集成测试")
|
|
328
|
+
print(" 3. 在你的项目中集成SAGE服务")
|
|
329
|
+
print(" 4. 参考API文档了解更多细节")
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def main():
|
|
333
|
+
"""主函数"""
|
|
334
|
+
tutorial = ServiceAPITutorial()
|
|
335
|
+
tutorial.run_tutorial()
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
if __name__ == "__main__":
|
|
339
|
+
main()
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SAGE 微服务架构使用示例
|
|
3
|
+
展示如何在应用程序中注册和使用KV、VDB、Memory服务
|
|
4
|
+
"""
|
|
5
|
+
import asyncio
|
|
6
|
+
import time
|
|
7
|
+
from typing import List
|
|
8
|
+
import numpy as np
|
|
9
|
+
|
|
10
|
+
# 导入SAGE环境和服务
|
|
11
|
+
from sage.core.api.local_environment import LocalEnvironment
|
|
12
|
+
from sage.middleware.services import (
|
|
13
|
+
MemoryService,
|
|
14
|
+
create_kv_service_factory,
|
|
15
|
+
create_vdb_service_factory,
|
|
16
|
+
create_memory_service_factory
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SampleApplication:
|
|
21
|
+
"""示例应用程序,展示如何使用微服务架构"""
|
|
22
|
+
|
|
23
|
+
def __init__(self):
|
|
24
|
+
# 创建SAGE环境
|
|
25
|
+
self.env = LocalEnvironment("microservices_demo", {})
|
|
26
|
+
|
|
27
|
+
def setup_services(self):
|
|
28
|
+
"""在应用中注册微服务"""
|
|
29
|
+
print("🔧 注册微服务到SAGE环境...")
|
|
30
|
+
|
|
31
|
+
# 注册KV服务
|
|
32
|
+
kv_factory = create_kv_service_factory(
|
|
33
|
+
service_name="kv_service",
|
|
34
|
+
backend_type="memory", # 使用内存后端
|
|
35
|
+
max_size=1000,
|
|
36
|
+
ttl_seconds=3600 # 1小时过期
|
|
37
|
+
)
|
|
38
|
+
self.env.register_service("kv_service", kv_factory.service_class, kv_factory)
|
|
39
|
+
|
|
40
|
+
# 注册VDB服务
|
|
41
|
+
vdb_factory = create_vdb_service_factory(
|
|
42
|
+
service_name="vdb_service",
|
|
43
|
+
collection_name="demo_vectors",
|
|
44
|
+
dimension=384,
|
|
45
|
+
persist_directory="./demo_vectors"
|
|
46
|
+
)
|
|
47
|
+
self.env.register_service("vdb_service", vdb_factory.service_class, vdb_factory)
|
|
48
|
+
|
|
49
|
+
# 注册Memory编排服务
|
|
50
|
+
memory_factory = create_memory_service_factory(
|
|
51
|
+
service_name="memory_service",
|
|
52
|
+
kv_service_name="kv_service",
|
|
53
|
+
vdb_service_name="vdb_service"
|
|
54
|
+
)
|
|
55
|
+
self.env.register_service("memory_service", memory_factory.service_class, memory_factory)
|
|
56
|
+
|
|
57
|
+
print("✅ 所有服务已注册")
|
|
58
|
+
|
|
59
|
+
def run_demo(self):
|
|
60
|
+
"""运行演示"""
|
|
61
|
+
print("🚀 启动微服务演示")
|
|
62
|
+
print("=" * 50)
|
|
63
|
+
|
|
64
|
+
# 设置服务
|
|
65
|
+
self.setup_services()
|
|
66
|
+
|
|
67
|
+
# 创建一个简单的数据流来演示服务使用
|
|
68
|
+
data_stream = self.env.from_memory_source([
|
|
69
|
+
{"id": 1, "content": "用户询问了关于Python的问题", "session": "session_1"},
|
|
70
|
+
{"id": 2, "content": "AI助手回答了Python基础知识", "session": "session_1"},
|
|
71
|
+
{"id": 3, "content": "用户请求更多代码示例", "session": "session_1"},
|
|
72
|
+
{"id": 4, "content": "讨论了机器学习算法", "session": "session_2"},
|
|
73
|
+
{"id": 5, "content": "解释了神经网络原理", "session": "session_2"}
|
|
74
|
+
])
|
|
75
|
+
|
|
76
|
+
# 定义处理函数
|
|
77
|
+
def process_conversation(data):
|
|
78
|
+
"""处理对话数据的函数"""
|
|
79
|
+
# 在这里我们可以使用服务调用
|
|
80
|
+
# 注意:在实际的SAGE函数中,可以通过 self.call_service 访问服务
|
|
81
|
+
|
|
82
|
+
print(f"处理对话: {data['content'][:30]}...")
|
|
83
|
+
|
|
84
|
+
# 模拟向量化(在实际应用中,这里会调用embedding服务)
|
|
85
|
+
content_vector = np.random.random(384).tolist()
|
|
86
|
+
|
|
87
|
+
# 这里展示了服务调用的概念
|
|
88
|
+
# 在实际的SAGE函数中,代码会是这样:
|
|
89
|
+
#
|
|
90
|
+
# # 存储到KV
|
|
91
|
+
# self.call_service["kv_service"].put(f"conv:{data['id']}", {
|
|
92
|
+
# "content": data['content'],
|
|
93
|
+
# "session": data['session'],
|
|
94
|
+
# "timestamp": time.time()
|
|
95
|
+
# })
|
|
96
|
+
#
|
|
97
|
+
# # 存储记忆
|
|
98
|
+
# memory_id = self.call_service["memory_service"].store_memory(
|
|
99
|
+
# session_id=data['session'],
|
|
100
|
+
# content=data['content'],
|
|
101
|
+
# vector=content_vector,
|
|
102
|
+
# memory_type="conversation"
|
|
103
|
+
# )
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
"processed": True,
|
|
107
|
+
"memory_id": f"mock_memory_{data['id']}",
|
|
108
|
+
"vector_dim": len(content_vector)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
# 应用处理函数
|
|
112
|
+
processed_stream = data_stream.map(process_conversation)
|
|
113
|
+
|
|
114
|
+
# 执行并收集结果
|
|
115
|
+
print("\n📊 处理结果:")
|
|
116
|
+
results = processed_stream.collect()
|
|
117
|
+
|
|
118
|
+
for i, result in enumerate(results, 1):
|
|
119
|
+
print(f" {i}. ✅ 已处理 - Memory ID: {result['memory_id']}")
|
|
120
|
+
|
|
121
|
+
print(f"\n🎯 总共处理了 {len(results)} 条对话记录")
|
|
122
|
+
|
|
123
|
+
# 展示服务调用的概念
|
|
124
|
+
self.show_service_usage_concept()
|
|
125
|
+
|
|
126
|
+
def show_service_usage_concept(self):
|
|
127
|
+
"""展示服务使用概念"""
|
|
128
|
+
print("\n" + "=" * 50)
|
|
129
|
+
print("💡 在SAGE函数中使用服务的示例代码:")
|
|
130
|
+
print("=" * 50)
|
|
131
|
+
|
|
132
|
+
example_code = '''
|
|
133
|
+
# 在SAGE Function中使用微服务的示例
|
|
134
|
+
|
|
135
|
+
class ConversationProcessor(BaseFunction):
|
|
136
|
+
"""对话处理函数"""
|
|
137
|
+
|
|
138
|
+
def process(self, conversation_data):
|
|
139
|
+
session_id = conversation_data['session_id']
|
|
140
|
+
content = conversation_data['content']
|
|
141
|
+
|
|
142
|
+
# 1. 调用KV服务存储原始数据
|
|
143
|
+
kv_success = self.call_service["kv_service"].put(
|
|
144
|
+
f"raw:{session_id}",
|
|
145
|
+
conversation_data
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# 2. 生成向量表示(假设有embedding服务)
|
|
149
|
+
vector = self.call_service["embedding_service"].encode(content)
|
|
150
|
+
|
|
151
|
+
# 3. 调用Memory服务存储记忆
|
|
152
|
+
memory_id = self.call_service["memory_service"].store_memory(
|
|
153
|
+
session_id=session_id,
|
|
154
|
+
content=content,
|
|
155
|
+
vector=vector,
|
|
156
|
+
memory_type="conversation"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# 4. 搜索相关历史记忆
|
|
160
|
+
related_memories = self.call_service["memory_service"].search_memories(
|
|
161
|
+
query_vector=vector,
|
|
162
|
+
session_id=session_id,
|
|
163
|
+
limit=5
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
"memory_id": memory_id,
|
|
168
|
+
"related_count": len(related_memories),
|
|
169
|
+
"kv_stored": kv_success
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
# 在DAG中注册和使用
|
|
173
|
+
def create_conversation_dag():
|
|
174
|
+
env = LocalEnvironment("conversation_app", {})
|
|
175
|
+
|
|
176
|
+
# 注册微服务
|
|
177
|
+
env.register_service("kv_service", KVService, create_kv_service_factory())
|
|
178
|
+
env.register_service("vdb_service", VDBService, create_vdb_service_factory())
|
|
179
|
+
env.register_service("memory_service", MemoryService, create_memory_service_factory())
|
|
180
|
+
|
|
181
|
+
# 创建数据流
|
|
182
|
+
stream = env.from_kafka_source(...)
|
|
183
|
+
|
|
184
|
+
# 应用处理函数(自动访问服务)
|
|
185
|
+
processed = stream.map(ConversationProcessor())
|
|
186
|
+
|
|
187
|
+
return processed
|
|
188
|
+
'''
|
|
189
|
+
|
|
190
|
+
print(example_code)
|
|
191
|
+
print("\n" + "=" * 50)
|
|
192
|
+
print("🔍 关键概念:")
|
|
193
|
+
print("1. 服务作为Service Tasks在DAG中运行")
|
|
194
|
+
print("2. 函数通过 self.call_service[service_name] 调用服务")
|
|
195
|
+
print("3. 服务可以是本地任务或Ray分布式任务")
|
|
196
|
+
print("4. 应用程序控制服务的生命周期")
|
|
197
|
+
print("5. 服务间通过SAGE的队列机制通信")
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def main():
|
|
201
|
+
"""主函数"""
|
|
202
|
+
app = SampleApplication()
|
|
203
|
+
|
|
204
|
+
try:
|
|
205
|
+
app.run_demo()
|
|
206
|
+
print("\n✅ 演示完成!")
|
|
207
|
+
print("\n📖 查看更多信息:")
|
|
208
|
+
print(" - 微服务代码: packages/sage-middleware/src/sage/service/")
|
|
209
|
+
print(" - 使用指南: packages/sage-middleware/MICROSERVICES_GUIDE.md")
|
|
210
|
+
|
|
211
|
+
except KeyboardInterrupt:
|
|
212
|
+
print("\n\n👋 演示被中断")
|
|
213
|
+
except Exception as e:
|
|
214
|
+
print(f"\n❌ 演示出错: {e}")
|
|
215
|
+
import traceback
|
|
216
|
+
traceback.print_exc()
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
if __name__ == "__main__":
|
|
220
|
+
main()
|
|
File without changes
|