feat: release v0.6.1 with new document parsing trace timeline, OpenSearch vector store driver, YAML-based built-in model configuration, and system admin settings. Includes UI redesigns, new-user onboarding guide, and various improvements and bug fixes. See CHANGELOG.md for details.

This commit is contained in:
wizardchen
2026-06-05 16:33:23 +08:00
committed by lyingbug
parent 9e898ae72c
commit 946ff5557a
16 changed files with 2953 additions and 34 deletions
+87
View File
@@ -2,6 +2,93 @@
All notable changes to this project will be documented in this file.
## [0.6.1] - 2026-06-05
### New Features
- **NEW**: **Document Parsing Trace Timeline** — the headline of this release. Every document now records a Langfuse-style span tree (`knowledge_processing_spans`) so you can watch parsing progress stage-by-stage in real time. Highlights:
- **Waterfall timeline UI** redesigned as a Langfuse-style side drawer with attempt tabs, resizable width persisted to local storage, and a header "Trace" pill; reachable directly from the card menu.
- **Per-stage instrumentation**: a new `/stages` API tracks each parsing stage; postprocess subspans, per-image multimodal subspans, and synthesized-stage status (inferred from `parse_status`) are surfaced; root span closes on terminal state with enriched stage metadata.
- **Stop-parse control**: cancel an in-flight parse from the timeline panel; cancellation moves the document into a "finalizing" post-process state with a reliable finalizing-subtask counter (drains on all terminal exits) and async question fan-out.
- **Reliability**: documents no longer get stuck in "processing"; housekeeping is protected from false-killing long-running stages; polling switched to `setInterval` + watchdog with attempt tracking and surfaced silent failures.
- **NEW**: **OpenSearch vector store driver** — a full new retrieval backend, landed across three PRs (interface skeleton → read/write paths → activated k-NN driver), with bulk update, by-query delete, copy, health-check, SSRF-aware transport, and an integration-test guide (`docs/dev/opensearch-integration-test.md`).
- **NEW**: **Declarative built-in models via YAML** — `config/builtin_models.yaml` drives the platform's built-in model catalog with `${ENV}` interpolation, a `managed_by` column, lifecycle reconciliation, and a drift sweep that keeps the DB in sync with the YAML. Entries are schema-validated and ID lengths aligned with the DB. See `config/builtin_models.yaml.example`.
- **NEW**: **System Admin & Platform Settings** — system-admin bootstrap/promotion with revocation safeguards, a consolidated single Settings panel merging system admin and settings, a platform audit log with polished audit drawers, and server-side system settings management.
- **NEW**: **New-User Onboarding Guide** — an interactive spotlight/tour (`NewUserGuide`) with contextual guides for agent and knowledge-base creation, tenant-model-readiness hints, login hints for new users, and an improved backdrop/hole calculation, integrated into the user menu.
- **NEW**: **Settings UI redesign** — model cards with type badges, redesigned vector-store / parser / storage-engine cards, redesigned web-search / MCP provider cards, brand logos replacing monogram badges, regrouped sidebar nav with a header pinned on scroll, and vector-store test moved into the card menu with a toast result.
- **NEW**: **`weknora` CLI v0.7 / v0.8** (BREAKING) — agent-first wire contract and command-surface cleanup:
- **Command-surface rename**: `session ask`, `session continue-stream`, `doc fetch`, `doc create`, `doc delete --all`; `context` CRUD replaced by a `profile` cascade (`context` → `profile`); `agent invoke` / `kb empty` removed.
- **`--format json` is now the default** with an NDJSON event stream (one JSON event per line) and symmetric envelope infrastructure.
- **Agent safety nets**: `--dry-run` with risk metadata and validation parity across 19 mutations; `MCP Tool.Annotations` added to 10 tools (spec 2025-06-18).
- **NEW**: **Parser engine expansion** — OpenDataLoader and PaddleOCR-VL (cloud + local) engines join the doc-reader; scanned-PDF parsing sped up with streamed image results and isolated heavy async queues; dedicated Excel/PPT converters, PPTX media extraction, and Markdown-table normalization; a hybrid OpenDataLoader Docker image (`docker/Dockerfile.odl-hybrid`); reorganized Markdown parser with enhanced gRPC document reading.
- **NEW**: **MCP server multi-transport** — the Python MCP server now supports stdio / SSE / HTTP transports and exposes read-only wiki tools; the MCP service is optional via the `full` Docker profile.
- **NEW**: **Thinking-mode configuration in the model editor** — per-model thinking-mode controls (`thinkingControl`) plus improved `<think>` tag handling in chat messages and an agent `think_stream` tool; the chat provider was modularized (request / stream / transport / usage / thinking split out).
- **NEW**: **More models & providers** — Milvus database selection for vector stores; Tencent Cloud LKEAP Rerank; native Gemini embeddings; MiniMax-M3 in the provider model list; a local image resolver for multimodal chat.
- **NEW**: **Cached prompt tokens** surfaced from upstream usage, with clarified cached-token semantics for explicit-cache providers.
- **NEW**: **KB experience** — a `KBSwitcherDropdown` for fast KB selection, a consolidated `KBInfoPopover` (reused on FAQ KBs with correct document/FAQ counts), multi-KB search retrieval parameters, and KB ↔ vector-store binding surfaced in the list, editor, and detail UI (with a `VectorStoreBadge`).
- **NEW**: **Multi-use share-link invitations** for `invite_only` mode (RBAC), with register-by-invite and a tenant invite-link flow.
- **NEW**: **FAQ enhancements** — improved FAQ handling/localization plus a `faq_snippet` agent tool.
- **NEW**: **"View in Graph"** entry on wiki pages.
- **NEW**: **Server startup time & uptime tracking** exposed via a new runtime server module.
- **NEW**: **Chat request-info / debug button** — inspect the debug payload for stream requests from the chat toolbar.
- **NEW**: **`LOG_FORMAT` template** support with hardened level coloring.
- **NEW**: **Windows build support for the sandbox** — Linux remains the default implementation; Windows now compiles via a dedicated stub.
- **NEW**: **`display_name` column on models** and an expanded `knowledge.source` column length.
### Improvements
- **IMPROVED**: Retrieval — Elasticsearch search responses exclude the embedding field to reduce payload size; rerank pipeline falls back to raw retrieval results when the rerank API fails; OpenSearch type prep added ahead of the driver.
- **IMPROVED**: Qdrant — optimized batch save, map iteration, and error wrapping.
- **IMPROVED**: Knowledge — chunks stitched by text overlap instead of position; image caption/OCR text preserved in document summaries; single-item delete routed through the async pipeline with list polling after delete; stale knowledge records avoided on upload failure.
- **IMPROVED**: Chat — model-selection handling refined; in-progress messages stay reactive so continue-stream renders; user multi-line query formatting preserved; user message container supports pre-wrapped text.
- **IMPROVED**: Agent — event routing for reasoning vs. answers in streaming; content filtering in streaming events; intent-prompt customization in the agent editor (whitespace preserved); deterministic ordering of function definitions; `final_answer` tool references removed.
- **IMPROVED**: Configuration — asynq concurrency settings tuned; env-file array form used for `builtin_models` compatibility.
- **IMPROVED**: Frontend — floating-UI / agent-selector positioning corrected under root `zoom`; settings cards' interactions and accessibility polished; `X-Tenant-ID` override preserved when switching back to home.
- **IMPROVED**: Multimodal — embedding input image-payload safety hardened; image payload sanitization in the hybrid indexer.
### Bug Fixes
- **FIXED**: Schema — expanded knowledge-source length to avoid truncation.
- **FIXED**: Knowledge — reject `reuse_vectors` knowledge moves across stores; deep-copy stored files and images when cloning a KB; guard the knowledge list against stale updates.
- **FIXED**: Handler — `/knowledge/search` accepts `?query=` and rejects empty keywords; multiple Swagger endpoints that returned 404 fixed and docs regenerated.
- **FIXED**: Datasource — sync fails when all fetched items fail; Feishu wiki node parents preserved and Feishu connector capabilities aligned; slower datasource resource listing allowed; credential validation skipped when editing a data source; Yuque team token supported.
- **FIXED**: Session — user-requested stop events handled gracefully in QA execution; stop watcher gains a timeout; agent system prompt preserved for greetings (reverted, then refined).
- **FIXED**: IM — synthetic identity injected so IM channels can use shared KBs; recover from deleted session when `GetSession` returns the app sentinel; presigned-URL flow made diagnosable end-to-end.
- **FIXED**: Security — throttling for protected file-fetch retries; vector-store connection addresses validated against SSRF policy; tenant validation for file access; tenant default storage-provider handling on KB creation.
- **FIXED**: Repository — `tenant_id` qualified with the table name to resolve an ambiguous-column error; built-in models query syntax corrected.
- **FIXED**: Multi-turn — `multi-turn-disabled` flag respected in the KnowledgeQA pipeline.
- **FIXED**: Doris — `LIMIT`/`OFFSET` inlined as literals with parameter interpolation enabled.
- **FIXED**: Doc parsing — DOC→DOCX conversion reliability improved; MinerU markdown and relative images preserved.
- **FIXED**: Frontend — `{size}` param passed to the `fileSizeExceeded` i18n message on Nginx 413; wrong toast when selecting built-in agents other than quick-answer / smart-reasoning; default context template applied when switching to quick-answer mode; card popover closed before opening the delete-confirm dialog.
- **FIXED**: Embedding — native Gemini embeddings supported.
- **FIXED**: Events — panic recovery added to async goroutines.
- **FIXED**: Milvus — skip empty enabled-status groups.
- **FIXED**: Agent — tool-parameter parsing hardened against LLM type mismatches.
- **FIXED**: Container — `resetPendingTasks` startup SQL corrected.
### Refactoring
- **REFACTOR**: Chat provider modularized into request / stream / transport / usage / thinking / stream-emit files; legacy `chat_provider_spec` removed.
- **REFACTOR**: Logger — `LOG_FORMAT` template support with hardened level coloring.
- **REFACTOR**: Migrations — deprecated user-system-admin migration files removed; system-settings migration introduced.
- **REFACTOR**: Knowledge — flat stage table replaced with a Langfuse-style span tree; cancel-parse flow and user-confirmation dialogs streamlined; terminology clarified across parsing docs and UI.
- **REFACTOR**: CLI — symmetric envelope infrastructure; envelope sweep (Emit shape, batch ops, MCP `StructuredContent`); context→profile cascade with post-review hardening.
- **REFACTOR**: Settings — system-settings management and UI consolidated; provider/vector-store card chrome tightened.
- **REFACTOR**: Chunk — removed the unused `VideoInfo` field from the `Chunk` struct.
### Infrastructure & Build
- **BUILD**: New migrations `000052`–`000058` — `models.managed_by`, system admin & settings, invitation tokens, `knowledge_processing_spans`, knowledge pending subtasks, `models.display_name`, and expanded knowledge source.
- **BUILD**: `opensearch-go` v4.6.0 added; `github.com/mattn/go-runewidth` bumped.
- **BUILD**: Dedicated `mcp-server/Dockerfile`; MCP service gated behind the `full` Docker profile.
### Documentation
- **DOC**: New `docs/日志配置.md` (logging configuration guide).
- **DOC**: OpenSearch integration-test guide (`docs/dev/opensearch-integration-test.md`).
- **DOC**: CLI — `AGENTS.md`, `README.md`, and `CHANGELOG.md` brought in sync with the v0.7 / v0.8 surface.
- **DOC**: Clarified cached-token semantics for explicit-cache providers in chat docs.
## [0.6.0] - 2026-05-21
### New Features
+5 -4
View File
@@ -28,7 +28,7 @@
<img src="https://img.shields.io/badge/License-MIT-ffffff?labelColor=d4eaf7&color=2e6cc4" alt="License">
</a>
<a href="./CHANGELOG.md">
<img alt="Version" src="https://img.shields.io/badge/version-0.6.0-2e6cc4?labelColor=d4eaf7">
<img alt="Version" src="https://img.shields.io/badge/version-0.6.1-2e6cc4?labelColor=d4eaf7">
</a>
</p>
@@ -57,6 +57,7 @@ The framework supports auto-syncing knowledge from Feishu, Notion, and Yuque (mo
## ✨ Latest Updates
- **v0.6.1** — Document parsing trace timeline (Langfuse-style span tree with stage-by-stage progress + stop-parse); OpenSearch vector store driver; declarative built-in models via YAML; system admin & consolidated platform settings + audit log; new-user onboarding guide; settings UI redesign; `weknora` CLI v0.7 / v0.8 (agent-first wire contract, NDJSON, `--dry-run`); OpenDataLoader + PaddleOCR-VL parsers; MCP server multi-transport (stdio / SSE / HTTP); per-model thinking-mode config; Tencent LKEAP rerank + native Gemini embeddings + MiniMax-M3. See [`CHANGELOG.md`](./CHANGELOG.md).
- **v0.6.0** — Tenant RBAC (4-tier role matrix `Owner` / `Admin` / `Contributor` / `Viewer` + per-KB ownership + per-tenant audit log), tenant member management & multi-workspace UX, self-service workspaces; `weknora` CLI v0.4 GA with `mcp serve`; KB retrieval fan-out across vector stores; AES-256-GCM credential encryption + docreader gRPC TLS + Token; Zhipu embedder + Huawei OBS; server-side user preferences; Go 1.26.0. See [`docs/RBAC说明.md`](./docs/RBAC说明.md) and [`CHANGELOG.md`](./CHANGELOG.md).
- **v0.5.2** — Wiki ingest scales to 40k-document KBs (task queue + DLQ); MCP human-in-the-loop tool approval; Anthropic / Apache Doris / Tencent VectorDB / KS3 / SearXNG backends; adaptive 3-tier chunking with live preview; global ⌘K command palette; Yuque connector + WeChat Mini Program; `weknora` CLI preview.
- **v0.5.1** — Knowledge-base batch management; tenant-wide IM channels overview; session search + user-scoped pinning; unified Model / Web Search / MCP settings cards; per-agent LLM timeout; desktop tenant switching.
@@ -125,7 +126,7 @@ Fully modular pipeline from document parsing, vectorization, and retrieval to LL
|------------|---------|
| LLMs | OpenAI / Azure OpenAI / Anthropic (Claude) / DeepSeek / Qwen (Alibaba Cloud) / Zhipu / Hunyuan / Doubao (Volcengine) / Gemini / MiniMax / NVIDIA / Novita AI / SiliconFlow / OpenRouter / Ollama |
| Embeddings | Ollama / BGE / GTE / Zhipu / OpenAI-compatible APIs |
| Vector DBs | PostgreSQL (pgvector) / Elasticsearch / Milvus / Weaviate / Qdrant / Apache Doris / Tencent VectorDB |
| Vector DBs | PostgreSQL (pgvector) / Elasticsearch / OpenSearch / Milvus / Weaviate / Qdrant / Apache Doris / Tencent VectorDB |
| Object Storage | Local / MinIO / AWS S3 / Volcengine TOS / Alibaba Cloud OSS / Kingsoft Cloud KS3 / Huawei Cloud OBS |
| IM Channels | WeCom / Feishu / Slack / Telegram / DingTalk / Mattermost / WeChat |
| Web Search | DuckDuckGo / Bing / Google / Tavily / Baidu / Ollama / SearXNG |
@@ -138,9 +139,9 @@ Fully modular pipeline from document parsing, vectorization, and retrieval to LL
| UI | Web UI / RESTful API / CLI (`weknora`) / Chrome Extension / WeChat Mini Program |
| Access Control | Tenant RBAC with 4-tier role matrix (Owner / Admin / Contributor / Viewer), per-KB resource ownership, per-tenant audit log, invite-only workspaces, self-service tenant creation, cross-tenant superuser |
| Security | AES-256-GCM at-rest encryption for API keys and MCP / data-source credentials with graceful key rotation; gRPC TLS + Token between app and docreader; SSRF-safe HTTP client; sandbox isolation for agent skills |
| Observability | Integrated Langfuse for ReAct loops, token tracking, tool calls, and pipeline tracing |
| Observability | Integrated Langfuse for ReAct loops, token tracking, tool calls, and pipeline tracing; built-in Langfuse-style document parsing trace timeline with stage-by-stage progress |
| Task Management | MQ async tasks, automatic database migration on version upgrade |
| Model Management | Centralized config, per-knowledge-base model selection, multi-tenant built-in model sharing, WeKnora Cloud hosted models and parsing |
| Model Management | Centralized config, declarative built-in models via YAML, per-knowledge-base model selection, per-model thinking-mode config, multi-tenant built-in model sharing, WeKnora Cloud hosted models and parsing |
## 🧩 Chrome Extension
+5 -4
View File
@@ -28,7 +28,7 @@
<img src="https://img.shields.io/badge/License-MIT-ffffff?labelColor=d4eaf7&color=2e6cc4" alt="License">
</a>
<a href="./CHANGELOG.md">
<img alt="版本" src="https://img.shields.io/badge/version-0.6.0-2e6cc4?labelColor=d4eaf7">
<img alt="版本" src="https://img.shields.io/badge/version-0.6.1-2e6cc4?labelColor=d4eaf7">
</a>
</p>
@@ -56,6 +56,7 @@
## ✨ 最新更新
- **v0.6.1** —— 文档解析追踪时间线(Langfuse 风格 Span 树,逐阶段进度展示 + 解析中止);OpenSearch 向量库驱动;YAML 声明式内置模型配置;系统管理员与统一平台设置 + 审计日志;新用户引导;设置页 UI 重构;`weknora` CLI v0.7 / v0.8(Agent 优先线协议、NDJSON、`--dry-run`);OpenDataLoader 与 PaddleOCR-VL 解析引擎;MCP Server 多传输(stdio / SSE / HTTP);按模型的思考模式配置;腾讯云 LKEAP 重排 + 原生 Gemini Embedding + MiniMax-M3。详见 [`CHANGELOG.md`](./CHANGELOG.md)。
- **v0.6.0** —— 租户 RBAC(四级角色矩阵 `Owner` / `Admin` / `Contributor` / `Viewer` + 按 KB 归属 + 每租户审计日志)、租户成员管理与多工作区 UX、自助创建工作区;`weknora` CLI v0.4 正式版 + `mcp serve`;KB 检索跨向量库扇出;MCP / 数据源凭据 AES-256-GCM 加密 + docreader gRPC TLS + Token;新增智谱 Embedding 与华为云 OBS;服务端用户偏好;Go 1.26.0。详见 [`docs/RBAC说明.md`](./docs/RBAC说明.md) 与 [`CHANGELOG.md`](./CHANGELOG.md)。
- **v0.5.2** —— Wiki 入库支撑万级文档知识库(任务队列 + 死信队列);MCP 工具人机审批;Anthropic / Apache Doris / 腾讯云 VectorDB / 金山云 KS3 / SearXNG 后端;自适应三层分块 + 实时调试面板;全局 ⌘K 命令面板;语雀连接器 + 微信小程序;`weknora` CLI 早期版本。
- **v0.5.1** —— 知识库批量管理;租户级 IM 频道总览;会话搜索 + 用户级置顶;模型 / 网页搜索 / MCP 统一卡片化设置;按 Agent LLM 调用超时;桌面端租户切换。
@@ -123,7 +124,7 @@
| 能力 | 详情 |
|------|------|
| 模型厂商 | OpenAI / Azure OpenAI / Anthropic(Claude)/ DeepSeek / Qwen(阿里云)/ 智谱 / 混元 / 豆包(火山引擎)/ Gemini / MiniMax / NVIDIA / Novita AI / SiliconFlow / OpenRouter / Ollama |
| 向量数据库 | PostgreSQL (pgvector) / Elasticsearch / Milvus / Weaviate / Qdrant / Apache Doris / 腾讯云 VectorDB |
| 向量数据库 | PostgreSQL (pgvector) / Elasticsearch / OpenSearch / Milvus / Weaviate / Qdrant / Apache Doris / 腾讯云 VectorDB |
| Embedding | Ollama / BGE / GTE / 智谱 / OpenAI 兼容接口 |
| 对象存储 | 本地 / 腾讯云COS / 火山引擎 TOS / MinIO / AWS S3 / 阿里云 OSS / 金山云 KS3 / 华为云 OBS |
| IM 集成 | 企业微信 / 飞书 / Slack / Telegram / 钉钉 / Mattermost / 微信 |
@@ -138,9 +139,9 @@
| 界面 | Web UI / RESTful API / 命令行(`weknora`)/ Chrome Extension / 微信小程序 |
| 权限控制 | 租户 RBAC 四级角色矩阵(Owner / Admin / Contributor / Viewer),按知识库的资源归属,每租户审计日志,invite-only 准入,自助创建工作区,跨租户超级管理员 |
| 安全 | API Key 与 MCP / 数据源凭据 AES-256-GCM 静态加密、支持平滑密钥轮换;app ↔ docreader gRPC TLS + Token;防 SSRF HTTP 客户端;Agent 技能沙箱隔离 |
| 可观测性 | 集成 Langfuse 以追踪 ReAct 循环、Token 消耗、工具调用和任务流水线 |
| 可观测性 | 集成 Langfuse 以追踪 ReAct 循环、Token 消耗、工具调用和任务流水线;内置 Langfuse 风格的文档解析追踪时间线,逐阶段展示解析进度 |
| 任务管理 | MQ 异步任务,版本升级自动数据库迁移 |
| 模型管理 | 集中配置,知识库级别模型选择,多租户共享内置模型,WeKnora Cloud 托管模型与文档解析 |
| 模型管理 | 集中配置,YAML 声明式内置模型配置,知识库级别模型选择,按模型思考模式配置,多租户共享内置模型,WeKnora Cloud 托管模型与文档解析 |
## 🧩 Chrome 插件
+5 -4
View File
@@ -28,7 +28,7 @@
<img src="https://img.shields.io/badge/License-MIT-ffffff?labelColor=d4eaf7&color=2e6cc4" alt="License">
</a>
<a href="./CHANGELOG.md">
<img alt="バージョン" src="https://img.shields.io/badge/version-0.6.0-2e6cc4?labelColor=d4eaf7">
<img alt="バージョン" src="https://img.shields.io/badge/version-0.6.1-2e6cc4?labelColor=d4eaf7">
</a>
</p>
@@ -56,6 +56,7 @@ Feishu、Notion、Yuqueなどの外部プラットフォームからのナレッ
## ✨ 最新アップデート
- **v0.6.1** — ドキュメント解析トレースタイムライン(Langfuse 風の Span ツリー、ステージごとの進捗表示 + 解析中止);OpenSearch ベクター DB ドライバー;YAML 宣言型ビルトインモデル設定;システム管理者と統合プラットフォーム設定 + 監査ログ;新規ユーザーオンボーディングガイド;設定 UI 刷新;`weknora` CLI v0.7 / v0.8(Agent ファースト ワイヤープロトコル、NDJSON、`--dry-run`);OpenDataLoader と PaddleOCR-VL 解析エンジン;MCP サーバーのマルチトランスポート(stdio / SSE / HTTP);モデル単位の思考モード設定;Tencent LKEAP リランク + ネイティブ Gemini Embedding + MiniMax-M3。詳細は [`CHANGELOG.md`](./CHANGELOG.md) を参照。
- **v0.6.0** — テナント RBAC(4 階層ロールマトリクス `Owner` / `Admin` / `Contributor` / `Viewer` + KB 単位の所有 + テナントごとの監査ログ)、テナントメンバー管理とマルチワークスペース UX、セルフサービスでのワークスペース作成;`weknora` CLI v0.4 GA + `mcp serve`;KB 検索の複数ベクター DB ファンアウト;MCP / データソース資格情報の AES-256-GCM 暗号化 + docreader gRPC TLS + Token;Zhipu Embedder と華為雲 OBS の追加;サーバーサイドユーザー設定;Go 1.26.0。詳細は [`docs/RBAC说明.md`](./docs/RBAC说明.md) と [`CHANGELOG.md`](./CHANGELOG.md) を参照。
- **v0.5.2** — Wiki インジェストが万件規模 KB に対応(タスクキュー + DLQ);MCP 工具人機審批;Anthropic / Apache Doris / Tencent VectorDB / 金山雲 KS3 / SearXNG バックエンド;適応型 3 段階チャンキング + ライブプレビュー;グローバル ⌘K コマンドパレット;Yuque コネクタ + WeChat ミニプログラム;`weknora` CLI プレビュー版。
- **v0.5.1** — KB 一括管理;テナント全体の IM チャネル概観;セッション検索 + ユーザー単位ピン留め;モデル / Web 検索 / MCP 統一カード設定;Agent ごとの LLM タイムアウト;デスクトップ版テナント切替。
@@ -125,7 +126,7 @@ Feishu、Notion、Yuqueなどの外部プラットフォームからのナレッ
|------|------|
| 大規模モデル | OpenAI / Azure OpenAI / Anthropic (Claude) / DeepSeek / Qwen (Alibaba Cloud) / Zhipu / Hunyuan / Doubao (Volcengine) / Gemini / MiniMax / NVIDIA / Novita AI / SiliconFlow / OpenRouter / Ollama |
| Embedding | Ollama / BGE / GTE / OpenAI 互換 API |
| ベクトル DB | PostgreSQL (pgvector) / Elasticsearch / Milvus / Weaviate / Qdrant / Apache Doris / Tencent VectorDB |
| ベクトル DB | PostgreSQL (pgvector) / Elasticsearch / OpenSearch / Milvus / Weaviate / Qdrant / Apache Doris / Tencent VectorDB |
| オブジェクトストレージ | ローカル / MinIO / AWS S3 / 火山引擎 TOS / Alibaba Cloud OSS / 金山雲 KS3 |
| IM 統合 | WeChat Work / Feishu / Slack / Telegram / DingTalk / Mattermost / WeChat |
| Web 検索 | DuckDuckGo / Bing / Google / Tavily / Baidu / Ollama / SearXNG |
@@ -136,9 +137,9 @@ Feishu、Notion、Yuqueなどの外部プラットフォームからのナレッ
|------|------|
| デプロイ | ローカル / Docker / Kubernetes (Helm)、プライベート化・オフラインデプロイ対応 |
| UI | Web UI / RESTful API / CLI (`weknora`) / Chrome Extension / WeChat ミニプログラム |
| 可観測性 | ReActループ、トークン消費、ツール呼び出し、パイプライン追跡のためのLangfuse統合 |
| 可観測性 | ReActループ、トークン消費、ツール呼び出し、パイプライン追跡のためのLangfuse統合;Langfuse 風のドキュメント解析トレースタイムラインを内蔵し、ステージごとの進捗を表示 |
| タスク管理 | MQ 非同期タスク、バージョンアップ時の DB 自動マイグレーション |
| モデル管理 | 集中設定、ナレッジベース単位のモデル選択、マルチテナント組み込みモデル共有、WeKnora Cloud ホスティングモデルとドキュメント解析 |
| モデル管理 | 集中設定、YAML 宣言型ビルトインモデル設定、ナレッジベース単位のモデル選択、モデル単位の思考モード設定、マルチテナント組み込みモデル共有、WeKnora Cloud ホスティングモデルとドキュメント解析 |
## 🧩 Chrome 拡張機能
+5 -4
View File
@@ -28,7 +28,7 @@
<img src="https://img.shields.io/badge/License-MIT-ffffff?labelColor=d4eaf7&color=2e6cc4" alt="License">
</a>
<a href="./CHANGELOG.md">
<img alt="버전" src="https://img.shields.io/badge/version-0.6.0-2e6cc4?labelColor=d4eaf7">
<img alt="버전" src="https://img.shields.io/badge/version-0.6.1-2e6cc4?labelColor=d4eaf7">
</a>
</p>
@@ -56,6 +56,7 @@ Feishu, Notion, Yuque 등 외부 플랫폼에서 지식 자동 동기화를 지
## ✨ 최신 업데이트
- **v0.6.1** — 문서 파싱 추적 타임라인(Langfuse 스타일 Span 트리, 단계별 진행 표시 + 파싱 중단); OpenSearch 벡터 저장소 드라이버; YAML 선언형 내장 모델 구성; 시스템 관리자와 통합 플랫폼 설정 + 감사 로그; 신규 사용자 온보딩 가이드; 설정 UI 리디자인; `weknora` CLI v0.7 / v0.8(Agent 우선 와이어 프로토콜, NDJSON, `--dry-run`); OpenDataLoader 및 PaddleOCR-VL 파싱 엔진; MCP 서버 멀티 트랜스포트(stdio / SSE / HTTP); 모델별 사고 모드 설정; Tencent LKEAP 리랭크 + 네이티브 Gemini 임베딩 + MiniMax-M3. 자세한 내용은 [`CHANGELOG.md`](./CHANGELOG.md) 참고.
- **v0.6.0** — 테넌트 RBAC(4단계 역할 매트릭스 `Owner` / `Admin` / `Contributor` / `Viewer` + KB 단위 소유 + 테넌트별 감사 로그), 테넌트 멤버 관리와 멀티 워크스페이스 UX, 셀프 서비스 워크스페이스 생성; `weknora` CLI v0.4 GA + `mcp serve`; 여러 벡터 저장소에 걸친 KB 검색 팬아웃; MCP / 데이터 소스 자격 증명 AES-256-GCM 암호화 + docreader gRPC TLS + Token; Zhipu 임베더와 화웨이 클라우드 OBS 추가; 서버 사이드 사용자 환경설정; Go 1.26.0. 자세한 내용은 [`docs/RBAC说明.md`](./docs/RBAC说明.md)과 [`CHANGELOG.md`](./CHANGELOG.md) 참고.
- **v0.5.2** — Wiki 인제스트가 만 건 규모 KB 지원(작업 큐 + DLQ); MCP 휴먼인더루프 도구 승인; Anthropic / Apache Doris / Tencent VectorDB / Kingsoft Cloud KS3 / SearXNG 백엔드; 적응형 3단계 청킹 + 라이브 미리보기; 글로벌 ⌘K 명령 팔레트; Yuque 커넥터 + WeChat 미니프로그램; `weknora` CLI 프리뷰.
- **v0.5.1** — 지식베이스 일괄 관리; 테넌트 전체 IM 채널 개요; 세션 검색 + 사용자 단위 핀; 모델 / 웹 검색 / MCP 통일 카드 설정; Agent별 LLM 타임아웃; 데스크탑 테넌트 전환.
@@ -134,7 +135,7 @@ Feishu, Notion, Yuque 등 외부 플랫폼에서 지식 자동 동기화를 지
|------|------|
| LLM | OpenAI / Azure OpenAI / Anthropic (Claude) / DeepSeek / Qwen (Alibaba Cloud) / Zhipu / Hunyuan / Doubao (Volcengine) / Gemini / MiniMax / NVIDIA / Novita AI / SiliconFlow / OpenRouter / Ollama |
| Embedding | Ollama / BGE / GTE / OpenAI 호환 API |
| 벡터 DB | PostgreSQL (pgvector) / Elasticsearch / Milvus / Weaviate / Qdrant / Apache Doris / Tencent VectorDB |
| 벡터 DB | PostgreSQL (pgvector) / Elasticsearch / OpenSearch / Milvus / Weaviate / Qdrant / Apache Doris / Tencent VectorDB |
| 오브젝트 스토리지 | 로컬 / MinIO / AWS S3 / Volcengine TOS / Alibaba Cloud OSS / Kingsoft Cloud KS3 |
| IM 통합 | WeChat Work / Feishu / Slack / Telegram / DingTalk / Mattermost / WeChat |
| 웹 검색 | DuckDuckGo / Bing / Google / Tavily / Baidu / Ollama / SearXNG |
@@ -145,9 +146,9 @@ Feishu, Notion, Yuque 등 외부 플랫폼에서 지식 자동 동기화를 지
|------|------|
| 배포 | 로컬 / Docker / Kubernetes (Helm), 프라이빗/오프라인 배포 지원 |
| UI | Web UI / RESTful API / CLI (`weknora`) / Chrome Extension / WeChat 미니 프로그램 |
| 관측 가능성 | ReAct 루프, 토큰 소비, 도구 호출, 파이프라인 추적을 위한 Langfuse 통합 |
| 관측 가능성 | ReAct 루프, 토큰 소비, 도구 호출, 파이프라인 추적을 위한 Langfuse 통합; Langfuse 스타일의 문서 파싱 추적 타임라인 내장으로 단계별 진행 표시 |
| 작업 관리 | MQ 비동기 작업, 버전 업그레이드 시 자동 DB 마이그레이션 |
| 모델 관리 | 중앙 설정, 지식베이스별 모델 선택, 멀티테넌트 내장 모델 공유, WeKnora Cloud 호스팅 모델 및 문서 파싱 |
| 모델 관리 | 중앙 설정, YAML 선언형 내장 모델 구성, 지식베이스별 모델 선택, 모델별 사고 모드 설정, 멀티테넌트 내장 모델 공유, WeKnora Cloud 호스팅 모델 및 문서 파싱 |
## 🧩 Chrome 확장 프로그램
+1 -1
View File
@@ -1 +1 @@
0.6.0
0.6.1
+16
View File
@@ -353,6 +353,22 @@ if err != nil {
fmt.Printf("Parse Status: %s\n", knowledge.ParseStatus) // "cancelled"
```
### 示例:查看文档解析追踪(Span 树)
```go
// 获取文档解析流水线的 Span 树(root → stage → subspan)
// - attempt 传 0 表示获取最新一次解析尝试
// - 始终返回 5 个标准阶段:docreader / chunking / embedding / multimodal / postprocess
trace, err := apiClient.GetKnowledgeProcessingSpans(context.Background(), knowledgeID, 0)
if err != nil {
// 处理错误
}
fmt.Printf("ParseStatus=%s CurrentStage=%s\n", trace.ParseStatus, trace.CurrentStage)
for _, stage := range trace.Trace.Children {
fmt.Printf("- %s: %s (%dms)\n", stage.Name, stage.Status, stage.DurationMs)
}
```
### 示例:获取会话消息
```go
+97
View File
@@ -539,6 +539,103 @@ func (c *Client) CancelKnowledgeParse(ctx context.Context, knowledgeID string) (
return &response.Data, nil
}
// KnowledgeSpanNode mirrors one node of the server's document-parsing trace
// tree (root → stage → subspan). Children carries nested subspans such as
// per-image multimodal calls or LLM generations under a stage.
type KnowledgeSpanNode struct {
KnowledgeID string `json:"knowledge_id"`
Attempt int `json:"attempt"`
SpanID string `json:"span_id"`
ParentSpanID string `json:"parent_span_id,omitempty"`
Name string `json:"name"`
Kind string `json:"kind"` // root / stage / subspan / generation
Status string `json:"status"` // pending / running / done / failed / skipped / cancelled
Input map[string]interface{} `json:"input,omitempty"`
Output map[string]interface{} `json:"output,omitempty"`
Metadata map[string]interface{} `json:"metadata,omitempty"`
ErrorCode string `json:"error_code,omitempty"`
ErrorMessage string `json:"error_message,omitempty"`
StartedAt *time.Time `json:"started_at,omitempty"`
FinishedAt *time.Time `json:"finished_at,omitempty"`
DurationMs int64 `json:"duration_ms,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Children []*KnowledgeSpanNode `json:"children,omitempty"`
}
// KnowledgeSpanError describes the most recent failed span in a trace.
type KnowledgeSpanError struct {
Stage string `json:"stage"`
Code string `json:"code"`
Message string `json:"message"`
FinishedAt *time.Time `json:"finished_at,omitempty"`
}
// KnowledgeProcessingTrace is the document-parsing trace for one parse
// attempt: a five-segment stage timeline (docreader, chunking, embedding,
// multimodal, postprocess) plus any subspans, with the current stage and
// last error surfaced for convenience.
type KnowledgeProcessingTrace struct {
KnowledgeID string `json:"knowledge_id"`
ParseStatus string `json:"parse_status"`
CurrentAttempt int `json:"current_attempt"`
CurrentStage string `json:"current_stage"`
Trace *KnowledgeSpanNode `json:"trace"`
LastError *KnowledgeSpanError `json:"last_error,omitempty"`
}
type knowledgeProcessingTraceResponse struct {
Success bool `json:"success"`
Data KnowledgeProcessingTrace `json:"data"`
}
// GetKnowledgeProcessingSpans fetches the document-parsing trace tree for a
// knowledge entry. The response always contains the five canonical stages;
// stages that have not produced rows yet are synthesized as "pending"
// placeholders so the timeline is stable to render.
//
// Parameters:
// - ctx: Context for the request
// - knowledgeID: The ID of the knowledge entry
// - attempt: A specific parse attempt number; pass 0 for the latest attempt
//
// Returns:
// - *KnowledgeProcessingTrace: The trace for the selected attempt
// - error: Error information if the request fails
//
// Example:
//
// trace, err := client.GetKnowledgeProcessingSpans(ctx, "knowledge-id-123", 0)
// if err != nil {
// log.Fatalf("Failed to get parsing trace: %v", err)
// }
// fmt.Printf("parse_status=%s current_stage=%s\n", trace.ParseStatus, trace.CurrentStage)
func (c *Client) GetKnowledgeProcessingSpans(
ctx context.Context, knowledgeID string, attempt int,
) (*KnowledgeProcessingTrace, error) {
if knowledgeID == "" {
return nil, fmt.Errorf("knowledge ID cannot be empty")
}
queryParams := url.Values{}
if attempt > 0 {
queryParams.Add("attempt", strconv.Itoa(attempt))
}
path := fmt.Sprintf("/api/v1/knowledge/%s/spans", knowledgeID)
resp, err := c.doRequest(ctx, http.MethodGet, path, nil, queryParams)
if err != nil {
return nil, err
}
var response knowledgeProcessingTraceResponse
if err := parseResponse(resp, &response); err != nil {
return nil, err
}
return &response.Data, nil
}
// UpdateChunk updates a chunk's information
// Updates information for a specific chunk under a knowledge document
// Parameters:
+27
View File
@@ -233,5 +233,32 @@ Wiki 模式允许 Agent 根据原始文档自动生成并维护一套结构化
如果你希望开启「invite-only」(不允许自助注册到本租户),可在租户设置里打开邀请制,并通过「邀请」入口签发邀请码或链接。
## 14. 文档解析卡在「处理中」/ 解析追踪时间线打不开怎么办?
0.6.1 起每个文档解析都会记录一棵 Langfuse 风格的 Span 树(`knowledge_processing_spans` 表),可在知识库卡片菜单或卡片上的「Trace」入口打开侧边时间线,逐阶段查看进度。常见情况:
- **文档长时间停在「处理中」**:先打开时间线看是哪个阶段没有推进(解析 / 切分 / 向量化 / 后处理)。0.6.1 已修复多数「卡死」场景,并加入看门狗轮询;如确认是某次解析挂死,可在时间线面板点击「中止解析」,文档会进入 finalizing 后处理状态后结束。
- **时间线一直显示「更新中」但无数据**:通常是轮询请求静默失败(网络 / 反向代理截断 SSE)。0.6.1 会显式暴露轮询失败,刷新页面或检查 Nginx 是否缓冲了响应即可。
- **升级后没有时间线数据**:确认数据库迁移 `000055_knowledge_processing_spans`、`000056_knowledge_pending_subtasks` 已执行(服务启动会自动迁移)。
## 15. 如何启用 OpenSearch 作为向量库?
0.6.1 新增了 OpenSearch 向量库驱动(k-NN)。在 **设置 → 向量库** 中新增 OpenSearch 引擎并填写连接地址、凭据即可;KB 可绑定该向量库。注意:
- 连接地址会经过 SSRF 策略校验,内网 / 回环地址需符合放行规则;可用「测试连接」先行校验。
- 集成测试与索引映射细节见 [`docs/dev/opensearch-integration-test.md`](./dev/opensearch-integration-test.md)。
## 16. 内置模型(builtin models)如何用 YAML 声明式管理?
0.6.1 起平台内置模型由 `config/builtin_models.yaml` 声明式驱动,支持 `${ENV}` 变量插值,并通过 `managed_by` 字段与漂移巡检保持数据库与 YAML 一致。常见问题:
- **改了 YAML 不生效**:内置模型在服务启动时做生命周期对账(drift sweep);确认重启了服务,且条目通过了 schema 校验(ID 长度、必填字段)。
- **Docker 下环境变量未注入**:`builtin_models` 依赖 `env_file` 数组形式注入变量,确认 compose 中按数组形式挂载了 `.env`。
- 参考样例:`config/builtin_models.yaml.example`。
## 17. 系统管理员(System Admin)与平台设置怎么用?
0.6.1 引入了系统管理员与统一平台设置面板(含平台审计日志),与租户内 RBAC 区分:系统管理员管理的是「平台级」配置,而非单个租户内的资源。首次启用需通过系统管理员 bootstrap 流程晋升首个管理员;撤销管理员权限有安全防护(避免误撤导致无人可管)。相关迁移为 `000053_system_admin_and_settings`。
## P.S.
如果以上方式未解决问题,请在issue中描述您的问题,并提供必要的日志信息辅助我们进行问题排查
+977 -5
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

+977 -5
View File
File diff suppressed because it is too large Load Diff
+745 -1
View File
@@ -259,6 +259,15 @@ definitions:
- rbac.invitation_declined
- rbac.invitation_revoked
- rbac.invitation_expired
- vector_store.created
- vector_store.updated
- vector_store.deleted
- opensearch.index_created
- opensearch.index_deleted
- opensearch.reindex_executed
- system.setting_changed
- system.admin_promoted
- system.admin_revoked
type: string
x-enum-varnames:
- AuditActionMemberAdded
@@ -271,6 +280,15 @@ definitions:
- AuditActionInvitationDeclined
- AuditActionInvitationRevoked
- AuditActionInvitationExpired
- AuditActionVectorStoreCreated
- AuditActionVectorStoreUpdated
- AuditActionVectorStoreDeleted
- AuditActionOpenSearchIndexCreated
- AuditActionOpenSearchIndexDeleted
- AuditActionOpenSearchReindexExecuted
- AuditActionSystemSettingChanged
- AuditActionSystemAdminPromoted
- AuditActionSystemAdminRevoked
github_com_Tencent_WeKnora_internal_types.AuditLog:
properties:
action:
@@ -410,7 +428,9 @@ definitions:
description: AES-GCM encrypted
type: string
database:
description: Tencent VectorDB and Doris database name.
description: |-
Database name used by engines that support database-level namespaces
(currently Milvus, Tencent VectorDB, and Doris).
type: string
grpc_address:
description: Weaviate
@@ -424,6 +444,18 @@ definitions:
Addr is reused for the MySQL protocol "host:9030"; HTTPPort + the host of Addr
together form the FE HTTP endpoint used by Stream Load.
type: integer
insecure_skip_verify:
description: |-
InsecureSkipVerify disables TLS certificate verification when
talking to the backing store over HTTPS. Defaults to false
(secure). Set to true ONLY for self-signed development clusters;
production deployments should provide trusted certificates via
the system CA pool. Cross-driver applicable but currently only
the OpenSearch driver (Phase 3) reads this field. Note: this
differs from the Qdrant-specific UseTLS below, which *enables*
TLS on gRPC connections — InsecureSkipVerify only controls
*verification* of an already-TLS connection.
type: boolean
password:
description: AES-GCM encrypted
type: string
@@ -589,6 +621,14 @@ definitions:
===== Image Upload / Multimodal Settings =====
Whether image upload is enabled for this agent (default: false)
type: boolean
intent_prompts:
additionalProperties:
type: string
description: |-
IntentPrompts holds per-intent system prompt overrides for non-retrieval
intents (greeting, chitchat, etc.). Empty values fall back to templates
under config/prompt_templates/intent_prompts.yaml.
type: object
kb_selection_mode:
description: |-
===== Knowledge Base Settings =====
@@ -1007,9 +1047,25 @@ definitions:
desired_shard_count:
description: 'Weaviate: number of shards per collection'
type: integer
hnsw_ef_construction:
description: 'OpenSearch: HNSW index-build candidate list size'
type: integer
hnsw_ef_search:
description: 'OpenSearch: HNSW search candidate list size (faiss; lucene reads
at query time)'
type: integer
hnsw_m:
description: |-
--- OpenSearch k-NN HNSW fields ---
All omitempty so other engines' serialized IndexConfig is unchanged.
Zero / empty values fall back to the driver defaults in buildInternalCfg.
type: integer
index_name:
description: '--- Existing fields ---'
type: string
knn_engine:
description: 'OpenSearch: k-NN backend ("lucene" | "faiss")'
type: string
number_of_replicas:
description: ES, OpenSearch
type: integer
@@ -1184,6 +1240,12 @@ definitions:
parse_status:
description: Parse status of the knowledge
type: string
pending_subtasks_count:
description: |-
PendingSubtasksCount is the outstanding enrichment subtask count
(summary + question + graph chunks). Only meaningful while
ParseStatus == "finalizing"; defaults to 0 in any terminal state.
type: integer
processed_at:
description: Processed time of the knowledge
type: string
@@ -2160,6 +2222,38 @@ definitions:
mineru_vlm_server_url:
description: vLLM 服务器地址 (vlm-http-client / hybrid-http-client)
type: string
odl_hybrid:
description: OpenDataLoader PDF (docreader engine); hybrid requires opendataloader-pdf-hybrid
service.
type: string
odl_hybrid_fallback:
type: boolean
odl_hybrid_mode:
description: auto, full
type: string
odl_hybrid_url:
description: e.g. http://odl-hybrid:5002
type: string
odl_markdown_with_html:
type: boolean
paddleocr_vl_cloud_model:
description: e.g. PaddleOCR-VL-1.6
type: string
paddleocr_vl_cloud_token:
description: PaddleOCR-VL AI Studio cloud API.
type: string
paddleocr_vl_cloud_use_chart_recognition:
type: boolean
paddleocr_vl_cloud_use_seal_recognition:
type: boolean
paddleocr_vl_endpoint:
description: PaddleOCR-VL self-hosted pipeline service (full /layout-parsing
API).
type: string
paddleocr_vl_use_chart_recognition:
type: boolean
paddleocr_vl_use_seal_recognition:
type: boolean
type: object
github_com_Tencent_WeKnora_internal_types.ParserEngineRule:
properties:
@@ -2332,6 +2426,7 @@ definitions:
- doris
- sqlite
- tencent_vectordb
- opensearch
type: string
x-enum-varnames:
- PostgresRetrieverEngineType
@@ -2344,6 +2439,7 @@ definitions:
- DorisRetrieverEngineType
- SQLiteRetrieverEngineType
- TencentVectorDBRetrieverEngineType
- OpenSearchRetrieverEngineType
github_com_Tencent_WeKnora_internal_types.RetrieverEngines:
properties:
engines:
@@ -2731,6 +2827,66 @@ definitions:
description: Last update timestamp
type: string
type: object
github_com_Tencent_WeKnora_internal_types.SystemSetting:
properties:
category:
description: |-
Category groups settings in the management UI ("limits", "agent",
"auth", ...). Free-form string so adding a new category is a
data-only change.
type: string
created_at:
type: string
description:
type: string
enum:
description: |-
Enum is populated by the service layer (NOT persisted) from the
in-code registry. Empty/nil means "free-form input"; non-empty
means the UI should render a select with these options. Tagged
`gorm:"-"` so GORM never tries to read/write the column.
items:
type: string
type: array
id:
type: integer
is_secret:
description: |-
IsSecret reserves UI affordances for P3 (mask + reveal-with-confirm).
In P1 every row is is_secret=false; service Update accepts the
column but does not yet enforce special handling.
type: boolean
key:
type: string
last_modified_by:
type: string
last_modified_by_name:
description: |-
LastModifiedByName is a display label resolved from LastModifiedBy
(the user's UUID) at handler time — username when available,
otherwise email. Empty for virtual rows that were never persisted
(LastModifiedBy=""). Not stored: derived per request so renaming
a user reflects on the next reload without a backfill job.
type: string
requires_restart:
description: |-
RequiresRestart reserves UI affordances for P3 (banner "this
change won't take effect until the next restart"). In P1 the
only seeded key is per-request, so always false.
type: boolean
updated_at:
type: string
value:
items:
type: integer
type: array
value_type:
description: |-
ValueType is one of "int", "string", "bool". Service layer rejects
updates whose payload type does not match; UI uses it to pick
InputNumber vs Input vs Switch.
type: string
type: object
github_com_Tencent_WeKnora_internal_types.TOSEngineConfig:
properties:
access_key:
@@ -2941,6 +3097,10 @@ definitions:
is_active:
description: Whether the user is active
type: boolean
is_system_admin:
description: Whether the user is a system administrator (independent of tenant
roles)
type: boolean
preferences:
allOf:
- $ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.UserPreferences'
@@ -2962,6 +3122,31 @@ definitions:
description: Username of the user
type: string
type: object
github_com_Tencent_WeKnora_internal_types.UserInfo:
properties:
avatar:
type: string
can_access_all_tenants:
type: boolean
created_at:
type: string
email:
type: string
id:
type: string
is_active:
type: boolean
is_system_admin:
type: boolean
preferences:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.UserPreferences'
tenant_id:
type: integer
updated_at:
type: string
username:
type: string
type: object
github_com_Tencent_WeKnora_internal_types.UserPreferences:
properties:
enable_memory:
@@ -3548,6 +3733,8 @@ definitions:
properties:
description:
type: string
display_name:
type: string
name:
type: string
parameters:
@@ -3649,6 +3836,12 @@ definitions:
type: string
minio_enabled:
type: boolean
started_at:
description: StartedAt is the server process boot time (RFC3339, UTC).
type: string
uptime_seconds:
description: UptimeSeconds is seconds elapsed since process start.
type: integer
vector_store_engine:
type: string
version:
@@ -3889,10 +4082,22 @@ definitions:
required:
- llmModelId
type: object
internal_handler.ListSystemAdminsResponse:
properties:
admins:
items:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.UserInfo'
type: array
total:
type: integer
type: object
internal_handler.ModelTestRequest:
properties:
apiKey:
type: string
appSecret:
description: AppSecret 用于 LKEAP Rerank 等需要第二段密钥的场景(对应模型 Parameters.AppSecret)。
type: string
baseUrl:
type: string
customHeaders:
@@ -4045,10 +4250,20 @@ definitions:
response was truncated to previewMaxChunks for transport.
type: integer
type: object
internal_handler.PromoteUserToSystemAdminRequest:
properties:
email:
type: string
user_id:
type: string
type: object
internal_handler.RemoteModelCheckRequest:
properties:
apiKey:
type: string
appSecret:
description: AppSecret 用于 LKEAP Rerank 等需要第二段密钥的场景(对应模型 Parameters.AppSecret)。
type: string
baseUrl:
type: string
customHeaders:
@@ -4084,6 +4299,13 @@ definitions:
required:
- modelName
type: object
internal_handler.RevokeSystemAdminRequest:
properties:
user_id:
type: string
required:
- user_id
type: object
internal_handler.SearchMessagesRequest:
properties:
limit:
@@ -4225,6 +4447,8 @@ definitions:
properties:
description:
type: string
display_name:
type: string
name:
type: string
parameters:
@@ -4252,6 +4476,14 @@ definitions:
required:
- name
type: object
internal_handler.UpdateSystemSettingRequest:
properties:
value:
description: |-
Value is intentionally `any` (decoded as float64 / string / bool /
etc. by the JSON unmarshaller). Service.encodeForType normalises
these against the registry's declared type and rejects mismatches.
type: object
internal_handler.addMemberRequest:
properties:
email:
@@ -4295,6 +4527,15 @@ definitions:
- email
- role
type: object
internal_handler.createInviteLinkRequest:
properties:
message:
type: string
role:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.TenantRole'
required:
- role
type: object
internal_handler.createTenantRequest:
properties:
description:
@@ -4307,6 +4548,41 @@ definitions:
required:
- name
type: object
internal_handler.invitationLookupRequest:
properties:
token:
type: string
required:
- token
type: object
internal_handler.invitationLookupResponse:
properties:
expires_at:
type: string
role:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.TenantRole'
tenant_id:
type: integer
tenant_name:
type: string
type: object
internal_handler.registerByInviteRequest:
properties:
email:
type: string
password:
minLength: 6
type: string
token:
type: string
username:
type: string
required:
- email
- password
- token
- username
type: object
internal_handler.updateLastFAQImportResultDisplayStatusRequest:
properties:
display_status:
@@ -4854,6 +5130,33 @@ paths:
summary: 获取智能体类型预设列表
tags:
- 智能体
/api/v1/knowledge/{id}/spans:
get:
consumes:
- application/json
description: 返回该知识在解析流水线的 trace tree(root → stage → subspan):每段状态、耗时、input/output、错误码、langfuse_trace_id。支持
?attempt=N 查看历史尝试;不传则返回最新尝试。前端用于渲染时间线 + 多模态/embedding 子节点 + 一键跳转 Langfuse。
parameters:
- description: 知识ID
in: path
name: id
required: true
type: string
- description: 指定尝试号;省略=最新
in: query
name: attempt
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties: true
type: object
summary: 获取知识文档解析的 Span 树(含历史尝试)
tags:
- 知识管理
/auth/auto-setup:
post:
consumes:
@@ -4923,6 +5226,35 @@ paths:
summary: 获取认证配置
tags:
- 认证
/auth/invitations/lookup:
post:
consumes:
- application/json
description: |-
根据邀请链接中的 token 返回邀请上下文(租户名 / 角色 / 过期时间),
供注册页展示。无认证;token 无效或被撤销返回 410。
使用 POST + body 而非 GET + path,避免 token 落入访问日志 / 浏览器历史 / tracing。
parameters:
- description: 邀请 token
in: body
name: request
required: true
schema:
$ref: '#/definitions/internal_handler.invitationLookupRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/internal_handler.invitationLookupResponse'
"410":
description: 链接无效或已撤销
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError'
summary: 解析共享邀请链接 token
tags:
- 认证
/auth/login:
post:
consumes:
@@ -5158,6 +5490,42 @@ paths:
summary: 用户注册
tags:
- 认证
/auth/register-by-invite:
post:
consumes:
- application/json
description: |-
通过 Owner 生成的共享邀请链接 token 完成注册,绕过 invite_only 模式拦截。
注册者自填邮箱(与 token 不绑定);注册成功后自动加入对应租户。
parameters:
- description: 邀请注册请求
in: body
name: request
required: true
schema:
$ref: '#/definitions/internal_handler.registerByInviteRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.LoginResponse'
"400":
description: 请求参数错误
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError'
"409":
description: 邮箱已注册
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError'
"410":
description: 链接无效或已撤销
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError'
summary: 使用共享链接注册
tags:
- 认证
/auth/switch-tenant:
post:
consumes:
@@ -7994,6 +8362,44 @@ paths:
summary: 更新知识
tags:
- 知识管理
/knowledge/{id}/cancel-parse:
post:
consumes:
- application/json
description: 取消进行中的知识解析任务。当前已写入的 chunk / 索引保留,可通过 reparse 接口重新触发解析。已完成 / 已失败
/ 删除中的知识不支持取消。
parameters:
- description: 知识ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: 取消已提交
schema:
additionalProperties: true
type: object
"400":
description: 状态不支持取消
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError'
"403":
description: 权限不足
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError'
"404":
description: 知识不存在
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError'
security:
- Bearer: []
- ApiKeyAuth: []
summary: 取消知识解析
tags:
- 知识管理
/knowledge/{id}/download:
get:
consumes:
@@ -10803,6 +11209,312 @@ paths:
summary: 获取预装Skills列表
tags:
- Skills
/system/admin/audit-log:
get:
description: 返回 system-scope(tenant_id=0)的审计事件,覆盖 system.setting_changed / system.admin_promoted
/ system.admin_revoked 等 SystemAdmin 操作。按 id 倒序的游标分页。
parameters:
- description: 游标:返回 id 小于此值的记录(默认从最新开始)
in: query
name: after_id
type: integer
- description: 页大小,1-100,默认 50
in: query
name: limit
type: integer
- description: 按 action 精确过滤(如 system.setting_changed)
in: query
name: action
type: string
- description: 按 outcome 精确过滤(success / denied)
in: query
name: outcome
type: string
- description: 按 actor_user_id 精确过滤
in: query
name: actor
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/internal_handler.auditLogListResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError'
security:
- Bearer: []
- ApiKeyAuth: []
summary: 获取平台审计日志
tags:
- 审计日志
/system/admin/list:
get:
description: |-
Retrieve a paginated list of users with system administrator
privileges (SystemAdmin only). Supports `offset` (default 0)
and `limit` (default 50, max 200) query parameters. Walks the
partial-friendly idx_users_is_system_admin index.
parameters:
- default: 0
description: Page offset
in: query
name: offset
type: integer
- default: 50
description: Page size (max 200)
in: query
name: limit
type: integer
produces:
- application/json
responses:
"200":
description: System admins retrieved successfully
schema:
$ref: '#/definitions/internal_handler.ListSystemAdminsResponse'
"403":
description: 'Forbidden: not a system admin'
schema:
additionalProperties: true
type: object
summary: List all system administrators
tags:
- System Admin
/system/admin/promote:
post:
consumes:
- application/json
description: |-
Grant system administrator privileges to a user (SystemAdmin only).
Idempotent: re-promoting an existing system admin returns 200 with no DB write.
Identify the user by email (preferred for human operators) or user_id (UUID, for API clients).
parameters:
- description: User promotion request
in: body
name: request
required: true
schema:
$ref: '#/definitions/internal_handler.PromoteUserToSystemAdminRequest'
produces:
- application/json
responses:
"200":
description: User promoted successfully
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.UserInfo'
"400":
description: Bad request
schema:
additionalProperties: true
type: object
"403":
description: 'Forbidden: not a system admin'
schema:
additionalProperties: true
type: object
"404":
description: User not found
schema:
additionalProperties: true
type: object
summary: Promote a user to system administrator
tags:
- System Admin
/system/admin/revoke:
post:
consumes:
- application/json
description: |-
Remove system administrator privileges from a user (SystemAdmin only).
Two safety guards: the caller cannot revoke their own privileges,
and revoking the last remaining system admin is rejected — both
prevent a SystemAdmin from accidentally locking the platform out
of system-level administration. Idempotent on already-non-admin users.
parameters:
- description: User revocation request
in: body
name: request
required: true
schema:
$ref: '#/definitions/internal_handler.RevokeSystemAdminRequest'
produces:
- application/json
responses:
"200":
description: Privileges revoked successfully
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.UserInfo'
"400":
description: Bad request / would remove last admin / self-revoke
schema:
additionalProperties: true
type: object
"403":
description: 'Forbidden: not a system admin'
schema:
additionalProperties: true
type: object
"404":
description: User not found
schema:
additionalProperties: true
type: object
summary: Revoke system administrator privileges from a user
tags:
- System Admin
/system/admin/settings:
get:
description: |-
Return every row in the system_settings table (system-scope,
not tenant-scope). SystemAdmin only.
produces:
- application/json
responses:
"200":
description: list of settings
schema:
items:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.SystemSetting'
type: array
"403":
description: 'Forbidden: not a system admin'
schema:
additionalProperties: true
type: object
summary: List all system settings
tags:
- System Admin
/system/admin/settings/{key}:
delete:
description: |-
Removes the DB override for :key so the 3-tier resolver
falls back to the environment variable (when configured)
or the in-code default. Idempotent — resetting a key
that was never persisted returns 200.
parameters:
- description: Setting key
in: path
name: key
required: true
type: string
responses:
"200":
description: Reset acknowledged
schema:
additionalProperties: true
type: object
"400":
description: Unknown key
schema:
additionalProperties: true
type: object
"500":
description: DB write failed
schema:
additionalProperties: true
type: object
summary: Reset a system setting to ENV / built-in default
tags:
- System Admin
get:
description: |-
Returns the row matching :key. 404 when the key is unknown
to the registry; 200 with the row when known.
parameters:
- description: Setting key (e.g. file.max_size_mb)
in: path
name: key
required: true
type: string
produces:
- application/json
responses:
"200":
description: the setting row
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.SystemSetting'
"400":
description: Unknown key
schema:
additionalProperties: true
type: object
"404":
description: Key registered but DB row absent
schema:
additionalProperties: true
type: object
summary: Get a single system setting by key
tags:
- System Admin
put:
consumes:
- application/json
description: |-
Persist a new value for :key. Service validates the
rawValue against the registry's declared value_type and
rejects mismatches with 400. SystemAdmin only. Emits an
audit row (action=system.setting_changed) on success.
parameters:
- description: Setting key
in: path
name: key
required: true
type: string
- description: New value
in: body
name: request
required: true
schema:
$ref: '#/definitions/internal_handler.UpdateSystemSettingRequest'
produces:
- application/json
responses:
"200":
description: the updated row
schema:
$ref: '#/definitions/github_com_Tencent_WeKnora_internal_types.SystemSetting'
"400":
description: Bad request / unknown key / type mismatch
schema:
additionalProperties: true
type: object
"403":
description: 'Forbidden: not a system admin'
schema:
additionalProperties: true
type: object
summary: Update a system setting value
tags:
- System Admin
/system/admin/tenants/apply-default-storage-quota:
post:
description: |-
Reads the current value of `tenant.default_storage_quota_gb`
(3-tier resolver: DB > ENV > default) and writes that many
GiB into storage_quota for every row in tenants. Bypasses
the per-tenant PUT whitelist, which forbids storage_quota
edits by Owners. SystemAdmin only.
Idempotent — running twice with the same setting is a no-op.
produces:
- application/json
responses:
"200":
description: '{ affected: int64, quota_bytes: int64 }'
schema:
additionalProperties: true
type: object
"500":
description: DB write failed
schema:
additionalProperties: true
type: object
summary: Apply the default storage quota to every existing tenant
tags:
- System Admin
/system/docreader/reconnect:
post:
consumes:
@@ -11220,6 +11932,38 @@ paths:
summary: 撤销待接受邀请
tags:
- 租户邀请
/tenants/{id}/invite-links:
post:
consumes:
- application/json
description: |-
生成一条多次使用的共享邀请链接:谁拿到链接谁就能注册并加入当前租户。
链接持续有效,直到过期或被撤销。
parameters:
- description: 租户 ID
in: path
name: id
required: true
type: string
- description: 共享链接配置
in: body
name: request
required: true
schema:
$ref: '#/definitions/internal_handler.createInviteLinkRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
additionalProperties: true
type: object
security:
- Bearer: []
summary: 生成共享邀请链接
tags:
- 租户邀请
/tenants/{id}/leave:
post:
description: 调用方主动退出当前租户。等价于以自己的 user_id 调 RemoveMember,
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "knowledage-base",
"version": "0.6.0",
"version": "0.6.1",
"private": true,
"type": "module",
"scripts": {
+1 -1
View File
@@ -5,7 +5,7 @@ description: |
with document parsing, vector search, and LLM integration.
type: application
version: 0.1.0
appVersion: "v0.6.0"
appVersion: "v0.6.1"
kubeVersion: ">=1.25.0-0"
home: https://github.com/Tencent/WeKnora
icon: https://raw.githubusercontent.com/Tencent/WeKnora/main/docs/images/logo.png
+4 -4
View File
@@ -56,7 +56,7 @@ type invitationLookupRequest struct {
// @Produce json
// @Param request body invitationLookupRequest true "邀请 token"
// @Success 200 {object} invitationLookupResponse
// @Failure 410 {object} errors.AppError "链接无效或已撤销"
// @Failure 410 {object} apperrors.AppError "链接无效或已撤销"
// @Router /auth/invitations/lookup [post]
func (h *AuthHandler) LookupInvitationByToken(c *gin.Context) {
ctx := c.Request.Context()
@@ -112,9 +112,9 @@ func (h *AuthHandler) LookupInvitationByToken(c *gin.Context) {
// @Produce json
// @Param request body registerByInviteRequest true "邀请注册请求"
// @Success 201 {object} types.LoginResponse
// @Failure 400 {object} errors.AppError "请求参数错误"
// @Failure 409 {object} errors.AppError "邮箱已注册"
// @Failure 410 {object} errors.AppError "链接无效或已撤销"
// @Failure 400 {object} apperrors.AppError "请求参数错误"
// @Failure 409 {object} apperrors.AppError "邮箱已注册"
// @Failure 410 {object} apperrors.AppError "链接无效或已撤销"
// @Router /auth/register-by-invite [post]
//
// RegisterByInvite is intentionally NOT subject to the invite_only gate: