scmcp-shared 0.6.0__tar.gz → 0.6.2__tar.gz

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.
Files changed (48) hide show
  1. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/PKG-INFO +1 -1
  2. scmcp_shared-0.6.2/src/scmcp_shared/__init__.py +1 -0
  3. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/agent.py +5 -2
  4. scmcp_shared-0.6.2/src/scmcp_shared/kb.py +109 -0
  5. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/rag.py +1 -1
  6. scmcp_shared-0.6.0/src/scmcp_shared/__init__.py +0 -1
  7. scmcp_shared-0.6.0/src/scmcp_shared/kb.py +0 -139
  8. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/.github/release.yml +0 -0
  9. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/.github/workflows/publish.yml +0 -0
  10. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/.github/workflows/test.yml +0 -0
  11. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/.pre-commit-config.yaml +0 -0
  12. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/LICENSE +0 -0
  13. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/README.md +0 -0
  14. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/pyproject.toml +0 -0
  15. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/backend.py +0 -0
  16. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/cli.py +0 -0
  17. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/logging_config.py +0 -0
  18. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/mcp_base.py +0 -0
  19. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/__init__.py +0 -0
  20. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/io.py +0 -0
  21. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/pl.py +0 -0
  22. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/pp.py +0 -0
  23. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/preset/__init__.py +0 -0
  24. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/preset/io.py +0 -0
  25. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/preset/pl.py +0 -0
  26. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/preset/pp.py +0 -0
  27. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/preset/tl.py +0 -0
  28. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/preset/util.py +0 -0
  29. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/tl.py +0 -0
  30. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/tool.py +0 -0
  31. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/schema/util.py +0 -0
  32. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/__init__.py +0 -0
  33. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/auto.py +0 -0
  34. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/code.py +0 -0
  35. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/preset/__init__.py +0 -0
  36. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/preset/io.py +0 -0
  37. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/preset/pl.py +0 -0
  38. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/preset/pp.py +0 -0
  39. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/preset/tl.py +0 -0
  40. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/server/preset/util.py +0 -0
  41. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/src/scmcp_shared/util.py +0 -0
  42. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/tests/conftest.py +0 -0
  43. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/tests/data/hg19/barcodes.tsv +0 -0
  44. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/tests/data/hg19/genes.tsv +0 -0
  45. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/tests/data/hg19/matrix.mtx +0 -0
  46. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/tests/test_io.py +0 -0
  47. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/tests/test_pp.py +0 -0
  48. {scmcp_shared-0.6.0 → scmcp_shared-0.6.2}/tests/test_select_tool.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scmcp_shared
3
- Version: 0.6.0
3
+ Version: 0.6.2
4
4
  Summary: A shared function libray for scmcphub
5
5
  Project-URL: Homepage, http://scmcphub.org/
6
6
  Project-URL: Repository, https://github.com/scmcphub/scmcp-shared
@@ -0,0 +1 @@
1
+ __version__ = "0.6.2"
@@ -4,7 +4,7 @@ import os
4
4
 
5
5
  from agno.agent import Agent
6
6
  from agno.models.openai import OpenAILike
7
- from scmcp_shared.kb import load_kb
7
+ from .kb import load_kb
8
8
 
9
9
  model = OpenAILike(
10
10
  id=os.getenv("MODEL"),
@@ -13,13 +13,16 @@ model = OpenAILike(
13
13
  )
14
14
 
15
15
 
16
- def rag_agent(task, software=None):
16
+ def rag_agent(task, software="scmcp"):
17
17
  knowledge_base = load_kb(software=software)
18
18
  agent = Agent(
19
19
  model=model,
20
20
  knowledge=knowledge_base,
21
21
  show_tool_calls=True,
22
22
  search_knowledge=True,
23
+ instructions="""
24
+ MUST query the knowledge base, and return the code example that can be used to solve the task.
25
+ """,
23
26
  )
24
27
  query = f"""
25
28
  <task>
@@ -0,0 +1,109 @@
1
+ from agno.document.chunking.agentic import AgenticChunking
2
+ from agno.embedder.openai import OpenAIEmbedder
3
+ from agno.models.deepseek import DeepSeek
4
+ from agno.vectordb.lancedb import LanceDb
5
+ from agno.knowledge.agent import AgentKnowledge
6
+ import os
7
+ import requests
8
+ import zipfile
9
+ from pathlib import Path
10
+ import logging
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+ embedder_id = os.getenv("EMBEDDER_MODEL")
15
+ embedder_api_key = os.getenv("EMBEDDER_API_KEY")
16
+ embedder_base_url = os.getenv("EMBEDDER_BASE_URL")
17
+ model_id = os.getenv("MODEL")
18
+ model_api_key = os.getenv("API_KEY")
19
+ model_base_url = os.getenv("BASE_URL")
20
+
21
+
22
+ def download_vector_db(source="huggingface"):
23
+ """
24
+ 下载向量数据库文件
25
+
26
+ Args:
27
+ source: 下载源 ("huggingface" 或 "github")
28
+ """
29
+
30
+ local_dir = Path(__file__).parent
31
+ local_dir.mkdir(exist_ok=True)
32
+
33
+ # 检查是否已存在
34
+ if (local_dir / "scmcp.lance").exists():
35
+ logger.info("Vector database already exists locally")
36
+ return str(local_dir)
37
+
38
+ logger.info(f"Downloading vector database from {source}...")
39
+
40
+ # 下载文件
41
+ if source == "huggingface":
42
+ url = "https://huggingface.co/datasets/huangshing/scmcp_vector_db/resolve/main/vector_db.zip"
43
+ else:
44
+ raise ValueError(f"Unsupported source: {source}")
45
+
46
+ logger.info(f"Downloading from: {url}")
47
+ response = requests.get(url, stream=True)
48
+ response.raise_for_status()
49
+
50
+ # 下载到目标目录
51
+ zip_path = local_dir / "vector_db.zip"
52
+ with open(zip_path, "wb") as f:
53
+ for chunk in response.iter_content(chunk_size=8192):
54
+ f.write(chunk)
55
+
56
+ # 解压文件
57
+ logger.info("Extracting downloaded archive...")
58
+ with zipfile.ZipFile(zip_path, "r") as zip_ref:
59
+ zip_ref.extractall(local_dir)
60
+
61
+ # 删除zip文件
62
+ zip_path.unlink()
63
+
64
+ logger.info(f"Vector database downloaded and extracted to: {local_dir}")
65
+ return str(local_dir)
66
+
67
+
68
+ def load_kb(software=None, auto_download=True, download_source="huggingface"):
69
+ """
70
+ 加载知识库
71
+
72
+ Args:
73
+ software: 软件名称
74
+ auto_download: 是否自动下载向量数据库
75
+ download_source: 下载源 ("huggingface" 或 "github")
76
+ """
77
+ # 获取向量数据库路径
78
+ vector_db_path = Path(__file__).parent / "vector_db"
79
+
80
+ # 如果不存在且允许自动下载,则下载
81
+ if not (vector_db_path / "scmcp.lance").exists():
82
+ if auto_download:
83
+ logger.info("Vector database not found, downloading...")
84
+ download_vector_db(download_source)
85
+ else:
86
+ raise FileNotFoundError(
87
+ "Vector database not found. Set auto_download=True to download automatically."
88
+ )
89
+
90
+ vector_db = LanceDb(
91
+ table_name=software,
92
+ uri=vector_db_path,
93
+ embedder=OpenAIEmbedder(
94
+ id=embedder_id,
95
+ base_url=embedder_base_url,
96
+ api_key=embedder_api_key,
97
+ ),
98
+ )
99
+ model = DeepSeek(
100
+ id=model_id,
101
+ base_url=model_base_url,
102
+ api_key=model_api_key,
103
+ )
104
+ knowledge_base = AgentKnowledge(
105
+ chunking_strategy=AgenticChunking(model=model),
106
+ vector_db=vector_db,
107
+ )
108
+
109
+ return knowledge_base
@@ -9,5 +9,5 @@ rag_mcp = FastMCP("RAG-Server")
9
9
  def retrieve_knowledge(
10
10
  task: str = Field(description="The tasks or questions that needs to be solved"),
11
11
  ):
12
- """search function and parameters that can be used to solve the user's tasks or questions"""
12
+ """search guide or code example that can be used to solve the user's tasks or questions"""
13
13
  return rag_agent(task, software="scmcp")
@@ -1 +0,0 @@
1
- __version__ = "0.6.0"
@@ -1,139 +0,0 @@
1
- from agno.document.chunking.agentic import AgenticChunking
2
- from agno.embedder.openai import OpenAIEmbedder
3
- from agno.models.deepseek import DeepSeek
4
- from agno.vectordb.lancedb import LanceDb
5
- from agno.knowledge.agent import AgentKnowledge
6
- import importlib.resources
7
- import os
8
- import requests
9
- import zipfile
10
- import tempfile
11
- import shutil
12
- from pathlib import Path
13
- import logging
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- embedder_id = os.getenv("EMBEDDER_MODEL")
18
- embedder_api_key = os.getenv("EMBEDDER_API_KEY")
19
- embedder_base_url = os.getenv("EMBEDDER_BASE_URL")
20
- model_id = os.getenv("MODEL")
21
- model_api_key = os.getenv("API_KEY")
22
- model_base_url = os.getenv("BASE_URL")
23
-
24
- # 配置信息
25
- config = {
26
- "local_dir": "vector_db",
27
- "huggingface_url": "https://huggingface.co/datasets/huangshing/scmcp_vector_db/resolve/main/vector_db.zip",
28
- }
29
-
30
-
31
- def download_vector_db(source="huggingface"):
32
- """
33
- 下载向量数据库文件
34
-
35
- Args:
36
- source: 下载源 ("huggingface" 或 "github")
37
- """
38
-
39
- # 获取本地存储路径
40
- package_path = importlib.resources.path("scmcp_shared", "")
41
- local_dir = Path(package_path) / config["local_dir"]
42
- local_dir.mkdir(exist_ok=True)
43
-
44
- # 检查是否已存在
45
- if (local_dir / "scmcp.lance").exists():
46
- logger.info("Vector database already exists locally")
47
- return str(local_dir)
48
-
49
- logger.info(f"Downloading vector database from {source}...")
50
-
51
- # 创建临时目录用于下载和解压
52
- with tempfile.TemporaryDirectory() as temp_dir:
53
- temp_path = Path(temp_dir)
54
- zip_path = temp_path / "vector_db.zip"
55
-
56
- try:
57
- # 下载文件
58
- if source == "huggingface":
59
- url = config["huggingface_url"]
60
- else:
61
- raise ValueError(f"Unsupported source: {source}")
62
-
63
- logger.info(f"Downloading from: {url}")
64
- response = requests.get(url, stream=True)
65
- response.raise_for_status()
66
-
67
- with open(zip_path, "wb") as f:
68
- for chunk in response.iter_content(chunk_size=8192):
69
- f.write(chunk)
70
-
71
- # 解压文件
72
- logger.info("Extracting downloaded archive...")
73
- _extract_archive(zip_path, local_dir)
74
-
75
- logger.info(f"Vector database downloaded and extracted to: {local_dir}")
76
- return str(local_dir)
77
-
78
- except requests.RequestException as e:
79
- raise RuntimeError(f"Failed to download vector database: {e}")
80
- except Exception as e:
81
- raise RuntimeError(f"Failed to process vector database: {e}")
82
-
83
-
84
- def _extract_archive(archive_path, extract_dir):
85
- """解压归档文件"""
86
- with zipfile.ZipFile(archive_path, "r") as zip_ref:
87
- zip_ref.extractall(extract_dir)
88
-
89
- # 如果解压后只有一个子目录,移动内容到目标目录
90
- extracted_items = list(Path(extract_dir).iterdir())
91
- if len(extracted_items) == 1 and extracted_items[0].is_dir():
92
- subdir = extracted_items[0]
93
- for item in subdir.iterdir():
94
- shutil.move(str(item), str(extract_dir / item.name))
95
- subdir.rmdir()
96
-
97
-
98
- def load_kb(software=None, auto_download=True, download_source="huggingface"):
99
- """
100
- 加载知识库
101
-
102
- Args:
103
- software: 软件名称
104
- auto_download: 是否自动下载向量数据库
105
- download_source: 下载源 ("huggingface" 或 "github")
106
- """
107
- # 获取向量数据库路径
108
- try:
109
- vector_db_path = importlib.resources.path("scmcp_shared", "vector_db")
110
- except FileNotFoundError:
111
- if auto_download:
112
- logger.info("Vector database not found in package, attempting download...")
113
- vector_db_path = download_vector_db(download_source)
114
- else:
115
- raise FileNotFoundError(
116
- "Vector database not found. Set auto_download=True to download automatically, "
117
- "or manually place the vector database in the scmcp_shared package."
118
- )
119
-
120
- vector_db = LanceDb(
121
- table_name=software,
122
- uri=vector_db_path,
123
- embedder=OpenAIEmbedder(
124
- id=embedder_id,
125
- base_url=embedder_base_url,
126
- api_key=embedder_api_key,
127
- ),
128
- )
129
- model = DeepSeek(
130
- id=model_id,
131
- base_url=model_base_url,
132
- api_key=model_api_key,
133
- )
134
- knowledge_base = AgentKnowledge(
135
- chunking_strategy=AgenticChunking(model=model),
136
- vector_db=vector_db,
137
- )
138
-
139
- return knowledge_base
File without changes
File without changes