From e8932bec17caebaf47f6a8379b8f0506d3520d74 Mon Sep 17 00:00:00 2001 From: "mula.liu" Date: Mon, 13 Apr 2026 16:36:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=95=B4=E7=9A=84=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 9 +- .env.full.example | 7 +- .env.prod.example | 9 +- .gitignore | 9 +- README.md | 22 ++- backend/Dockerfile | 1 + backend/api/system_router.py | 5 + backend/bootstrap/app_runtime.py | 24 ++- backend/core/settings.py | 16 +- backend/core/speech_service.py | 33 ++++ backend/services/default_assets_service.py | 206 +++++++++++++++++++++ backend/services/template_service.py | 32 ++-- data/model/README.md | 9 + data/skills/nano-banana-pro.zip | Bin 0 -> 5317 bytes data/skills/powerpoint-pptx.zip | Bin 0 -> 3596 bytes data/skills/self-improving-agent.zip | Bin 0 -> 26866 bytes data/skills/stock-analysis.zip | Bin 0 -> 79536 bytes data/skills/tavily-search.zip | Bin 0 -> 3459 bytes data/skills/writing.zip | Bin 0 -> 8618 bytes data/templates/agent_md_templates.json | 7 + data/templates/topic_presets.json | 134 ++++++++++++++ docker-compose.full.yml | 10 +- docker-compose.prod.yml | 6 +- scripts/deploy-full.sh | 11 +- scripts/deploy-prod.sh | 2 + 25 files changed, 503 insertions(+), 49 deletions(-) create mode 100644 backend/services/default_assets_service.py create mode 100644 data/model/README.md create mode 100644 data/skills/nano-banana-pro.zip create mode 100644 data/skills/powerpoint-pptx.zip create mode 100644 data/skills/self-improving-agent.zip create mode 100644 data/skills/stock-analysis.zip create mode 100644 data/skills/tavily-search.zip create mode 100644 data/skills/writing.zip create mode 100644 data/templates/agent_md_templates.json create mode 100644 data/templates/topic_presets.json diff --git a/.dockerignore b/.dockerignore index a2e82a0..0d82a62 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,7 +6,14 @@ frontend/node_modules frontend/dist backend/venv -data +data/* +!data/templates/ +!data/templates/** +!data/skills/ +!data/skills/** +!data/model/ +data/model/* +!data/model/README.md workspace **/__pycache__ diff --git a/.env.full.example b/.env.full.example index 5ea02aa..5c7d19b 100644 --- a/.env.full.example +++ b/.env.full.example @@ -1,9 +1,8 @@ # Public exposed port (only nginx is exposed) NGINX_PORT=8080 -# Required absolute host paths. -# They must exist or be creatable by the deployment user and writable by docker daemon. -HOST_DATA_ROOT=/opt/dashboard-nanobot/data +# Project data is always mounted from the repository root `./data`. +# Only workspace root still needs an absolute host path. HOST_BOTS_WORKSPACE_ROOT=/opt/dashboard-nanobot/workspace/bots # Optional custom image tags @@ -72,7 +71,7 @@ WORKSPACE_DOWNLOAD_EXTENSIONS=.pdf,.doc,.docx,.xls,.xlsx,.xlsm,.ppt,.pptx,.odt,. # Local speech-to-text (Whisper via whisper.cpp model file) STT_ENABLED=true STT_MODEL=ggml-small-q8_0.bin -STT_MODEL_DIR=${HOST_DATA_ROOT}/model +STT_MODEL_DIR=/app/data/model STT_DEVICE=cpu STT_MAX_AUDIO_SECONDS=20 STT_DEFAULT_LANGUAGE=zh diff --git a/.env.prod.example b/.env.prod.example index 791f524..c068b26 100644 --- a/.env.prod.example +++ b/.env.prod.example @@ -1,9 +1,8 @@ # Public exposed port (only nginx is exposed) NGINX_PORT=8080 -# REQUIRED absolute host paths. -# They must exist and be writable by docker daemon. -HOST_DATA_ROOT=/opt/dashboard-nanobot/data +# Project data is always mounted from the repository root `./data`. +# Only workspace root still needs an absolute host path. HOST_BOTS_WORKSPACE_ROOT=/opt/dashboard-nanobot/workspace/bots # Optional custom image tags @@ -25,7 +24,7 @@ NPM_REGISTRY=https://registry.npmmirror.com # Database (choose one: SQLite / PostgreSQL / MySQL) # SQLite example: -# DATABASE_URL=sqlite:///${HOST_DATA_ROOT}/nanobot_dashboard.db +# DATABASE_URL=sqlite:////app/data/nanobot_dashboard.db # PostgreSQL example: # DATABASE_URL=postgresql+psycopg://user:password@127.0.0.1:5432/nanobot_dashboard # MySQL example: @@ -65,7 +64,7 @@ WORKSPACE_DOWNLOAD_EXTENSIONS=.pdf,.doc,.docx,.xls,.xlsx,.xlsm,.ppt,.pptx,.odt,. # Local speech-to-text (Whisper via whisper.cpp model file) STT_ENABLED=true STT_MODEL=ggml-small-q8_0.bin -STT_MODEL_DIR=${HOST_DATA_ROOT}/model +STT_MODEL_DIR=/app/data/model STT_DEVICE=cpu STT_MAX_AUDIO_SECONDS=20 STT_DEFAULT_LANGUAGE=zh diff --git a/.gitignore b/.gitignore index b58757e..685dd66 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,14 @@ backend/__pycache__/ backend/*.log # Project runtime data (generated locally) -data/ +data/* +!data/templates/ +!data/templates/** +!data/skills/ +!data/skills/** +!data/model/ +data/model/* +!data/model/README.md workspace/ engines/ diff --git a/README.md b/README.md index 7561d82..477af05 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Dashboard Nanobot 是面向 `nanobot` 的控制平面项目,提供镜像管理 - `USER.md` - `TOOLS.md` - `IDENTITY.md` -- 模板管理:系统级模板改为文件化配置(`backend/templates/agent_md_templates.json` 与 `backend/templates/topic_presets.json`)。 +- 模板管理:系统级模板改为文件化配置(`data/templates/agent_md_templates.json` 与 `data/templates/topic_presets.json`)。 - 2D 运维 Dashboard:Bot 列表、启停、命令发送、日志流、遥测。 - UI 全局支持:Light/Dark 切换、中文/English 切换。 @@ -57,6 +57,13 @@ graph TD - 架构设计:`design/architecture.md` - 数据库设计:`design/database.md` +## 默认资源 + +- 项目根目录 `data/templates/` 保存默认模板资源,会在初始化时同步到运行时数据目录。 +- 项目根目录 `data/skills/` 保存默认 skill 包,会在数据库初始化阶段自动注册到 `skill_market_item`。 +- `data/model/` 不包含语音识别模型文件;模型需要用户自行下载放入该目录或 `STT_MODEL_DIR` 指向的目录。 +- 如果语音模型缺失,后端启动时会打印明确告警,但不会阻断服务启动。 + ## 环境变量配置 - 后端: @@ -102,10 +109,10 @@ graph TD 1. 准备部署变量 - 复制 `.env.prod.example` 为 `.env.prod`(位于项目根目录) - - 配置绝对路径: - - `HOST_DATA_ROOT` + - `data/` 会自动映射到宿主机项目根目录下的 `./data` + - 只需要配置绝对路径: - `HOST_BOTS_WORKSPACE_ROOT` - - 如启用本地语音识别,请将 Whisper `.bin` 模型文件放到 `${HOST_DATA_ROOT}/model/` + - 如启用本地语音识别,请将 Whisper `.bin` 模型文件放到宿主机项目根目录的 `data/model/` 并让 `STT_MODEL` 指向完整文件名,例如 `ggml-small-q8_0.bin` - 中国网络建议配置加速项: - `PIP_INDEX_URL`、`PIP_TRUSTED_HOST` @@ -122,6 +129,7 @@ graph TD - `backend` 不开放宿主机端口,仅在内部网络被 Nginx 访问。 - 上传大小使用单一参数 `UPLOAD_MAX_MB` 控制(后端校验 + Nginx 限制)。 - 必须挂载 `/var/run/docker.sock`,否则后端无法操作 Bot 镜像与容器。 +- `data/` 始终绑定到宿主机项目根目录下的 `./data`,其中模板、默认 skills、语音模型和运行数据都落在这里。 - `HOST_BOTS_WORKSPACE_ROOT` 必须是宿主机绝对路径,并且在 `docker-compose.prod.yml` 中以“同路径”挂载到后端容器。 原因:后端通过 Docker API 创建 Bot 容器时,使用的是宿主机可见的 bind 路径。 - 语音识别当前基于 `pywhispercpp==1.3.1` + Whisper `.bin` 模型文件,不使用 `faster-whisper`。 @@ -144,13 +152,13 @@ graph TD 1. 准备部署变量 - 复制 `.env.full.example` 为 `.env.full` + - `data/` 会自动映射到宿主机项目根目录下的 `./data` - 必填修改: - - `HOST_DATA_ROOT` - `HOST_BOTS_WORKSPACE_ROOT` - `POSTGRES_SUPERPASSWORD` - `POSTGRES_APP_PASSWORD` - `PANEL_ACCESS_PASSWORD` - - 如启用本地语音识别,请将 Whisper `.bin` 模型文件放到 `${HOST_DATA_ROOT}/model/` + - 如启用本地语音识别,请将 Whisper `.bin` 模型文件放到宿主机项目根目录的 `data/model/` 2. 启动完整栈 - `./scripts/deploy-full.sh` 3. 访问 @@ -173,5 +181,5 @@ graph TD ### 注意事项 - `deploy-prod.sh` 和 `deploy-full.sh` 使用的是两套 compose 文件,但复用了相同容器名,不能同时在同一台机器上并行启动。 -- PostgreSQL 数据默认落盘到 `${HOST_DATA_ROOT}/postgres`,Redis 数据默认落盘到 `${HOST_DATA_ROOT}/redis`。 +- PostgreSQL 数据默认落盘到宿主机项目根目录 `./data/postgres`,Redis 数据默认落盘到 `./data/redis`。 - 如果你只想保留前后端容器,继续使用 `deploy-prod.sh`;如果希望把依赖也打包进来,使用 `deploy-full.sh`。 diff --git a/backend/Dockerfile b/backend/Dockerfile index a96c58c..c5220c1 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -20,6 +20,7 @@ RUN if [ -n "${PIP_INDEX_URL}" ]; then pip config set global.index-url "${PIP_IN && pip install -r requirements.txt COPY backend/ /app/backend/ +COPY data/ /app/data/ EXPOSE 8000 diff --git a/backend/api/system_router.py b/backend/api/system_router.py index 6de2288..b9f9340 100644 --- a/backend/api/system_router.py +++ b/backend/api/system_router.py @@ -1,5 +1,6 @@ from fastapi import APIRouter, HTTPException +from core.speech_service import inspect_speech_model_status from core.utils import _get_default_system_timezone from schemas.system import SystemTemplatesUpdateRequest from services.platform_service import get_platform_settings_snapshot, get_speech_runtime_settings @@ -17,6 +18,7 @@ def get_system_defaults(): md_templates = get_agent_md_templates() platform_settings = get_platform_settings_snapshot() speech_settings = get_speech_runtime_settings() + model_status = inspect_speech_model_status() return { "templates": md_templates, "limits": { @@ -41,6 +43,9 @@ def get_system_defaults(): "device": speech_settings["device"], "max_audio_seconds": speech_settings["max_audio_seconds"], "default_language": speech_settings["default_language"], + "ready": model_status["ready"], + "message": model_status["message"], + "expected_path": model_status["expected_path"], }, } diff --git a/backend/bootstrap/app_runtime.py b/backend/bootstrap/app_runtime.py index 6922840..f341c3b 100644 --- a/backend/bootstrap/app_runtime.py +++ b/backend/bootstrap/app_runtime.py @@ -6,10 +6,12 @@ from sqlmodel import Session, select from core.cache import cache from core.database import engine, init_database from core.docker_instance import docker_manager +from core.speech_service import inspect_speech_model_status from core.settings import DATABASE_URL_DISPLAY, REDIS_ENABLED from models.bot import BotInstance from services.bot_storage_service import _migrate_bot_resources_store -from services.platform_service import prune_expired_activity_events +from services.default_assets_service import ensure_default_skill_market_items, ensure_runtime_data_assets +from services.platform_service import get_speech_runtime_settings, prune_expired_activity_events from services.runtime_service import docker_callback, set_main_loop @@ -29,11 +31,31 @@ def register_app_runtime(app: FastAPI) -> None: current_loop = asyncio.get_running_loop() app.state.main_loop = current_loop set_main_loop(current_loop) + asset_report = ensure_runtime_data_assets() + if asset_report["templates_initialized"] or asset_report["skills_synchronized"]: + print( + "[init] 默认资源已同步 " + f"(templates={asset_report['templates_initialized']}, skills={asset_report['skills_synchronized']})" + ) init_database() with Session(engine) as session: + skill_report = ensure_default_skill_market_items(session) + if skill_report["created"] or skill_report["updated"]: + print( + "[init] 默认 skills 已入库 " + f"(created={len(skill_report['created'])}, updated={len(skill_report['updated'])})" + ) prune_expired_activity_events(session, force=True) bots = session.exec(select(BotInstance)).all() for bot in bots: _migrate_bot_resources_store(bot.id) docker_manager.ensure_monitor(bot.id, docker_callback) + speech_settings = get_speech_runtime_settings() + model_status = inspect_speech_model_status() + if speech_settings["enabled"]: + if model_status["ready"]: + print(f"🎙️ 语音识别模型就绪: {model_status['resolved_path']}") + else: + hint = f",请将模型文件放到 {model_status['expected_path']}" if model_status["expected_path"] else "" + print(f"⚠️ 语音识别模型未就绪: {model_status['message']}{hint}") print("✅ 启动自检完成") diff --git a/backend/core/settings.py b/backend/core/settings.py index daeb06c..1da5c9f 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -117,6 +117,13 @@ DATA_ROOT: Final[str] = _normalize_dir_path(os.getenv("DATA_ROOT", str(PROJECT_R BOTS_WORKSPACE_ROOT: Final[str] = _normalize_dir_path( os.getenv("BOTS_WORKSPACE_ROOT", str(PROJECT_ROOT / "workspace" / "bots")) ) +BUNDLED_DATA_ROOT: Final[Path] = (PROJECT_ROOT / "data").resolve() +RUNTIME_DATA_ROOT: Final[Path] = Path(DATA_ROOT).resolve() +BUNDLED_TEMPLATES_ROOT: Final[Path] = (BUNDLED_DATA_ROOT / "templates").resolve() +RUNTIME_TEMPLATES_ROOT: Final[Path] = (RUNTIME_DATA_ROOT / "templates").resolve() +BUNDLED_SKILLS_ROOT: Final[Path] = (BUNDLED_DATA_ROOT / "skills").resolve() +RUNTIME_SKILLS_ROOT: Final[Path] = (RUNTIME_DATA_ROOT / "skills").resolve() +RUNTIME_MODEL_ROOT: Final[Path] = (RUNTIME_DATA_ROOT / "model").resolve() def _normalize_database_url(url: str) -> str: @@ -205,7 +212,7 @@ DEFAULT_WORKSPACE_DOWNLOAD_EXTENSIONS: Final[tuple[str, ...]] = ( ) STT_ENABLED_DEFAULT: Final[bool] = True STT_MODEL: Final[str] = str(os.getenv("STT_MODEL") or "ggml-small-q8_0.bin").strip() -_DEFAULT_STT_MODEL_DIR: Final[Path] = (Path(DATA_ROOT) / "model").resolve() +_DEFAULT_STT_MODEL_DIR: Final[Path] = RUNTIME_MODEL_ROOT _configured_stt_model_dir = _normalize_dir_path(os.getenv("STT_MODEL_DIR", str(_DEFAULT_STT_MODEL_DIR))) if _configured_stt_model_dir and not Path(_configured_stt_model_dir).exists() and _DEFAULT_STT_MODEL_DIR.exists(): STT_MODEL_DIR: Final[str] = str(_DEFAULT_STT_MODEL_DIR) @@ -240,6 +247,7 @@ APP_HOST: Final[str] = str(os.getenv("APP_HOST") or "0.0.0.0").strip() APP_PORT: Final[int] = _env_int("APP_PORT", 8000, 1, 65535) APP_RELOAD: Final[bool] = _env_bool("APP_RELOAD", False) -TEMPLATE_ROOT: Final[Path] = (BACKEND_ROOT / "templates").resolve() -AGENT_MD_TEMPLATES_FILE: Final[Path] = TEMPLATE_ROOT / "agent_md_templates.json" -TOPIC_PRESETS_TEMPLATES_FILE: Final[Path] = TEMPLATE_ROOT / "topic_presets.json" +AGENT_MD_TEMPLATES_FILE: Final[Path] = RUNTIME_TEMPLATES_ROOT / "agent_md_templates.json" +TOPIC_PRESETS_TEMPLATES_FILE: Final[Path] = RUNTIME_TEMPLATES_ROOT / "topic_presets.json" +BUNDLED_AGENT_MD_TEMPLATES_FILE: Final[Path] = BUNDLED_TEMPLATES_ROOT / "agent_md_templates.json" +BUNDLED_TOPIC_PRESETS_TEMPLATES_FILE: Final[Path] = BUNDLED_TEMPLATES_ROOT / "topic_presets.json" diff --git a/backend/core/speech_service.py b/backend/core/speech_service.py index 6cee286..110fd6e 100644 --- a/backend/core/speech_service.py +++ b/backend/core/speech_service.py @@ -24,6 +24,39 @@ class SpeechDurationError(SpeechServiceError): pass +def inspect_speech_model_status() -> Dict[str, Any]: + service = WhisperSpeechService() + model = str(STT_MODEL or "").strip() + model_dir = str(STT_MODEL_DIR or "").strip() + expected_path = "" + + if model: + if any(sep in model for sep in ("/", "\\")): + expected_path = str(Path(model).expanduser()) + elif model_dir: + expected_path = str((Path(model_dir).expanduser() / model).resolve()) + + try: + resolved_path = service._resolve_model_source() + return { + "ready": True, + "model": model, + "model_dir": model_dir, + "expected_path": expected_path or resolved_path, + "resolved_path": resolved_path, + "message": "", + } + except SpeechServiceError as exc: + return { + "ready": False, + "model": model, + "model_dir": model_dir, + "expected_path": expected_path, + "resolved_path": "", + "message": str(exc), + } + + class WhisperSpeechService: def __init__(self) -> None: self._model: Any = None diff --git a/backend/services/default_assets_service.py b/backend/services/default_assets_service.py new file mode 100644 index 0000000..f9a49ef --- /dev/null +++ b/backend/services/default_assets_service.py @@ -0,0 +1,206 @@ +from __future__ import annotations + +import json +import os +import re +import shutil +import zipfile +from pathlib import Path +from typing import Any, Dict, List + +from sqlmodel import Session, select + +from core.settings import ( + AGENT_MD_TEMPLATES_FILE, + BUNDLED_AGENT_MD_TEMPLATES_FILE, + BUNDLED_SKILLS_ROOT, + BUNDLED_TOPIC_PRESETS_TEMPLATES_FILE, + DATA_ROOT, + RUNTIME_MODEL_ROOT, + RUNTIME_SKILLS_ROOT, + RUNTIME_TEMPLATES_ROOT, + TOPIC_PRESETS_TEMPLATES_FILE, +) +from core.utils import ( + _is_ignored_skill_zip_top_level, + _is_valid_top_level_skill_name, + _read_description_from_text, + _sanitize_skill_market_key, +) +from models.skill import SkillMarketItem + + +def _copy_if_missing(src: Path, dst: Path) -> bool: + if not src.exists() or not src.is_file(): + return False + if src.resolve() == dst.resolve() if dst.exists() else False: + return False + if dst.exists(): + return False + dst.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(src, dst) + return True + + +def _copy_if_different(src: Path, dst: Path) -> bool: + if not src.exists() or not src.is_file(): + return False + if src.resolve() == dst.resolve() if dst.exists() else False: + return False + dst.parent.mkdir(parents=True, exist_ok=True) + if dst.exists(): + try: + if src.stat().st_size == dst.stat().st_size and src.read_bytes() == dst.read_bytes(): + return False + except Exception: + pass + shutil.copy2(src, dst) + return True + + +def _iter_bundled_skill_packages() -> List[Path]: + if not BUNDLED_SKILLS_ROOT.exists() or not BUNDLED_SKILLS_ROOT.is_dir(): + return [] + return sorted(path for path in BUNDLED_SKILLS_ROOT.iterdir() if path.is_file() and path.suffix.lower() == ".zip") + + +def ensure_runtime_data_assets() -> Dict[str, int]: + Path(DATA_ROOT).mkdir(parents=True, exist_ok=True) + RUNTIME_TEMPLATES_ROOT.mkdir(parents=True, exist_ok=True) + RUNTIME_SKILLS_ROOT.mkdir(parents=True, exist_ok=True) + RUNTIME_MODEL_ROOT.mkdir(parents=True, exist_ok=True) + + templates_initialized = 0 + skills_synchronized = 0 + + if _copy_if_missing(BUNDLED_AGENT_MD_TEMPLATES_FILE, AGENT_MD_TEMPLATES_FILE): + templates_initialized += 1 + if _copy_if_missing(BUNDLED_TOPIC_PRESETS_TEMPLATES_FILE, TOPIC_PRESETS_TEMPLATES_FILE): + templates_initialized += 1 + + for src in _iter_bundled_skill_packages(): + if _copy_if_different(src, RUNTIME_SKILLS_ROOT / src.name): + skills_synchronized += 1 + + return { + "templates_initialized": templates_initialized, + "skills_synchronized": skills_synchronized, + } + + +def _extract_skill_zip_summary(zip_path: Path) -> Dict[str, Any]: + entry_names: List[str] = [] + description = "" + with zipfile.ZipFile(zip_path) as archive: + members = archive.infolist() + file_members = [member for member in members if not member.is_dir()] + for member in file_members: + raw_name = str(member.filename or "").replace("\\", "/").lstrip("/") + if not raw_name: + continue + first = raw_name.split("/", 1)[0].strip() + if _is_ignored_skill_zip_top_level(first): + continue + if _is_valid_top_level_skill_name(first) and first not in entry_names: + entry_names.append(first) + + candidates = sorted( + [ + str(member.filename or "").replace("\\", "/").lstrip("/") + for member in file_members + if str(member.filename or "").replace("\\", "/").rsplit("/", 1)[-1].lower() + in {"skill.md", "readme.md"} + ], + key=lambda value: (value.count("/"), value.lower()), + ) + for candidate in candidates: + try: + with archive.open(candidate, "r") as file: + preview = file.read(4096).decode("utf-8", errors="ignore") + description = _read_description_from_text(preview) + if description: + break + except Exception: + continue + return { + "entry_names": entry_names, + "description": description, + } + + +def _default_display_name(stem: str) -> str: + chunks = [chunk for chunk in re.split(r"[-_]+", str(stem or "").strip()) if chunk] + if not chunks: + return "Skill" + return " ".join(chunk.upper() if chunk.isupper() else chunk.capitalize() for chunk in chunks) + + +def _resolve_unique_skill_key(existing_keys: set[str], preferred_key: str) -> str: + base_key = _sanitize_skill_market_key(preferred_key) or "skill" + candidate = base_key + counter = 2 + while candidate in existing_keys: + candidate = f"{base_key}-{counter}" + counter += 1 + existing_keys.add(candidate) + return candidate + + +def ensure_default_skill_market_items(session: Session) -> Dict[str, List[str]]: + report: Dict[str, List[str]] = {"created": [], "updated": []} + default_packages = _iter_bundled_skill_packages() + if not default_packages: + return report + + rows = session.exec(select(SkillMarketItem)).all() + existing_by_zip = {str(row.zip_filename or "").strip(): row for row in rows if str(row.zip_filename or "").strip()} + existing_keys = {str(row.skill_key or "").strip() for row in rows if str(row.skill_key or "").strip()} + + for bundled_path in default_packages: + runtime_path = RUNTIME_SKILLS_ROOT / bundled_path.name + source_path = runtime_path if runtime_path.exists() else bundled_path + try: + summary = _extract_skill_zip_summary(source_path) + except Exception: + continue + + zip_filename = bundled_path.name + entry_names_json = json.dumps(summary["entry_names"], ensure_ascii=False) + display_name = _default_display_name((summary["entry_names"] or [bundled_path.stem])[0]) + zip_size_bytes = int(source_path.stat().st_size) if source_path.exists() else 0 + row = existing_by_zip.get(zip_filename) + + if row is None: + row = SkillMarketItem( + skill_key=_resolve_unique_skill_key(existing_keys, bundled_path.stem), + display_name=display_name, + description=str(summary["description"] or "").strip(), + zip_filename=zip_filename, + zip_size_bytes=zip_size_bytes, + entry_names_json=entry_names_json, + ) + session.add(row) + existing_by_zip[zip_filename] = row + report["created"].append(zip_filename) + continue + + changed = False + if int(row.zip_size_bytes or 0) != zip_size_bytes: + row.zip_size_bytes = zip_size_bytes + changed = True + if str(row.entry_names_json or "") != entry_names_json: + row.entry_names_json = entry_names_json + changed = True + if not str(row.display_name or "").strip(): + row.display_name = display_name + changed = True + if not str(row.description or "").strip() and str(summary["description"] or "").strip(): + row.description = str(summary["description"] or "").strip() + changed = True + if changed: + report["updated"].append(zip_filename) + + if report["created"] or report["updated"]: + session.commit() + + return report diff --git a/backend/services/template_service.py b/backend/services/template_service.py index 0ec0070..224b4ab 100644 --- a/backend/services/template_service.py +++ b/backend/services/template_service.py @@ -2,21 +2,30 @@ from __future__ import annotations from typing import Any, Dict, List -from core.settings import AGENT_MD_TEMPLATES_FILE, TOPIC_PRESETS_TEMPLATES_FILE +from core.settings import ( + AGENT_MD_TEMPLATES_FILE, + BUNDLED_AGENT_MD_TEMPLATES_FILE, + BUNDLED_TOPIC_PRESETS_TEMPLATES_FILE, + TOPIC_PRESETS_TEMPLATES_FILE, +) TEMPLATE_KEYS = ("agents_md", "soul_md", "user_md", "tools_md", "identity_md") -def _load_json_object(path: str) -> Dict[str, Any]: +def _load_json_object(path: str, fallback_path: str = "") -> Dict[str, Any]: import json - try: - with open(path, "r", encoding="utf-8") as file: - data = json.load(file) - if isinstance(data, dict): - return data - except Exception: - pass + for candidate in [path, fallback_path]: + candidate = str(candidate or "").strip() + if not candidate: + continue + try: + with open(candidate, "r", encoding="utf-8") as file: + data = json.load(file) + if isinstance(data, dict): + return data + except Exception: + continue return {} @@ -36,12 +45,12 @@ def _write_json_atomic(path: str, payload: Dict[str, Any]) -> None: def get_agent_md_templates() -> Dict[str, str]: - raw = _load_json_object(str(AGENT_MD_TEMPLATES_FILE)) + raw = _load_json_object(str(AGENT_MD_TEMPLATES_FILE), str(BUNDLED_AGENT_MD_TEMPLATES_FILE)) return {key: _normalize_md_text(raw.get(key)) for key in TEMPLATE_KEYS} def get_topic_presets() -> Dict[str, Any]: - raw = _load_json_object(str(TOPIC_PRESETS_TEMPLATES_FILE)) + raw = _load_json_object(str(TOPIC_PRESETS_TEMPLATES_FILE), str(BUNDLED_TOPIC_PRESETS_TEMPLATES_FILE)) presets = raw.get("presets") if not isinstance(presets, list): return {"presets": []} @@ -68,4 +77,3 @@ def update_topic_presets(raw: Dict[str, Any]) -> Dict[str, Any]: def get_agent_template_value(key: str) -> str: return get_agent_md_templates().get(key, "") - diff --git a/data/model/README.md b/data/model/README.md new file mode 100644 index 0000000..7ed4700 --- /dev/null +++ b/data/model/README.md @@ -0,0 +1,9 @@ +# Speech Model Directory + +This directory is reserved for local Whisper `.bin` model files and is intentionally not committed to source control. + +Put the file configured by `STT_MODEL` here, for example: + +- `ggml-small-q8_0.bin` + +If the model file is missing, the backend will still start, but it will print a startup warning and speech transcription requests will not work until the file is added. diff --git a/data/skills/nano-banana-pro.zip b/data/skills/nano-banana-pro.zip new file mode 100644 index 0000000000000000000000000000000000000000..f81ade67a1e2e1c33a6b962a299f08a095b7f33d GIT binary patch literal 5317 zcmai&by!sE+Qx?%kVfekU{lf(Lx^;UNJ_^5Lo*D>5Yi0;(y7DyP)hp69;SANO_ZYT)5h1AZ=`Jp%HN;;$PefDQ22 z`mvj!jrEU*wIIU7?amWl5&#bVHyi-qABPML$N+?8F-@?aJ1n&cru!G|#t+6Hfc=XD zkoS)&>c?jM1bZ|XlaN(Z;yRU`rcRA~W#Us3fn)HOAQT2uvk=GNZPhchKa6g1OL#6li2r9q-JhG@^j16x_g-GKX7 zkl;aCF^!#Gj~_BrpHWWyxj66Vw~@s_pg2BcP8kn>i5%3httUcH zX9*dU5=x75Wf=&*DP+le+QuC*7&E z;5@&xznof<;dl~&#~6g4wA?atUN-a^;{2t(O0}$|UL8o|0i^I@*Vv>proL}r<}t^u z&LfH>*D$Z(l|b^hr5SzR+S2_xIPnNBff{*c-dILM)4W@vDE}s<9rTnGYXNR9p8uz!I@3LyG^Z%423JE5=F_C$T)~e=Cu}@#KJ=2aYKPEk zh0yDCte)^mb~ac}9UY;tCRP#~USpVR9r&9hndQx)0%B9y6DyZ_Wrl{knh}%aYwOo` zd!|EBV^bogZJ0;ltoCkPe&I6S2cgi~8b0EjXI{2(@L9h&JV&OQGF*fnKWJh^Z?)yF zcAxmBf4XUrI~h7i#m`r6uC^>SwY@J)s#a3LI{#Cu+~umHXmK=yd_T9oI-RMlp=iEI zOP!@deHPpDy=-IEzK_odmU=D@)5|KrF%YY0oFQZ*6!cO-VQjr|6!9@G|=`Zc`M8rm*_^dvT>v8$H-`=;7!*%aub{g@18acqJAcky6UK zbd5_XV3^DC1_!+y`pEHpVuNX&L$cjH#Ro3Fm4z5g2W~oM-)cTMDWw14&g$3ly>b$3 z);VVj!K^9lm&${h1%ovEd~sKx^bS;=E??;|^P!*;yNc#(91w`CWT0PrEiIoU?-DG- zlJIo_L{#V2b5SEL%_1)Y0nL@KuIk7yS-A$4dgQ%8@tK?trIh22DoQQli;fBw4+Kce z_1(keBy?o)a@C&N(`!@PTRH4r-H^iPsFbtH2>HYe|A5 zHh!CY!M$N$#zv-0*1CO=Wn5q!JEju-i)Pmde(p)oR^8$h+>$Cq`-dEdx+Uf)eTOWt=Adn_bPLT2Jd*Hc-B)?^tf~Ek0Ug zm_ZVRb@D-14754`LC8*}@`Bq`N@4H2L;$pbj7*$JgV>=mO{cDJM^`iral#`{pe0IzW3wdfXHCx_&-iK zlfT`cgk!4`P!!rhUHqi0w<{l2#A{U^2387>ibd&hfl6y(z(ZozhPF!g zj{Hv>qk1jy{zZH6Yx`{#PZ~V&8ILtYHB3Pn6*}$@CQPI9nTW$ZjqxuUt|>LPS=$^) zRQYtfLMe{SRHO|eiku_z5x!3G2uqc7ZF?LQHLbUf>Dmx6Q(t3fxm!X?s1S{L#0rZ@=*H7N)}c$RP0(p9tV^UyXE7 z)!jPdz4Xb>=5ZHo9}Paoqvt(68^_E(#ho;i#H0^=-hl1jy(iDFM&hH^QRug!-A2xj zU{MVf1Dh17vGR^vFb8FZ7;iaa@FcgEdVqKG5taXL*_pXrXPO+^M)-i~Du^91R4I0~ zFuF>arTZG^U?iYp`M!!-WWW0Nr%idT!VxFtfEWR6k4lEjp-fd?%@;3wElwL|{KBp} zni8@|IMwSkNx6)h1dA+2Pd<71z;mLHde7)EH8($mO7FQR!i%2!N>ljVs2sV^?NZ4c zi5v;oB4PF@5Ghw%soF=Qd!QT2=PyZY9X9f{Ud)wj8bvu0FzdJ&33&!piFG|!f{@u*__%d;@AXIrX=E>+QA35x0UqO&?%++CDSunc7SIlB?g^0>r^?Lq3j61s? zr)crQVwl#U)6+LOg3;yLHF%DY0~-;7_pi1rvZ9{ek`MscqX7VT|AX0cw0~^xVeMsa z1#`7_v=>77{WqVM^V6qEP+sj@x$DcR5V)*YE=B|RlD)I6i|%yJ;xM%;=n4#Rv+Fae za~)1zo`8}HR7|zab#QK_y!Ba<^%?5aQENz5Yl1L~xKqsBuYTw*Ast#+$e~Lz$e%zm zcvaeB=j=T8N7S-bAZ-pap>JkwY)pI%(2-cDefhaxxV@-;-Y!6qt;AKkuu&vQ#i|+ATUShkxON>Nmo243*TvG?5(9&xFO4C&nZVgWRs9P zzR70F6@fs;3MaNGka1sA9+_bxDu4n^^F)J*Wn`Kq&jjY4MM3pvCwEkuDlXnqLutSo#efOjgIV`DN@AYq5_`1b8+=W}^EQ+=LMpntyv;>p<@*%|oL=dyH0 zy_O2S(oFM=A#`a1S(ovt z39(nud7ru2=0rHd6gLmFf?eE69qpi`JX$6+f~))vG@oOw%t#PyEH zKc^;vH|5LDsJQsvWHHq_F=#2wD2d2gWHgM^``U~8Rr4UiY)Yt|M4uAkjjTDD0a7G@ z_Nk0t^l*op`xfq+WiX7Lu@~Q3P!2J6FS7LCp({_llNsBAf7^KDAU(LFmH08Y<1&v(X9oYteY8lB(88UdtpfQ|#$D|Hj z4{UCvx=wj*PTy;y;Q082(_dd?CIvEvX`>>MDHRPkS~BCWxta{Oy`%%GHNi0LdPXl# zw?Km38^@~>VvG#jiBEuybb7FS_4gw5`GPUh|t0R~^la3p0PDu)zj9=$X_l zC$Hm2QuCI!a=hhnPgn$Ja21w0G#V3pxj;YjsT?$ zwr`&`UQ@0@qhI?zUc0stq0lIJZJIQ(bDeC2hU;EhIn)L6zqtDPP7Iw5%{o{gvdi9t z+I=7-{d^=cc*>}LD7agjMA#$awvFjQcn1as%DwdCy@^Y>b=4i)K9DvS5F@k5t5++l z@?w{A5 z7m7PIw+xXF5wY$Fd$}4yYaKF(bSoL%J_VhVQC10 zJMJ}xA2RiFWPaeQQF6PFcc*fedyuup>TITwWBL)b_~EWqW66@f)VL%ZJ#Wkvvx7sO zYQRMv@OrW!Ad-X5jHV$^A>olV*7+$9`EziF=Ggmbc!_MF?a2#SUygXJ>8>R~|6QxT z>DTO%B^~ue*ewBO&X#%^Me`bcn6}vB=CHgx>JR6u6&vsEB(MEH_|tNgx>hr$y<`Z2 zKPlP~l7462H)4@y&Ey3->dqkLY0_t<=3o)YbF7YnPYPwx{fvn#bJY5;WX0-5y;U@W zCx%47>y=lsq*Iv|&2vohbzSdwkA*-|gM=mj9P06RJRpOXbpTWK;)5KZQ@vq zFxCWkUzwZ8)Z(s`KKs=DVI0#*=Q0JmnE-JF_Jp8eBk98WyBelr8~5dMQ6}Wu;qSX%G;k zLj|tf^W8jt_s*Pm&O3k1bLKaH&7-Gj$y@*w~KUeE#nRKJO0sHFi0 z^Sj&qRgix?Qh~WPoc04L;@DKQLdh*mN#%ttlMzXe*@rL^6a=ODgh{Yx6HHwGPGq8Z zzi?wbIxOEud;b!8dFK-UsqvJo$U=rKGj46`dVRaxV+3r!4reLnpH9+{8XES`K zp}p(b@fAsK_u9em&(e{qJF|#)zp)HCI+?g!zj;b$Fv(2T z*>~OuuWBa8jCGvarb>$Gb@YDlyrNx5S$Xz-5syXjkFy%zq%BE%n~ul5uu#!jrM<^_ zksf|lx$#7vQbxXm*#E=p>5%5;&0S8g@Rz zh=xulKd!NuhX({!j9=RYb@q%n>drju4DIFt%uN-m?Fbm1;Td35) z{jDUJY%|Ab9emVhr^*Z1Ymm>m1>Ko0nCzWAvG%o{>p6?coT>ug`1XJ6jobD$qR^S^ zsbjZ<0*l=*$3AxerBGgXftoH8+lHd`$@Y=FYit%XI4OxcwbCUF`AgOB+|^{Jq?)cM zfFb?X-3bXbdi(}Ie3Ctl#FXSzvL129lJ5-35-3UI1lxZF$^v;6Wg-Cv4vrJp(M2oN z45egjX&{4Q++trmTM0IA=SNV7EOuIz4L+LawCRQPg<_2cIhyrkkHT+;L`k@bX2TD2JQq@g5<}^o?t|R@q9hbaB>E<5VTXs6<#MgwtfT61*hR1uV_3^s z7EEd*L*}H64&lf-5-AOn6?Ghx--i68YYoMC`T2W~ad#mfYfwg;h;S=tQ3u-VN0$({ z%lf0Ghh;{``jZggG|KJct~bn%XY|@h@^ox~f-l%}N{SR@2;UQIx^wLIv!nM5?Zr8h zhyUc6L^kum2LL(y;Ph);GIsbdXUwQeW-tZ3?@KRYLE5TfI65&kEg-M~>Fb^Dj>FUq zFPb;eLzOD|N9|tZ;RZhfr6;&S7 zYBX)g%6eS;P1vjl9>H4brcjll|Ba_wIu;u5OieSbe)?l{83VJgAOZB?Os5mm{}T&A zqL5U0MArIq48PS)Q&-{n)`r?qq!$9I&3#XDMp?4G7{-U(eE4;=!)w#)tkX&RbXh+K$M*?1EaFtPScUzw3``P@8LWF^@JU8b zRCTGa{FNe_T;yH8<(rG61tFvm0Y9;Rmc(l=4qkblB^| z46{sOYk1ui#^_N(zG`S31+!f#($9wL#agsJ5Ardn(K=f0#9J&_Hcr6M z>O`4Lkn-f))OXaQigjynu!4=xMby+%I5-$^rRygM$*K7>V`LaXIa>I|4BW%W>TwaU zBua5Zp^+<7T9M_TJ_y)3%NqCD9BB{`Gf6ZlyYNvf^{!T$j#+!?#)FzWX)rv4EDyJ0 zdZ*FWv3tgwVweLVF_EF*X6Z&F70Xhoj;6j*iuBQoJU(UrhhjW@QYdXtkoDfvj8aY_ z@^N%_4a|lH>AELaq-NjbF&P(ozuc70e7JjhGSzM4P*+G@I055W9OX!AaX{K(bljLM z_tK&Egh5U^FhGP);CvmHxoI{oIG0vvyI**E;jP{<5RrqCIUdE*hWAatq{K3CpG&FW zL&ad~Fl1wIR!I?ek%)HySVlyAk8Pn~llegiK0TyJ{;cdtr|8Kr*42x>W*nDh2X7CC3q{-c|~U&0X<{8*Gy~r=)h~&NWN7r1?bVT^)l>SVovCz~bQ!-}|fz z8P9khumV7!VS@v3UsU};uSzp8Tk}MQn|-$puv^8U!-_1CGa7M#t0#o&)s2$umQzQTsavfNl0m>noH^E9rSS_PSC|bT&&yvxG))F8;fIW zVGXc1t5+^njg|M+p+gsMwmsIJUUwit+O-4W(KE86eU{eO(|N`}joWG7a=EaSnwQ42 zh#_d$od#YV((MS~w3_T?m?Ce+z<)k{Pv zA!Z+B7;N5Wsg4!yP+tGdmG$y6`KGxM7G8@z@)6WozI*K;bMQv-+ja7F^vMrdQnmvX z2|L*n6-xhDN2@mPb%xpM(3`!Nvu`$Lwjt7dO??lm90wexVC z)NOsyLv8#cvZX9j;87dHOQsdy0*xPcUC2&SnF}f1rd)OBy0u$UcJ5#Jj(QJWN3bf7 zeB0z@!o9v;8aaFGP&g%Nl>T93ZL4dc?wUYP3j>o3>#rP#>QCDN0D2T|+y84kcK{f- zpZR}Lf9E>?qLzf~{D%5J%;y*X)_VS%|DOW#?|kZCHum4Q{!1PCC;bl2ZCb2flkC^| JRl?id-v9^OVm$x= literal 0 HcmV?d00001 diff --git a/data/skills/self-improving-agent.zip b/data/skills/self-improving-agent.zip new file mode 100644 index 0000000000000000000000000000000000000000..777c24e2f3e53b434ef213a20727f3b8c519acfd GIT binary patch literal 26866 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 literal 0 HcmV?d00001 diff --git a/data/skills/stock-analysis.zip b/data/skills/stock-analysis.zip new file mode 100644 index 0000000000000000000000000000000000000000..0523962d0276a4e1a6f962cbe449f5bf8acacd87 GIT binary patch literal 79536 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±$ivUIJ-kE zFBoBM_&G;@FJud=0=5>LN&e55Q4biG0*ouJRjbgeF5j=8qqnoYvoEQ_W5{HYB_nmd z$?7IVix4;;su49oGSrfP#Q7fo(-uJD%8btf34Pn8)le2g+m{`;ew4G zYca#XiVE)ydsOG@s0J2!-=mGRGGP8wR9(`44zyUae_T_)<|P$PUc6qBR3dvKeccJUQOP1p(j@p)7Mgu=!tfVs1 zS0At)C}je<1J-d~iT6{cQ72xr#6AcxR-S9g%ADHY7#r`FJ$ha%(R=HR+^z4bT6m0+ zV1mHf)j2%JG?SKlHkZqxx<#|Fm=JE-4rw+uUM_bx*)`fG(xlgL&f8vj7?v_@=N&VfxX9Tervmb`6(fDM_XUao%+iyZ0IM{H|Fn>FFsa^6?>WsnL~ zcSS~_D9IJsKjvnazY!ZJpxP%Uy0dy;MqIIHf-WZSbpC}bN0zSv%2wR8vh$ox379Td zxt|{Qj->v5rVBYue|1y8s%5y0cQcigemJkM^@|MQcQYBdSkGj%muEV%CoI6Gd^*LU zX^mC#!W=LugzI8^9s##oIpbj=n#Wtvpv|o@4E)BTGyW}t^DhK8SpYboE>B;8$F~w# z5zM;r;6(YR6&!-&H6ue=-AbgWUG=?7OXbVI_jWKFC$(WhHkmzp`n+@ScX$m4+9L%R zqnRKJnykuMK+W&@exgSGBZ?;F*%{|^`WtEra*E0(-3&~|m?FV8;(~^pD3Vv8F#!K6 zEA|Z5Hy$mDj5r5XGpel^)VGub#_r?eXNx%ZsY~_f(C)2W7Ty?Emi6IapDqk*lYSN| z!}HPEYT_xIcLb9>n-VG>xe7vgB+gE8r{ulitzu85(ejw1_N+)+nmZ2B<|%PU3K7lm0rq=ozCn5?cRF_AdY49MeN?3b~b$pG&B9`gQ{ z{(kKKZu%mWhMMv|$Lw|?{>PpLGn7eb4O%InHzIWw21dGJyW0)t;lzR4sN}&!?5vvA z`xjn9WsyqZVK6i?@5rJVLSkj^BDsMXx`{c`DTB6pe5jcpTOf`F5c{#UXger693%VW9`}dgl2c6`$axt(w7cO>(Xv4HEfVl6|&DH`{ zCKvf4`pEfETXT@Wp=*kMJa0OqLRq|x-*Z<=F7Sc9m;k?|Of6na#!-NkvquNZ2u_<|z4vdY~c zo$ld2DO`EbbJkKt`}z8CuU*|oxB4yx`>z}z`vmYuCs)xit?cntiN zTn?%q#lPXgEk%Mk?`8Jy2bpNO(S2Po(g+SZ%t^;9>JZq)T2JJ`8-J|C2t z%x%vj31&4hK<8&wzsQf^ESdvCaeAC6P4QrqR8Zq0-%&J$Z$K2adkA~QHfV~a;akAvM1=Uj$;CJHj$5Wi46z8m9_ zT>W)?gzXXwAaB#W>DaXN?ae9cRkD&T23jBk*oXzTlyyw;IMMGRnTj1sgs(}gtl~)e z`$~AhXMJwKE=Mfb6VcZ=A}>!yqZAW%1|fUG57~D#oO$v%1&cH

Y6yAIi%h(K<5| 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 literal 0 HcmV?d00001 diff --git a/data/skills/tavily-search.zip b/data/skills/tavily-search.zip new file mode 100644 index 0000000000000000000000000000000000000000..a64d2a3985077a606020597f970938082610dc73 GIT binary patch literal 3459 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 literal 0 HcmV?d00001 diff --git a/data/skills/writing.zip b/data/skills/writing.zip new file mode 100644 index 0000000000000000000000000000000000000000..84b2155d79b13b48921484ccf56fb3a9d5768cf8 GIT binary patch literal 8618 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 Kz(n%b)Bgi`2}!E} literal 0 HcmV?d00001 diff --git a/data/templates/agent_md_templates.json b/data/templates/agent_md_templates.json new file mode 100644 index 0000000..0160d18 --- /dev/null +++ b/data/templates/agent_md_templates.json @@ -0,0 +1,7 @@ +{ + "agents_md": "- 优先完成任务目标\n- 操作前先说明意图\n- 输出必须可执行\n\n## 默认输出规范\n\n- 每次执行任务时,在 workspace 中创建新目录保存本次输出。\n- 输出内容默认采用 Markdown(.md)格式。\n- 最终报告需求.md和.htm双格式。", + "soul_md": "你是专业的企业数字员工,表达清晰、可执行。", + "user_md": "- 语言: 中文\n- 风格: 专业\n- 偏好: 简明且有步骤", + "tools_md": "- 谨慎使用 shell\n- 修改文件后复核\n- 失败时说明原因并重试策略", + "identity_md": "- 角色: 企业数字员工\n- 领域: 运维与任务执行" +} diff --git a/data/templates/topic_presets.json b/data/templates/topic_presets.json new file mode 100644 index 0000000..78c235c --- /dev/null +++ b/data/templates/topic_presets.json @@ -0,0 +1,134 @@ +{ + "presets": [ + { + "id": "politics", + "topic_key": "politics_news", + "name": "时政新闻", + "description": "沉淀国内外时政动态、政策发布与重大公共治理事件,便于集中查看。", + "routing_purpose": "收录与政府决策、政策法规、外交事务及公共治理相关的关键信息。", + "routing_include_when": [ + "时政", + "政策", + "法规", + "国务院", + "政府", + "部委", + "人大", + "政协", + "外交", + "国际关系", + "白宫", + "总统", + "议会", + "election", + "policy" + ], + "routing_exclude_when": [ + "娱乐", + "明星", + "综艺", + "体育", + "游戏", + "购物", + "种草", + "广告" + ], + "routing_examples_positive": [ + "国务院发布新一轮宏观政策措施。", + "外交部就国际热点事件发布声明。", + "某国总统宣布新的对外政策方向。" + ], + "routing_examples_negative": [ + "某明星新剧开播引发热议。", + "某球队转会新闻与赛果分析。", + "数码产品促销与购物推荐汇总。" + ], + "routing_priority": 85 + }, + { + "id": "finance", + "topic_key": "finance_market", + "name": "财经信息", + "description": "聚合宏观经济、市场波动、公司财报与监管政策等财经信息。", + "routing_purpose": "沉淀与资本市场、行业景气、资产价格相关的关键结论与风险提示。", + "routing_include_when": [ + "财经", + "金融", + "股市", + "A股", + "港股", + "美股", + "债券", + "汇率", + "利率", + "通胀", + "GDP", + "财报", + "央行", + "market", + "earnings" + ], + "routing_exclude_when": [ + "娱乐", + "体育", + "游戏", + "影视", + "八卦", + "生活方式", + "旅行攻略" + ], + "routing_examples_positive": [ + "央行公布最新利率决议并释放政策信号。", + "上市公司发布季度财报并上调全年指引。", + "美元指数走强导致主要货币普遍承压。" + ], + "routing_examples_negative": [ + "某综艺节目收视排名变化。", + "某球员转会传闻引发讨论。", + "新游上线玩法测评。" + ], + "routing_priority": 80 + }, + { + "id": "tech", + "topic_key": "tech_updates", + "name": "技术资讯", + "description": "追踪 AI、云计算、开源社区与开发工具链的最新技术资讯。", + "routing_purpose": "沉淀技术发布、版本升级、兼容性变更与工程实践建议。", + "routing_include_when": [ + "技术", + "开源", + "AI", + "模型", + "大语言模型", + "MCP", + "API", + "SDK", + "发布", + "版本", + "升级", + "breaking change", + "security advisory" + ], + "routing_exclude_when": [ + "娱乐", + "体育", + "美食", + "旅游", + "情感", + "八卦" + ], + "routing_examples_positive": [ + "某主流框架发布新版本并调整默认配置。", + "开源项目披露高危安全漏洞并给出修复方案。", + "AI 模型服务更新 API,返回结构发生变化。" + ], + "routing_examples_negative": [ + "某艺人参加活动造型盘点。", + "旅游目的地打卡攻略合集。", + "比赛结果预测与竞猜。" + ], + "routing_priority": 75 + } + ] +} diff --git a/docker-compose.full.yml b/docker-compose.full.yml index ed81450..6617ccf 100644 --- a/docker-compose.full.yml +++ b/docker-compose.full.yml @@ -9,7 +9,7 @@ services: POSTGRES_PASSWORD: ${POSTGRES_SUPERPASSWORD:?POSTGRES_SUPERPASSWORD is required} POSTGRES_DB: ${POSTGRES_BOOTSTRAP_DB:-postgres} volumes: - - ${HOST_DATA_ROOT}/postgres:/var/lib/postgresql/data + - ./data/postgres:/var/lib/postgresql/data expose: - "5432" healthcheck: @@ -32,7 +32,7 @@ services: TZ: ${TZ:-Asia/Shanghai} command: ["redis-server", "--appendonly", "yes", "--save", "60", "1000"] volumes: - - ${HOST_DATA_ROOT}/redis:/data + - ./data/redis:/data expose: - "6379" healthcheck: @@ -74,7 +74,7 @@ services: DATABASE_POOL_TIMEOUT: ${DATABASE_POOL_TIMEOUT:-30} DATABASE_POOL_RECYCLE: ${DATABASE_POOL_RECYCLE:-1800} UPLOAD_MAX_MB: ${UPLOAD_MAX_MB:-100} - DATA_ROOT: ${HOST_DATA_ROOT} + DATA_ROOT: /app/data BOTS_WORKSPACE_ROOT: ${HOST_BOTS_WORKSPACE_ROOT} DATABASE_URL: postgresql+psycopg://${POSTGRES_APP_USER}:${POSTGRES_APP_PASSWORD}@postgres:5432/${POSTGRES_APP_DB} REDIS_ENABLED: ${REDIS_ENABLED:-true} @@ -89,7 +89,7 @@ services: WORKSPACE_DOWNLOAD_EXTENSIONS: ${WORKSPACE_DOWNLOAD_EXTENSIONS:-} STT_ENABLED: ${STT_ENABLED:-true} STT_MODEL: ${STT_MODEL:-ggml-small-q8_0.bin} - STT_MODEL_DIR: ${STT_MODEL_DIR:-${HOST_DATA_ROOT}/model} + STT_MODEL_DIR: ${STT_MODEL_DIR:-/app/data/model} STT_DEVICE: ${STT_DEVICE:-cpu} STT_MAX_AUDIO_SECONDS: ${STT_MAX_AUDIO_SECONDS:-20} STT_DEFAULT_LANGUAGE: ${STT_DEFAULT_LANGUAGE:-zh} @@ -99,7 +99,7 @@ services: STT_INITIAL_PROMPT: ${STT_INITIAL_PROMPT:-以下内容可能包含简体中文和英文术语。请优先输出简体中文,英文单词、缩写、品牌名和数字保持原文,不要翻译。} volumes: - /var/run/docker.sock:/var/run/docker.sock - - ${HOST_DATA_ROOT}:${HOST_DATA_ROOT} + - ./data:/app/data - ${HOST_BOTS_WORKSPACE_ROOT}:${HOST_BOTS_WORKSPACE_ROOT} expose: - "8000" diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index fdcd863..57fd88f 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -20,7 +20,7 @@ services: DATABASE_POOL_TIMEOUT: ${DATABASE_POOL_TIMEOUT:-30} DATABASE_POOL_RECYCLE: ${DATABASE_POOL_RECYCLE:-1800} UPLOAD_MAX_MB: ${UPLOAD_MAX_MB:-100} - DATA_ROOT: ${HOST_DATA_ROOT} + DATA_ROOT: /app/data BOTS_WORKSPACE_ROOT: ${HOST_BOTS_WORKSPACE_ROOT} DATABASE_URL: ${DATABASE_URL:-} REDIS_ENABLED: ${REDIS_ENABLED:-false} @@ -33,7 +33,7 @@ services: PANEL_ACCESS_PASSWORD: ${PANEL_ACCESS_PASSWORD:-} STT_ENABLED: ${STT_ENABLED:-true} STT_MODEL: ${STT_MODEL:-ggml-small-q8_0.bin} - STT_MODEL_DIR: ${STT_MODEL_DIR:-${HOST_DATA_ROOT}/model} + STT_MODEL_DIR: ${STT_MODEL_DIR:-/app/data/model} STT_DEVICE: ${STT_DEVICE:-cpu} STT_MAX_AUDIO_SECONDS: ${STT_MAX_AUDIO_SECONDS:-20} STT_DEFAULT_LANGUAGE: ${STT_DEFAULT_LANGUAGE:-zh} @@ -43,7 +43,7 @@ services: STT_INITIAL_PROMPT: ${STT_INITIAL_PROMPT:-以下内容可能包含简体中文和英文术语。请优先输出简体中文,英文单词、缩写、品牌名和数字保持原文,不要翻译。} volumes: - /var/run/docker.sock:/var/run/docker.sock - - ${HOST_DATA_ROOT}:${HOST_DATA_ROOT} + - ./data:/app/data - ${HOST_BOTS_WORKSPACE_ROOT}:${HOST_BOTS_WORKSPACE_ROOT} expose: - "8000" diff --git a/scripts/deploy-full.sh b/scripts/deploy-full.sh index 48025cd..a6b38d1 100755 --- a/scripts/deploy-full.sh +++ b/scripts/deploy-full.sh @@ -4,6 +4,7 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" ENV_FILE="${1:-$ROOT_DIR/.env.full}" COMPOSE_FILE="$ROOT_DIR/docker-compose.full.yml" +DATA_DIR="$ROOT_DIR/data" require_file() { local path="$1" @@ -89,7 +90,6 @@ wait_for_health() { require_file "$ENV_FILE" "Create it from: $ROOT_DIR/.env.full.example" require_file "$COMPOSE_FILE" "" -load_env_var HOST_DATA_ROOT load_env_var HOST_BOTS_WORKSPACE_ROOT load_env_var POSTGRES_SUPERUSER postgres load_env_var POSTGRES_SUPERPASSWORD @@ -99,7 +99,6 @@ load_env_var POSTGRES_APP_USER load_env_var POSTGRES_APP_PASSWORD load_env_var NGINX_PORT 8080 -require_env HOST_DATA_ROOT require_env HOST_BOTS_WORKSPACE_ROOT require_env POSTGRES_SUPERUSER require_env POSTGRES_SUPERPASSWORD @@ -111,10 +110,10 @@ require_env NGINX_PORT echo "[deploy-full] using env: $ENV_FILE" mkdir -p \ - "$HOST_DATA_ROOT" \ - "$HOST_DATA_ROOT/postgres" \ - "$HOST_DATA_ROOT/redis" \ - "$HOST_DATA_ROOT/model" \ + "$DATA_DIR" \ + "$DATA_DIR/postgres" \ + "$DATA_DIR/redis" \ + "$DATA_DIR/model" \ "$HOST_BOTS_WORKSPACE_ROOT" docker compose --env-file "$ENV_FILE" -f "$COMPOSE_FILE" config -q diff --git a/scripts/deploy-prod.sh b/scripts/deploy-prod.sh index 8c992aa..6cd98aa 100755 --- a/scripts/deploy-prod.sh +++ b/scripts/deploy-prod.sh @@ -3,6 +3,7 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" ENV_FILE="${1:-$ROOT_DIR/.env.prod}" +DATA_DIR="$ROOT_DIR/data" if [[ ! -f "$ENV_FILE" ]]; then echo "Missing env file: $ENV_FILE" @@ -11,6 +12,7 @@ if [[ ! -f "$ENV_FILE" ]]; then fi echo "[deploy] using env: $ENV_FILE" +mkdir -p "$DATA_DIR" "$DATA_DIR/model" docker compose --env-file "$ENV_FILE" -f "$ROOT_DIR/docker-compose.prod.yml" config -q docker compose --env-file "$ENV_FILE" -f "$ROOT_DIR/docker-compose.prod.yml" up -d --build