Skip to content

Commit 426fa1e

Browse files
authored
Merge branch 'release-2026.0.0' into change_certs_permissions
2 parents f8a5e08 + da2c571 commit 426fa1e

File tree

45 files changed

+1017
-82
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1017
-82
lines changed

education-ai-suite/smart-classroom/components/mindmap_component.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ def generate_mindmap(self, summary_text):
3939
add_generation_prompt=True
4040
)
4141

42-
mindmap_streamer = self.model.generate(mindmap_prompt)
43-
full_mindmap = "".join(token for token in mindmap_streamer)
42+
full_mindmap = self.model.generate(mindmap_prompt, False)
4443
StorageManager.save(mindmap_path, full_mindmap, append=False)
4544
logger.info("Mindmap generation completed successfully.")
4645
return full_mindmap

education-ai-suite/smart-classroom/config.yaml

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ mindmap:
259259
10. Ensure conceptual accuracy - each node should represent a distinct, meaningful concept
260260
11. Do NOT include any markdown formatting, code fences, or explanatory text
261261
12. Output only the raw JSON structure
262+
13. Always return a valid JSON structure.
262263

263264
Example of GOOD specificity:
264265
{
@@ -321,12 +322,13 @@ mindmap:
321322
10. 确保概念准确性 - 每个节点应代表一个独特、有意义的概念
322323
11. 不要包含任何markdown格式、代码块或解释性文本
323324
12. 只输出原始JSON结构
325+
13. 始终返回有效的JSON结构。
324326

325327
良好特异性示例:
326328
{
327329
"meta": {
328-
"name": "physics_lecture",
329-
"author": "ai_assistant",
330+
"name": "物理课程",
331+
"author": "人工智能助手",
330332
"version": "1.0"
331333
},
332334
"format": "node_tree",
@@ -335,21 +337,21 @@ mindmap:
335337
"topic": "量子力学与波动理论",
336338
"children": [
337339
{
338-
"id": "wave_particle_duality",
340+
"id": "波粒二象性",
339341
"topic": "波粒二象性",
340342
"children": [
341-
{"id": "photon_behavior", "topic": "光子同时表现出波动和粒子特性"},
342-
{"id": "double_slit", "topic": "双缝实验证明干涉现象"},
343-
{"id": "measurement_effect", "topic": "测量导致波函数坍缩"}
343+
{"id": "光子特性", "topic": "光子同时表现出波动和粒子特性"},
344+
{"id": "双缝实验", "topic": "双缝实验证明干涉现象"},
345+
{"id": "测量效应", "topic": "测量导致波函数坍缩"}
344346
]
345347
},
346348
{
347-
"id": "uncertainty_principle",
349+
"id": "不确定性原理",
348350
"topic": "海森堡不确定性原理",
349351
"children": [
350-
{"id": "position_momentum", "topic": "无法同时精确知道位置和动量"},
351-
{"id": "mathematical_formulation", "topic": "Δx·Δp ≥ ℏ/2 数学关系"},
352-
{"id": "quantum_limitations", "topic": "量子测量的基本限制"}
352+
{"id": "位置动量", "topic": "无法同时精确知道位置和动量"},
353+
{"id": "数学表达式", "topic": "Δx·Δp ≥ ℏ/2 数学关系"},
354+
{"id": "量子限制", "topic": "量子测量的基本限制"}
353355
]
354356
}
355357
]

education-ai-suite/smart-classroom/docs/user-guide/get-started.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ Bring Up the Frontend:
108108
> The backend terminal stays busy serving requests.
109109
110110
```bash
111-
cd C:\path\to\edge-ai-suites\education-ai-suite\smart-classroom\ui
111+
cd <path-to>\edge-ai-suites\education-ai-suite\smart-classroom\ui
112112
npm install
113113
npm run dev -- --host 0.0.0.0 --port 5173
114114
```

health-and-life-sciences-ai-suite/multi_modal_patient_monitoring/configs/model-config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ ai-ecg:
44
type: ai-ecg
55
hub: hls
66
target_dir: /models/ai-ecg
7+
nodel_url: https://raw.githubusercontent.com/Einse57/OpenVINO_sample/master/ai-ecg-master
78
ir_file: ecg_8960_ir10_fp16.xml
89
video_dir: /videos/ai-ecg
910
- name: ecg_17920_ir10_fp16
1011
type: ai-ecg
1112
hub: hls
1213
target_dir: /models/ai-ecg
14+
nodel_url: https://raw.githubusercontent.com/Einse57/OpenVINO_sample/master/ai-ecg-master
1315
ir_file: ecg_17920_ir10_fp16.xml
1416
video_dir: /videos/ai-ecg
1517

@@ -20,13 +22,17 @@ rppg:
2022
hub: hls
2123
target_dir: /models/rppg
2224
model_file: mtts_can.hdf5
25+
model_url: https://github.com/xliucs/MTTS-CAN/raw/main/mtts_can.hdf5
2326
video_dir: /videos/rppg
27+
video_url: https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi
2428

2529
pose-3d:
2630
models:
2731
- name: human-pose-estimation-3d-0001
2832
type: 3d-pose
2933
hub: hls
3034
target_dir: /models/3d-pose
35+
model_url: https://storage.openvinotoolkit.org/repositories/open_model_zoo/public/2022.1/human-pose-estimation-3d-0001/human-pose-estimation-3d.tar.gz
3136
ir_file: human-pose-estimation-3d-0001.xml
3237
video_dir: /videos/3d-pose
38+
video_url: https://www.pexels.com/download/video/6130537

health-and-life-sciences-ai-suite/multi_modal_patient_monitoring/services/patient-monitoring-assets/Dockerfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ WORKDIR /app
2626
# Python deps for asset generation
2727
# ----------------------------
2828
COPY requirements.txt /app/requirements.txt
29-
RUN pip install --no-cache-dir -r /app/requirements.txt
29+
RUN pip install --default-timeout=300 --retries 5 --no-cache-dir -r /app/requirements.txt
3030

3131
# ----------------------------
3232
# App scripts used to build assets (model-config.yaml is mounted at runtime)
@@ -54,7 +54,6 @@ ARG HTTPS_PROXY
5454
ARG NO_PROXY
5555

5656

57-
5857
WORKDIR /app
5958

6059
# Minimal system deps (no heavy ML frameworks here)

health-and-life-sciences-ai-suite/multi_modal_patient_monitoring/services/patient-monitoring-assets/scripts/3d_pose_model_convert.py

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@
1515
CONFIG_PATH = Path("/app/configs/model-config.yaml")
1616

1717

18-
def _load_pose_model_config() -> tuple[str, str, str]:
19-
"""Load 3D pose model name, target_dir, and video_dir from config.
18+
def _load_pose_model_config() -> tuple[str, str, str, str, str]:
19+
"""Load 3D pose model settings from config.
2020
2121
This function expects /app/configs/model-config.yaml to exist and to
22-
define pose-3d.models[0] with at least name, target_dir, and
23-
video_dir. If any of these are missing or the file is not readable,
24-
the script will raise and fail fast instead of using hardcoded
25-
defaults.
22+
define pose-3d.models[0] with at least:
23+
24+
- name
25+
- target_dir
26+
- model_url
27+
- video_dir
28+
- video_url
29+
30+
If any of these are missing or the file is not readable, the script
31+
will raise and fail fast instead of using hardcoded defaults.
2632
"""
2733
if not CONFIG_PATH.exists():
2834
raise FileNotFoundError(
@@ -45,17 +51,26 @@ def _load_pose_model_config() -> tuple[str, str, str]:
4551
first = models[0] or {}
4652
name = first.get("name")
4753
target_dir = first.get("target_dir")
54+
model_url = first.get("model_url")
4855
video_dir = first.get("video_dir")
56+
video_url = first.get("video_url")
4957

50-
if not name or not target_dir or not video_dir:
58+
if not name or not target_dir or not model_url or not video_dir or not video_url:
5159
raise ValueError(
52-
"pose-3d.models[0] must define name, target_dir, and video_dir in model-config.yaml."
60+
"pose-3d.models[0] must define name, target_dir, model_url, "
61+
"video_dir, and video_url in model-config.yaml."
5362
)
5463

55-
return str(name), str(target_dir), str(video_dir)
64+
return (
65+
str(name),
66+
str(target_dir),
67+
str(video_dir),
68+
str(model_url),
69+
str(video_url),
70+
)
5671

5772

58-
MODEL_NAME, MODEL_TARGET_DIR, MODEL_VIDEO_DIR = _load_pose_model_config()
73+
MODEL_NAME, MODEL_TARGET_DIR, MODEL_VIDEO_DIR, MODEL_URL, VIDEO_URL = _load_pose_model_config()
5974

6075
# Directory where the 3D pose model assets will be stored
6176
# Use the same default as omz-model-download.sh: /models/3d-pose
@@ -78,22 +93,14 @@ def _load_pose_model_config() -> tuple[str, str, str]:
7893
ov_model_path = base_model_dir / f"{MODEL_NAME}.xml"
7994

8095
# Demo video path
81-
video_url = "https://storage.openvinotoolkit.org/data/test_data/videos/face-demographics-walking.mp4"
8296
video_path = videos_dir / "face-demographics-walking.mp4"
8397

8498

8599
# 1) Download and extract the .pth checkpoint if needed
86100
if not ckpt_file.exists():
87-
# URL still points to the default OMZ model; MODEL_NAME controls
88-
# the local file naming via config.
89-
url = (
90-
"https://storage.openvinotoolkit.org/repositories/open_model_zoo/public/2022.1/"
91-
"human-pose-estimation-3d-0001/human-pose-estimation-3d.tar.gz"
92-
)
93-
94101
if not tar_path.exists():
95-
print(f"Downloading 3D pose checkpoint from {url}")
96-
urllib.request.urlretrieve(url, tar_path)
102+
print(f"Downloading 3D pose checkpoint from {MODEL_URL}")
103+
urllib.request.urlretrieve(MODEL_URL, tar_path)
97104
print(f"Saved checkpoint archive to {tar_path}")
98105

99106
print(f"Extracting checkpoint archive into {base_model_dir}")
@@ -104,8 +111,19 @@ def _load_pose_model_config() -> tuple[str, str, str]:
104111

105112
# 1b) Download the demo video if needed
106113
if not video_path.exists():
107-
print(f"Downloading 3D pose demo video from {video_url}")
108-
urllib.request.urlretrieve(video_url, video_path)
114+
print(f"Downloading 3D pose demo video from {VIDEO_URL}")
115+
# Pexels blocks the default Python user-agent; mimic a browser and
116+
# send a valid Referer so the request matches typical browser usage.
117+
req = urllib.request.Request(
118+
VIDEO_URL,
119+
headers={
120+
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
121+
"(KHTML, like Gecko) Chrome/120.0 Safari/537.36",
122+
"Referer": "https://www.pexels.com/",
123+
},
124+
)
125+
with urllib.request.urlopen(req) as resp, video_path.open("wb") as out_f:
126+
shutil.copyfileobj(resp, out_f)
109127
print(f"Saved 3D pose demo video to {video_path}")
110128

111129

@@ -141,4 +159,4 @@ def _load_pose_model_config() -> tuple[str, str, str]:
141159
except FileNotFoundError:
142160
pass
143161

144-
print("✅ OpenVINO IR model saved:", ov_model_path)
162+
print("✅ OpenVINO IR model saved:", ov_model_path)

health-and-life-sciences-ai-suite/multi_modal_patient_monitoring/services/patient-monitoring-assets/scripts/ecg_download_assets.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ def download_file(url: str, dest: Path, desc: str) -> None:
2828
raise
2929

3030

31-
def load_ecg_models_from_config() -> list[tuple[Path, str, str]]:
31+
def load_ecg_models_from_config() -> list[tuple[Path, str, str, str]]:
3232
"""Load ECG model directories and filenames from model-config.yaml.
3333
34-
Returns a list of tuples: (target_dir, xml_filename, bin_filename).
34+
Returns a list of tuples: (target_dir, xml_filename, bin_filename, model_url).
3535
This function expects /app/configs/model-config.yaml to exist and to
3636
define ai-ecg.models[*] entries with at least target_dir and
3737
ir_file or name. If the file is missing or malformed, it will
@@ -61,6 +61,7 @@ def load_ecg_models_from_config() -> list[tuple[Path, str, str]]:
6161
target_dir_val = m.get("target_dir")
6262
ir_file_val = m.get("ir_file")
6363
name_val = m.get("name")
64+
model_url_val = m.get("model_url")
6465

6566
if not target_dir_val:
6667
raise ValueError(
@@ -86,7 +87,19 @@ def load_ecg_models_from_config() -> list[tuple[Path, str, str]]:
8687
)
8788

8889
bin_file = xml_file.replace(".xml", ".bin")
89-
result.append((target_dir, xml_file, bin_file))
90+
91+
# model_url is optional in config for backward compatibility; if
92+
# omitted, fall back to the legacy BASE_URL.
93+
if not model_url_val:
94+
logger.warning(
95+
"ai-ecg.models entry missing model_url; falling back to BASE_URL %s",
96+
BASE_URL,
97+
)
98+
model_url = BASE_URL
99+
else:
100+
model_url = str(model_url_val)
101+
102+
result.append((target_dir, xml_file, bin_file, model_url))
90103

91104
return result
92105

@@ -96,7 +109,7 @@ def main() -> int:
96109

97110
models = load_ecg_models_from_config()
98111

99-
for target_dir, xml_name, bin_name in models:
112+
for target_dir, xml_name, bin_name, model_url in models:
100113
target_dir.mkdir(parents=True, exist_ok=True)
101114
logger.info("Using ECG model directory: %s", target_dir)
102115

@@ -106,7 +119,7 @@ def main() -> int:
106119
logger.info("%s already exists, skipping", dest)
107120
continue
108121

109-
url = f"{BASE_URL}/{fname}"
122+
url = f"{model_url}/{fname}"
110123
download_file(url, dest, fname)
111124

112125
logger.info("ECG models ready")

0 commit comments

Comments
 (0)