chore: 清理日志和临时脚本
- 删除已跟踪的 Codex/Uvicorn/Vite 历史日志\n- 删除无外部引用的一次性 E2E 与文档提取脚本\n- 清理本机临时目录、构建日志、备份文件和重复数据副本
This commit is contained in:
parent
6152a3a904
commit
3997809acb
|
|
@ -1,22 +0,0 @@
|
|||
INFO: Will watch for changes in these directories: ['D:\\ItemSpace\\14.¹¤ÒµÖǺË\\aps-agent']
|
||||
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||
INFO: Started reloader process [20096] using WatchFiles
|
||||
INFO: Started server process [31504]
|
||||
INFO: Waiting for application startup.
|
||||
INFO: Application startup complete.
|
||||
WARNING: WatchFiles detected changes in 'server\agent_core\harness.py', 'tests\golden\test_mrp.py', 'server\gateway\app.py', 'server\aps_domain\mrp.py', 'server\state\seed.py', 'server\aps_domain\workflow.py', 'server\aps_domain\masterdata.py', 'server\agent_core\intent.py', 'tests\golden\test_master_data.py', 'server\engines\rule_engine.py', 'server\engines\queries.py', 'server\state\store.py'. Reloading...
|
||||
INFO: Shutting down
|
||||
INFO: Waiting for application shutdown.
|
||||
INFO: Application shutdown complete.
|
||||
INFO: Finished server process [31504]
|
||||
INFO: Started server process [24520]
|
||||
INFO: Waiting for application startup.
|
||||
INFO: Application startup complete.
|
||||
WARNING: WatchFiles detected changes in 'server\agent_core\harness.py', 'tests\golden\test_mrp.py', 'server\gateway\app.py', 'server\aps_domain\mrp.py', 'server\state\seed.py', 'server\aps_domain\workflow.py', 'server\aps_domain\masterdata.py', 'server\agent_core\intent.py', 'tests\golden\test_master_data.py', 'server\engines\rule_engine.py', 'server\engines\queries.py', 'server\state\store.py'. Reloading...
|
||||
INFO: Shutting down
|
||||
INFO: Waiting for application shutdown.
|
||||
INFO: Application shutdown complete.
|
||||
INFO: Finished server process [24520]
|
||||
INFO: Started server process [49944]
|
||||
INFO: Waiting for application startup.
|
||||
INFO: Application startup complete.
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
INFO: 127.0.0.1:64901 - "GET /api/world/summary HTTP/1.1" 200 OK
|
||||
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
|
||||
> aps-agent-web@0.1.0 dev
|
||||
> vite --host 127.0.0.1
|
||||
|
||||
|
||||
[32m[1mVITE[22m v6.4.3[39m [2mready in [0m[1m561[22m[2m[0m ms[22m
|
||||
|
||||
[32m➜[39m [1mLocal[22m: [36mhttp://127.0.0.1:[1m5173[22m/[39m
|
||||
[2m13:53:38[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/chat/ChatPanel.tsx[22m
|
||||
[2m13:53:38[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/styles.css[22m
|
||||
[2m13:53:38[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/master/MasterPanel.tsx[22m
|
||||
[2m13:53:38[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/orders/OrderPanel.tsx[22m
|
||||
[2m13:53:38[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/App.tsx, /src/timeline/TimelineRail.tsx, /src/orders/OrderPanel.tsx, /src/gov/GovConsole.tsx, /src/chat/ChatPanel.tsx, /src/master/MasterPanel.tsx[22m
|
||||
[2m13:53:38[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/projects/ProjectPanel.tsx[22m
|
||||
[2m13:53:38[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/App.tsx[22m
|
||||
[2m12:46:23[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/chat/ChatPanel.tsx[22m
|
||||
[2m12:46:23[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/styles.css[22m
|
||||
[2m12:46:23[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/master/MasterPanel.tsx[22m
|
||||
[2m12:46:23[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/orders/OrderPanel.tsx[22m
|
||||
[2m12:46:23[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/App.tsx, /src/timeline/TimelineRail.tsx, /src/orders/OrderPanel.tsx, /src/gov/GovConsole.tsx, /src/chat/ChatPanel.tsx, /src/master/MasterPanel.tsx[22m
|
||||
[2m12:46:23[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/projects/ProjectPanel.tsx[22m
|
||||
[2m12:46:23[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m [32mhmr update [39m[2m/src/App.tsx[22m
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
"""临时 E2E:对比 → 采用 → 存档 → 回滚。跑完可删。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import sys
|
||||
import urllib.request
|
||||
|
||||
# Windows 控制台避免 ✅ 等字符触发 GBK 编码错误
|
||||
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
||||
|
||||
|
||||
def chat(text: str, sid: str | None = None) -> list[dict]:
|
||||
body = json.dumps({"text": text, "sessionId": sid}).encode()
|
||||
req = urllib.request.Request(
|
||||
"http://localhost:8000/api/chat",
|
||||
data=body,
|
||||
headers={"Content-Type": "application/json"},
|
||||
)
|
||||
events: list[dict] = []
|
||||
with urllib.request.urlopen(req, timeout=60) as resp:
|
||||
buf = ""
|
||||
for chunk in resp:
|
||||
buf += chunk.decode()
|
||||
while "\n\n" in buf:
|
||||
frame, buf = buf.split("\n\n", 1)
|
||||
if frame.startswith("data: "):
|
||||
events.append(json.loads(frame[6:]))
|
||||
return events
|
||||
|
||||
|
||||
def get(url: str) -> dict:
|
||||
with urllib.request.urlopen(url, timeout=30) as r:
|
||||
return json.loads(r.read())
|
||||
|
||||
|
||||
def post(url: str, data: dict) -> dict:
|
||||
body = json.dumps(data).encode()
|
||||
req = urllib.request.Request(url, data=body, headers={"Content-Type": "application/json"})
|
||||
with urllib.request.urlopen(req, timeout=60) as r:
|
||||
return json.loads(r.read())
|
||||
|
||||
|
||||
def main() -> None:
|
||||
# 1) compare
|
||||
ev = chat("对比几种策略", "e2e-m2")
|
||||
blocks = [e for e in ev if e.get("type") == "block"]
|
||||
assert any(b["block"]["type"] == "scenario-cards" for b in blocks), blocks
|
||||
cards = next(b["block"]["props"]["cards"] for b in blocks if b["block"]["type"] == "scenario-cards")
|
||||
print("compare OK", len(cards), "cards:", [c["label"] for c in cards])
|
||||
tl0 = get("http://localhost:8000/api/timeline")
|
||||
v0 = len(tl0["versions"])
|
||||
|
||||
# 2) apply best
|
||||
best = min(cards, key=lambda c: (c["kpi"]["totalTardiness"], c["kpi"]["conflictCount"]))
|
||||
r = post(
|
||||
"http://localhost:8000/api/actions/scenario/apply",
|
||||
{"sessionId": "e2e-m2", "strategy": best["strategy"], "engine": best["engine"]},
|
||||
)
|
||||
print("apply OK", (r.get("message") or "")[:80])
|
||||
tl1 = get("http://localhost:8000/api/timeline")
|
||||
assert len(tl1["versions"]) >= v0, (v0, len(tl1["versions"]))
|
||||
print("versions", v0, "->", len(tl1["versions"]))
|
||||
|
||||
# 3) checkpoint create
|
||||
ev2 = chat("存个档 叫 e2e基线", "e2e-m2")
|
||||
text = "".join(e.get("text", "") for e in ev2 if e.get("type") == "token")
|
||||
print("checkpoint create:", text[:100])
|
||||
tl2 = get("http://localhost:8000/api/timeline")
|
||||
assert tl2["checkpoints"], tl2
|
||||
pair = tl2["checkpoints"][-1]
|
||||
print("pair", pair["pairId"], pair["label"])
|
||||
|
||||
# 4) rollback stage + approve
|
||||
ev3 = chat(f"回滚到检查点 {pair['pairId']}", "e2e-m2")
|
||||
blocks3 = [e for e in ev3 if e.get("type") == "block"]
|
||||
assert any(b["block"]["type"] == "confirm-card" for b in blocks3), blocks3
|
||||
cid = next(b["block"]["props"]["confirmId"] for b in blocks3 if b["block"]["type"] == "confirm-card")
|
||||
print("rollback staged", cid)
|
||||
r2 = post(
|
||||
"http://localhost:8000/api/actions/confirm",
|
||||
{"sessionId": "e2e-m2", "confirmId": cid, "approve": True},
|
||||
)
|
||||
print("rollback OK", (r2.get("message") or "")[:100])
|
||||
print("E2E M2 PASS")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
"""临时 E2E(M3):知识检索→报告生成→偏好个性化。跑完可删。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import sys
|
||||
import urllib.request
|
||||
|
||||
# Windows 控制台 UTF-8
|
||||
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
||||
|
||||
|
||||
def chat(text: str, sid: str | None = None) -> list[dict]:
|
||||
body = json.dumps({"text": text, "sessionId": sid}).encode()
|
||||
req = urllib.request.Request("http://localhost:8000/api/chat", data=body,
|
||||
headers={"Content-Type": "application/json"})
|
||||
events: list[dict] = []
|
||||
with urllib.request.urlopen(req, timeout=60) as resp:
|
||||
buf = ""
|
||||
for chunk in resp:
|
||||
buf += chunk.decode()
|
||||
while "\n\n" in buf:
|
||||
frame, buf = buf.split("\n\n", 1)
|
||||
if frame.startswith("data: "):
|
||||
events.append(json.loads(frame[6:]))
|
||||
return events
|
||||
|
||||
|
||||
def text_of(events: list[dict]) -> str:
|
||||
return "".join(e.get("text", "") for e in events if e.get("type") == "token")
|
||||
|
||||
|
||||
def blocks_of(events: list[dict]) -> list[dict]:
|
||||
return [e["block"] for e in events if e.get("type") == "block"]
|
||||
|
||||
|
||||
def get(url: str):
|
||||
with urllib.request.urlopen(url, timeout=30) as r:
|
||||
return r.read()
|
||||
|
||||
|
||||
def main() -> None:
|
||||
sid = "e2e-m3"
|
||||
# 1) 知识检索:带出处
|
||||
ev = chat("换线有什么规定", sid)
|
||||
t = text_of(ev)
|
||||
assert "出处" in t and "换线标准SOP" in t, t[:200]
|
||||
assert any(b["type"] == "evidence" for b in blocks_of(ev)), "缺 evidence 块"
|
||||
print("K1 知识检索带出处 OK")
|
||||
# 1b) @知识 直达
|
||||
ev = chat("@知识:插单审批流程", sid)
|
||||
assert "插单审批流程" in text_of(ev), text_of(ev)[:120]
|
||||
print("K1b @知识 引用 OK")
|
||||
# 2) 试排两版(第二版不点名策略 → 偏好个性化生效)
|
||||
chat("试排一版交期优先", sid)
|
||||
ev = chat("再试排一版", sid)
|
||||
t = text_of(ev)
|
||||
assert "排产完成" in t, t[:200]
|
||||
print("K3 偏好个性化:", "使用偏好" in t or "偏好" in t)
|
||||
# 3) 日报
|
||||
ev = chat("生成日报", sid)
|
||||
rblocks = [b for b in blocks_of(ev) if b["type"] == "report"]
|
||||
assert rblocks and "排产日报" in rblocks[0]["props"]["title"], blocks_of(ev)
|
||||
print("K2 日报 OK:", rblocks[0]["props"]["title"])
|
||||
# 4) 版本对比
|
||||
ev = chat("生成版本对比报告", sid)
|
||||
rblocks = [b for b in blocks_of(ev) if b["type"] == "report"]
|
||||
assert rblocks, text_of(ev)[:200]
|
||||
print("K2 版本对比 OK:", rblocks[0]["props"]["title"])
|
||||
# 5) 导出端点
|
||||
md = get("http://localhost:8000/api/reports/daily").decode("utf-8")
|
||||
assert md.startswith("# 排产日报"), md[:60]
|
||||
print("导出端点 OK")
|
||||
# 6) 知识资产清单(报告应已入库)
|
||||
assets = json.loads(get("http://localhost:8000/api/knowledge/assets"))["assets"]
|
||||
kinds = {a["kind"] for a in assets}
|
||||
assert "report" in kinds and "sop" in kinds, kinds
|
||||
print(f"知识库资产 {len(assets)} 条(含 report)")
|
||||
print("E2E M3 PASS")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
# Extract Juzhiyun manual: TOC + master-data / order / schedule chapters
|
||||
from __future__ import annotations
|
||||
import glob, os, re, fitz
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
pdf = glob.glob(os.path.join(ROOT, "demand", "*.pdf"))[0]
|
||||
out_dir = os.path.join(ROOT, "demand", "_extracted")
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
|
||||
doc = fitz.open(pdf)
|
||||
print(f"pages={doc.page_count} file={os.path.basename(pdf)}")
|
||||
|
||||
toc = doc.get_toc()
|
||||
toc_path = os.path.join(out_dir, "juzhiyun_toc.txt")
|
||||
with open(toc_path, "w", encoding="utf-8") as f:
|
||||
for lv, title, page in toc:
|
||||
f.write(f"{' ' * (lv - 1)}{title}\tp{page}\n")
|
||||
print(f"toc entries={len(toc)} -> {toc_path}")
|
||||
|
||||
# Keywords to pull relevant pages
|
||||
KEYS = [
|
||||
"主数据", "物料", "BOM", "工艺路线", "工艺", "工序", "工厂", "车间", "产线",
|
||||
"设备", "班次", "日历", "库存", "订单", "分解", "MRP", "排产", "计划",
|
||||
"负荷", "甘特", "齐套", "采购", "委外", "生产订单", "工单",
|
||||
]
|
||||
|
||||
# Build page index from TOC titles matching keys
|
||||
interesting_pages: set[int] = set()
|
||||
for lv, title, page in toc:
|
||||
if any(k in title for k in KEYS):
|
||||
# include this page and next few for section body
|
||||
for p in range(max(1, page), min(doc.page_count, page + 4) + 1):
|
||||
interesting_pages.add(p)
|
||||
|
||||
# Also scan first 30 pages of text for section headers if TOC sparse
|
||||
if len(interesting_pages) < 20:
|
||||
for i in range(min(80, doc.page_count)):
|
||||
text = doc[i].get_text("text")
|
||||
if any(k in text for k in ("主数据维护", "工艺路线", "物料管理", "订单管理", "生产计划", "排产")):
|
||||
interesting_pages.add(i + 1)
|
||||
|
||||
print(f"interesting pages={len(interesting_pages)}")
|
||||
|
||||
# Extract full text of interesting pages + nearby
|
||||
chunks = []
|
||||
for pno in sorted(interesting_pages):
|
||||
text = doc[pno - 1].get_text("text")
|
||||
# compress blank lines
|
||||
text = re.sub(r"\n{3,}", "\n\n", text).strip()
|
||||
if text:
|
||||
chunks.append(f"\n\n===== PAGE {pno} =====\n{text}")
|
||||
|
||||
body_path = os.path.join(out_dir, "juzhiyun_master_schedule.txt")
|
||||
with open(body_path, "w", encoding="utf-8") as f:
|
||||
f.write("".join(chunks))
|
||||
print(f"extracted chars={sum(len(c) for c in chunks)} -> {body_path}")
|
||||
|
||||
# Also dump ALL page texts that look like menus / module names (shorter summary)
|
||||
summary_lines = []
|
||||
for i in range(doc.page_count):
|
||||
text = doc[i].get_text("text")
|
||||
hits = [k for k in KEYS if k in text]
|
||||
if hits:
|
||||
# first non-empty lines as context
|
||||
lines = [ln.strip() for ln in text.splitlines() if ln.strip()][:8]
|
||||
summary_lines.append(f"p{i+1} hits={hits[:6]} | {' | '.join(lines[:4])}")
|
||||
|
||||
sum_path = os.path.join(out_dir, "juzhiyun_page_hits.txt")
|
||||
with open(sum_path, "w", encoding="utf-8") as f:
|
||||
f.write("\n".join(summary_lines))
|
||||
print(f"hit pages={len(summary_lines)} -> {sum_path}")
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
# Extract key chapters from Juzhiyun manual for master data + plan chain
|
||||
from __future__ import annotations
|
||||
import glob, os, re, fitz
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
pdf = glob.glob(os.path.join(ROOT, "demand", "*.pdf"))[0]
|
||||
out = os.path.join(ROOT, "demand", "_extracted", "juzhiyun_key_chapters.txt")
|
||||
doc = fitz.open(pdf)
|
||||
|
||||
# Manual page numbers (printed) → PDF page index from hits:
|
||||
# printed p40 = PDF p46 for 主数据管理
|
||||
# We'll extract by PDF page ranges from page_hits
|
||||
RANGES = [
|
||||
("4.4 主数据管理总述+生产模型", 46, 62),
|
||||
("4.4.2 设备模型", 63, 75),
|
||||
("4.4.5 工艺模型(物料/BOM/工序/工艺路线)", 105, 130),
|
||||
("4.8 工艺设计", 155, 163),
|
||||
("4.9 计划管理(订单/采购/外协/排产)", 163, 184),
|
||||
("4.11/4.13 备料与库存", 199, 226),
|
||||
]
|
||||
|
||||
chunks = []
|
||||
for title, start, end in RANGES:
|
||||
chunks.append(f"\n\n########## {title} PDF {start}-{end} ##########\n")
|
||||
for pno in range(start, min(end, doc.page_count) + 1):
|
||||
text = doc[pno - 1].get_text("text")
|
||||
text = re.sub(r"\n{3,}", "\n\n", text).strip()
|
||||
chunks.append(f"\n----- PDF p{pno} -----\n{text}\n")
|
||||
|
||||
with open(out, "w", encoding="utf-8") as f:
|
||||
f.write("".join(chunks))
|
||||
print(f"wrote {out} chars={sum(len(c) for c in chunks)}")
|
||||
Loading…
Reference in New Issue