@icyfenix-dmla/cli 2026.6.6-1021 → 2026.6.11-1945

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icyfenix-dmla/cli",
3
- "version": "2026.6.6-1021",
3
+ "version": "2026.6.11-1945",
4
4
  "description": "DMLA 沙箱服务命令行工具",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -6,4 +6,4 @@
6
6
  # from shared.cnn import AlexNet
7
7
  # from shared.linear import LogisticRegression
8
8
 
9
- __all__ = ['bayesian', 'cnn', 'gan', 'linear', 'llm', 'neural', 'sequence_models', 'svm', 'tree', 'unsupervised']
9
+ __all__ = ['agent_systems', 'bayesian', 'cnn', 'gan', 'linear', 'llm', 'neural', 'sequence_models', 'svm', 'tree', 'unsupervised']
@@ -0,0 +1,12 @@
1
+ # AGENT_SYSTEMS 模块
2
+ from .agent_core import AgentCore
3
+ from .agent_message import AgentMessage
4
+ from .circuit_breaker import CircuitBreaker
5
+ from .memory_manager import MemoryManager
6
+ from .message_bus import MessageBus
7
+ from .orchestrator import Orchestrator
8
+ from .specialized_agent import SpecializedAgent
9
+ from .tool_registry import ToolRegistry
10
+ from .workflow_engine import WorkflowEngine
11
+
12
+ __all__ = ['AgentCore', 'AgentMessage', 'CircuitBreaker', 'MemoryManager', 'MessageBus', 'Orchestrator', 'SpecializedAgent', 'ToolRegistry', 'WorkflowEngine']
@@ -0,0 +1,41 @@
1
+ # AgentCore 定义
2
+ # 从文档自动提取生成
3
+
4
+ import json
5
+
6
+ class AgentCore:
7
+ """基于 ReAct 模式的 Agent 核心"""
8
+
9
+ def __init__(self, tool_registry, memory_manager, max_iterations=10):
10
+ self.tools = tool_registry
11
+ self.memory = memory_manager
12
+ self.max_iterations = max_iterations
13
+
14
+ def run(self, goal):
15
+ """执行 Agent 主循环"""
16
+ self.memory.add("user", goal)
17
+
18
+ for i in range(self.max_iterations):
19
+ # 构建提示词:系统指令 + 记忆上下文 + 工具描述
20
+ prompt = self._build_prompt()
21
+
22
+ # 调用 LLM 生成思考和行动
23
+ response = self._call_llm(prompt)
24
+
25
+ # 解析响应:提取思考、行动和最终答案
26
+ thought, action, final_answer = self._parse_response(response)
27
+
28
+ if thought:
29
+ self.memory.add("thought", thought)
30
+
31
+ if final_answer:
32
+ return final_answer
33
+
34
+ if action:
35
+ # 执行工具调用
36
+ observation = self.tools.execute(
37
+ action["tool"], **action.get("parameters", {})
38
+ )
39
+ self.memory.add("observation", json.dumps(observation, ensure_ascii=False))
40
+
41
+ return "达到最大迭代次数,任务未完成"
@@ -0,0 +1,53 @@
1
+ # AgentMessage 定义
2
+ # 从文档自动提取生成
3
+
4
+ import json
5
+ import time
6
+ import uuid
7
+ from enum import Enum
8
+
9
+ class AgentMessage:
10
+ """Agent 间通信的结构化消息"""
11
+
12
+ def __init__(self, msg_type, sender, receiver, payload,
13
+ correlation_id=None, priority=0, ttl=None):
14
+ self.id = str(uuid.uuid4())
15
+ self.type = MessageType(msg_type) if isinstance(msg_type, str) else msg_type
16
+ self.sender = sender
17
+ self.receiver = receiver
18
+ self.payload = payload
19
+ self.correlation_id = correlation_id or self.id
20
+ self.priority = priority
21
+ self.ttl = ttl
22
+ self.timestamp = time.time()
23
+
24
+ def to_dict(self):
25
+ return {
26
+ "id": self.id,
27
+ "type": self.type.value,
28
+ "sender": self.sender,
29
+ "receiver": self.receiver,
30
+ "payload": self.payload,
31
+ "correlation_id": self.correlation_id,
32
+ "priority": self.priority,
33
+ "timestamp": self.timestamp
34
+ }
35
+
36
+ @classmethod
37
+ def from_dict(cls, data):
38
+ msg = cls(
39
+ msg_type=data["type"],
40
+ sender=data["sender"],
41
+ receiver=data["receiver"],
42
+ payload=data["payload"],
43
+ correlation_id=data.get("correlation_id"),
44
+ priority=data.get("priority", 0)
45
+ )
46
+ msg.id = data["id"]
47
+ msg.timestamp = data.get("timestamp", time.time())
48
+ return msg
49
+
50
+ def is_expired(self):
51
+ if self.ttl is None:
52
+ return False
53
+ return time.time() - self.timestamp > self.ttl
@@ -0,0 +1,53 @@
1
+ # CircuitBreaker 定义
2
+ # 从文档自动提取生成
3
+
4
+ class CircuitBreaker:
5
+ """断路器:在 Agent 持续失败时暂停向其分配任务"""
6
+
7
+ CLOSED = "closed" # 正常工作
8
+ OPEN = "open" # 暂停分配
9
+ HALF_OPEN = "half_open" # 试探性恢复
10
+
11
+ def __init__(self, failure_threshold=3, recovery_timeout=60, half_open_max=1):
12
+ self.failure_threshold = failure_threshold
13
+ self.recovery_timeout = recovery_timeout
14
+ self.half_open_max = half_open_max
15
+ self._states = {} # agent_id -> state
16
+ self._failure_counts = {}
17
+ self._last_failure_time = {}
18
+ self._half_open_counts = {}
19
+
20
+ def can_execute(self, agent_id):
21
+ """检查是否可以向该 Agent 分配任务"""
22
+ state = self._states.get(agent_id, self.CLOSED)
23
+
24
+ if state == self.CLOSED:
25
+ return True
26
+
27
+ if state == self.OPEN:
28
+ # 检查是否到达恢复时间
29
+ elapsed = time.time() - self._last_failure_time.get(agent_id, 0)
30
+ if elapsed >= self.recovery_timeout:
31
+ self._states[agent_id] = self.HALF_OPEN
32
+ self._half_open_counts[agent_id] = 0
33
+ return True
34
+ return False
35
+
36
+ if state == self.HALF_OPEN:
37
+ # 限制试探性请求的数量
38
+ return self._half_open_counts.get(agent_id, 0) < self.half_open_max
39
+
40
+ return False
41
+
42
+ def record_success(self, agent_id):
43
+ """记录成功执行"""
44
+ self._states[agent_id] = self.CLOSED
45
+ self._failure_counts[agent_id] = 0
46
+
47
+ def record_failure(self, agent_id):
48
+ """记录执行失败"""
49
+ self._failure_counts[agent_id] = self._failure_counts.get(agent_id, 0) + 1
50
+ self._last_failure_time[agent_id] = time.time()
51
+
52
+ if self._failure_counts[agent_id] >= self.failure_threshold:
53
+ self._states[agent_id] = self.OPEN
@@ -0,0 +1,37 @@
1
+ # MemoryManager 定义
2
+ # 从文档自动提取生成
3
+
4
+ class MemoryManager:
5
+ """简单的记忆管理器,维护对话历史和关键信息"""
6
+
7
+ def __init__(self, max_history=20):
8
+ self.history = []
9
+ self.key_facts = []
10
+ self.max_history = max_history
11
+
12
+ def add(self, role, content):
13
+ """添加一条记录到对话历史"""
14
+ self.history.append({"role": role, "content": content})
15
+
16
+ # 超出限制时压缩早期历史
17
+ if len(self.history) > self.max_history:
18
+ self._compress_history()
19
+
20
+ def get_context(self):
21
+ """获取当前上下文(格式化的对话历史)"""
22
+ return self.history.copy()
23
+
24
+ def extract_fact(self, fact):
25
+ """提取关键事实到长期记忆"""
26
+ self.key_facts.append(fact)
27
+
28
+ def _compress_history(self):
29
+ """压缩早期历史:保留最近记录,将早期记录摘要"""
30
+ # 保留最近 2/3 的记录,将前 1/3 压缩为摘要
31
+ compress_count = len(self.history) // 3
32
+ old_records = self.history[:compress_count]
33
+ self.history = self.history[compress_count:]
34
+
35
+ # 生成摘要(简化实现:提取关键信息)
36
+ summary = f"[历史摘要: 共 {len(old_records)} 轮对话已压缩]"
37
+ self.history.insert(0, {"role": "system", "content": summary})
@@ -0,0 +1,41 @@
1
+ # MessageBus 定义
2
+ # 从文档自动提取生成
3
+
4
+ import heapq
5
+ from collections import defaultdict
6
+
7
+ class MessageBus:
8
+ """Agent 间的消息总线,支持发布-订阅和点对点通信"""
9
+
10
+ def __init__(self):
11
+ self._subscribers = defaultdict(list) # topic -> [agent_ids]
12
+ self._queues = defaultdict(list) # agent_id -> [(priority, message)]
13
+ self._ack_pending = {} # msg_id -> (sender, callback)
14
+
15
+ def subscribe(self, agent_id, topic):
16
+ """订阅特定主题的消息"""
17
+ if agent_id not in self._subscribers[topic]:
18
+ self._subscribers[topic].append(agent_id)
19
+
20
+ def publish(self, message):
21
+ """发布消息到主题,所有订阅者都会收到"""
22
+ topic = message.type.value
23
+ for agent_id in self._subscribers.get(topic, []):
24
+ self._enqueue(agent_id, message)
25
+
26
+ def send(self, message):
27
+ """点对点发送消息给指定 Agent"""
28
+ self._enqueue(message.receiver, message)
29
+
30
+ def receive(self, agent_id):
31
+ """接收 Agent 的下一条消息(按优先级排序)"""
32
+ if not self._queues[agent_id]:
33
+ return None
34
+ _, message = heapq.heappop(self._queues[agent_id])
35
+ if message.is_expired():
36
+ return self.receive(agent_id) # 跳过过期消息
37
+ return message
38
+
39
+ def _enqueue(self, agent_id, message):
40
+ """将消息加入 Agent 的消息队列(按优先级排序)"""
41
+ heapq.heappush(self._queues[agent_id], (-message.priority, message))
@@ -0,0 +1,47 @@
1
+ # Orchestrator 定义
2
+ # 从文档自动提取生成
3
+
4
+ class Orchestrator:
5
+ """集中式编排器,负责任务分解、分配和结果整合"""
6
+
7
+ def __init__(self, message_bus, agents):
8
+ self.bus = message_bus
9
+ self.agents = {agent.agent_id: agent for agent in agents}
10
+ self.task_results = {}
11
+ self.workflow = None
12
+
13
+ def decompose_task(self, goal):
14
+ """将高层目标分解为子任务列表"""
15
+ # 调用 LLM 进行任务分解
16
+ # 简化实现:基于规则的分解
17
+ subtasks = self._rule_based_decompose(goal)
18
+ return subtasks
19
+
20
+ def assign_task(self, task, agent_id):
21
+ """将子任务分配给指定 Agent"""
22
+ msg = AgentMessage(
23
+ msg_type=MessageType.TASK_ASSIGN,
24
+ sender="orchestrator",
25
+ receiver=agent_id,
26
+ payload=task
27
+ )
28
+ self.bus.send(msg)
29
+
30
+ def collect_results(self, task_ids, timeout=60):
31
+ """收集指定任务的执行结果"""
32
+ results = {}
33
+ deadline = time.time() + timeout
34
+
35
+ while time.time() < deadline and len(results) < len(task_ids):
36
+ msg = self.bus.receive("orchestrator")
37
+ if msg and msg.type == MessageType.RESULT_SUBMIT:
38
+ results[msg.correlation_id] = msg.payload
39
+ elif msg and msg.type == MessageType.ERROR_REPORT:
40
+ results[msg.correlation_id] = {"status": "error", "error": msg.payload}
41
+
42
+ return results
43
+
44
+ def _rule_based_decompose(self, goal):
45
+ """基于规则的任务分解(简化实现)"""
46
+ # 实际实现中应调用 LLM 进行智能分解
47
+ return [{"id": "task_1", "description": goal, "type": "general"}]
@@ -0,0 +1,21 @@
1
+ # SpecializedAgent 定义
2
+ # 从文档自动提取生成
3
+
4
+ class SpecializedAgent:
5
+ """专业化 Agent 基类,每个子类实现特定领域的逻辑"""
6
+
7
+ def __init__(self, agent_id, role, description, tools, message_bus):
8
+ self.agent_id = agent_id
9
+ self.role = role
10
+ self.description = description
11
+ self.tools = tools
12
+ self.bus = message_bus
13
+ self.status = "idle"
14
+ self.current_task = None
15
+
16
+ def get_system_prompt(self):
17
+ """生成 Agent 的系统提示词"""
18
+ tool_descriptions = "\n".join([
19
+ f"- {t['name']}: {t['description']}" for t in self.tools.get_schemas()
20
+ ])
21
+ return f"""你是一个{self.role}。
@@ -0,0 +1,51 @@
1
+ # ToolRegistry 定义
2
+ # 从文档自动提取生成
3
+
4
+ import json
5
+ import signal
6
+ import time
7
+ from functools import wraps
8
+
9
+ class ToolRegistry:
10
+ """工具注册中心,管理可用工具的注册、验证和执行"""
11
+
12
+ def __init__(self):
13
+ self._tools = {}
14
+ self._schemas = {}
15
+
16
+ def register(self, name=None, description="", parameters=None, timeout=30):
17
+ """工具注册装饰器"""
18
+ def decorator(func):
19
+ tool_name = name or func.__name__
20
+ self._tools[tool_name] = func
21
+ self._schemas[tool_name] = {
22
+ "name": tool_name,
23
+ "description": description or func.__doc__ or "",
24
+ "parameters": parameters or {"type": "object", "properties": {}},
25
+ "timeout": timeout
26
+ }
27
+ return func
28
+ return decorator
29
+
30
+ def get_schemas(self):
31
+ """获取所有工具的描述 schema"""
32
+ return list(self._schemas.values())
33
+
34
+ def execute(self, tool_name, **kwargs):
35
+ """执行指定工具,带参数验证和超时控制"""
36
+ if tool_name not in self._tools:
37
+ return {"error": f"工具 '{tool_name}' 不存在", "available_tools": list(self._tools.keys())}
38
+
39
+ # 参数验证(简化版)
40
+ schema = self._schemas[tool_name]
41
+ required = schema["parameters"].get("required", [])
42
+ for param in required:
43
+ if param not in kwargs:
44
+ return {"error": f"缺少必选参数 '{param}'"}
45
+
46
+ # 执行工具
47
+ try:
48
+ result = self._tools[tool_name](**kwargs)
49
+ return {"result": result}
50
+ except Exception as e:
51
+ return {"error": f"工具执行失败: {str(e)}"}
@@ -0,0 +1,68 @@
1
+ # WorkflowEngine 定义
2
+ # 从文档自动提取生成
3
+
4
+ from collections import deque
5
+
6
+ class WorkflowEngine:
7
+ """基于 DAG 的工作流执行引擎"""
8
+
9
+ def __init__(self, message_bus, orchestrator):
10
+ self.bus = message_bus
11
+ self.orchestrator = orchestrator
12
+ self.checkpoints = {}
13
+
14
+ def execute(self, workflow):
15
+ """执行工作流 DAG"""
16
+ # 拓扑排序确定执行顺序
17
+ execution_order = self._topological_sort(workflow)
18
+
19
+ # 按层级执行(同层节点可并行)
20
+ for level in execution_order:
21
+ # 并行分配同层任务
22
+ for node_id in level:
23
+ node = workflow["nodes"][node_id]
24
+ agent_id = node.get("agent_id")
25
+ if agent_id:
26
+ self.orchestrator.assign_task(node["task"], agent_id)
27
+
28
+ # 等待同层任务完成
29
+ results = self.orchestrator.collect_results(level)
30
+
31
+ # 保存检查点
32
+ self.checkpoints[level] = results
33
+
34
+ # 检查是否有失败的任务
35
+ for task_id, result in results.items():
36
+ if result.get("status") == "error":
37
+ # 触发容错处理
38
+ self._handle_failure(task_id, result, workflow)
39
+
40
+ return self.checkpoints
41
+
42
+ def _topological_sort(self, workflow):
43
+ """拓扑排序,返回按层级组织的执行顺序"""
44
+ nodes = workflow["nodes"]
45
+ edges = workflow.get("edges", [])
46
+
47
+ # 计算入度
48
+ in_degree = {nid: 0 for nid in nodes}
49
+ children = {nid: [] for nid in nodes}
50
+ for edge in edges:
51
+ children[edge["from"]].append(edge["to"])
52
+ in_degree[edge["to"]] += 1
53
+
54
+ # BFS 分层
55
+ levels = []
56
+ queue = deque([nid for nid, deg in in_degree.items() if deg == 0])
57
+ while queue:
58
+ level = []
59
+ for _ in range(len(queue)):
60
+ nid = queue.popleft()
61
+ level.append(nid)
62
+ for child in children[nid]:
63
+ in_degree[child] -= 1
64
+ if in_degree[child] == 0:
65
+ queue.append(child)
66
+ levels.append(level)
67
+
68
+ return levels
@@ -96,6 +96,15 @@ const DATASETS = [
96
96
  format: 'git',
97
97
  targetDir: 'datasets/minimind-alignment',
98
98
  source: 'ModelScope (icyfenix)'
99
+ },
100
+ {
101
+ id: 'gsm8k-200',
102
+ name: 'GSM8K 200 (数学推理评测集)',
103
+ url: 'https://www.modelscope.cn/datasets/icyfenix/GSM8K_200.git',
104
+ size: '~109KB',
105
+ format: 'git',
106
+ targetDir: 'datasets/gsm8k-200',
107
+ source: 'ModelScope (icyfenix)'
99
108
  }
100
109
  ]
101
110
 
@@ -29,7 +29,9 @@ const SOFT_DEPS = [
29
29
  'transformers',
30
30
  'tokenizers',
31
31
  'datasets',
32
- 'ipywidgets'
32
+ 'ipywidgets',
33
+ 'accelerate',
34
+ 'bitsandbytes'
33
35
  ]
34
36
 
35
37
  // 环境检测结果缓存
package/version.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
- "buildTime": "2026-06-06T02:22:08.498Z",
3
- "cliVersion": "2026.6.6-1021"
2
+ "buildTime": "2026-06-11T11:46:24.774Z",
3
+ "cliVersion": "2026.6.11-1945"
4
4
  }