From b587844d0660f17a425dfb2947c6e25dd0f7a359 Mon Sep 17 00:00:00 2001
From: wizardchen
Date: Mon, 27 Apr 2026 12:13:53 +0800
Subject: [PATCH] chore(release): v0.5.0
Bump version to v0.5.0 across VERSION, frontend/package.json,
frontend/package-lock.json and helm/Chart.yaml.
Highlights:
- Wiki Mode: agent-driven Wiki knowledge system that distills raw
documents into interlinked markdown pages, with a dedicated
WikiBrowser and an interactive knowledge graph visualizing page
references and relationships.
- Observability: Langfuse tracing across the agent ReAct loop, LLM
token usage, tool calls and the asynq async pipeline.
- Customizable indexing strategy: per-knowledge-base toggles for
vector / keyword / Wiki / knowledge-graph indexing.
- Vector Store UI & per-KB binding.
- Yuque connector with full / incremental sync.
- Agent enhancements: json_repair tool, OpenMAIC Classroom skill,
multi-sheet DuckDB Excel analysis.
- Docs: refreshed READMEs (EN/CN/JA/KO), CHANGELOG, QA, regenerated
Swagger and updated architecture diagram with new Wiki/Langfuse
components.
---
CHANGELOG.md | 27 +
README.md | 32 +-
README_CN.md | 30 +-
README_JA.md | 32 +-
README_KO.md | 32 +-
VERSION | 2 +-
docs/QA.md | 24 +
docs/docs.go | 3585 ++++++++++++++++++++++------------
docs/images/architecture.png | Bin 927169 -> 1110377 bytes
docs/images/wiki-browser.png | Bin 0 -> 981546 bytes
docs/images/wiki-graph.png | Bin 0 -> 560935 bytes
docs/swagger.json | 3585 ++++++++++++++++++++++------------
docs/swagger.yaml | 2713 ++++++++++++++++---------
frontend/package-lock.json | 4 +-
frontend/package.json | 2 +-
helm/Chart.yaml | 2 +-
16 files changed, 6703 insertions(+), 3367 deletions(-)
create mode 100644 docs/images/wiki-browser.png
create mode 100644 docs/images/wiki-graph.png
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 281aaced..65a6b967 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,31 @@
All notable changes to this project will be documented in this file.
+## [0.5.0] - 2026-04-27
+
+### 🚀 New Features
+- **NEW**: Wiki Mode — a brand-new agent-driven Wiki knowledge system that automatically distills raw documents into interlinked markdown pages. It ships with a dedicated WikiBrowser, an interactive knowledge graph visualizing references and relationships between pages, and specialized agent tools, empowering teams to grow a structured, continuously evolving knowledge base from their own materials.
+- **NEW**: Observability — integrated Langfuse for agent ReAct loop, LLM token tracking, tool calls, and asynq pipeline tracing, providing deep visibility into agent reasoning, tool execution, and system performance.
+- **NEW**: Customizable Indexing Strategy — users can now independently toggle Vector Search, Keyword Search, Wiki, and Knowledge Graph indexing on a per-knowledge-base level.
+- **NEW**: Vector Store UI & Per-KB Binding — full frontend management interface for Vector Stores, allowing users to configure connections, test connectivity, and assign specific vector stores to different knowledge bases.
+- **NEW**: Yuque Connector — Yuque data source integration with API client, full and incremental fetch, and resource mapping, enabling seamless synchronization of Yuque documents into the knowledge base.
+- **NEW**: Built-in Agent Skills — added a preloaded `OpenMAIC Classroom` agent skill.
+- **NEW**: Agent Tools — added `json_repair` tool for agents to automatically fix and parse malformed JSON outputs.
+- **NEW**: Frontend — added copy action for model cards in settings.
+- **NEW**: Agent — added support to load all sheets from Excel files for DuckDB data analysis.
+
+### ⚡ Improvements
+- **IMPROVED**: Agent — improved tenant context handling and error reporting.
+- **IMPROVED**: Agent — updated synthesis and issue flagging instructions in system prompt.
+- **IMPROVED**: Debugging — enhanced LLM request logging and debug output (`llm_debug`) across all model providers.
+
+### 🐛 Bug Fixes
+- **FIXED**: Agent — materialized knowledge files to temp path for DuckDB to fix access issues
+- **FIXED**: Agent — removed rerank model requirement for wiki-only agents
+- **FIXED**: Docreader — whitelisted offline protoc zip packages in dockerignore
+- **FIXED**: System — changed hardcoded version to `*` comparison for new Linux version compatibility
+- **FIXED**: Setup — added output if offline protoc install package already exists
+
## [0.4.0] - 2026-04-14
### 🚀 New Features
@@ -897,6 +922,8 @@ All notable changes to this project will be documented in this file.
- Docker Compose for quick startup and service orchestration.
- MCP server support for integrating with MCP-compatible clients.
+[0.5.0]: https://github.com/Tencent/WeKnora/tree/v0.5.0
+[0.4.0]: https://github.com/Tencent/WeKnora/tree/v0.4.0
[0.3.6]: https://github.com/Tencent/WeKnora/tree/v0.3.6
[0.3.5]: https://github.com/Tencent/WeKnora/tree/v0.3.5
[0.3.4]: https://github.com/Tencent/WeKnora/tree/v0.3.4
diff --git a/README.md b/README.md
index 134cc424..4024dc8b 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@
-
+
@@ -44,13 +44,27 @@
[**WeKnora**](https://weknora.weixin.qq.com) is an LLM-powered intelligent knowledge management and Q&A framework built for enterprise-grade document understanding and semantic retrieval.
-WeKnora offers two Q&A modes — **Quick Q&A** and **Intelligent Reasoning**. Quick Q&A uses a **RAG (Retrieval-Augmented Generation)** pipeline to rapidly retrieve relevant chunks and generate answers, ideal for everyday knowledge queries. Intelligent Reasoning is powered by a **ReACT Agent** engine that employs a **progressive strategy** to autonomously orchestrate knowledge retrieval, MCP tools, and web search, iteratively reasoning and reflecting to arrive at a final conclusion — suited for multi-source synthesis and complex tasks. Custom agents are also supported, allowing flexible configuration of dedicated knowledge bases, tool sets, and system prompts. Choose the right mode for the task, balancing response speed with reasoning depth.
+WeKnora offers two Q&A modes — **Quick Q&A** and **Intelligent Reasoning**, alongside an autonomous **Wiki Mode**. Quick Q&A uses a **RAG (Retrieval-Augmented Generation)** pipeline to rapidly retrieve relevant chunks and generate answers, ideal for everyday knowledge queries. Intelligent Reasoning is powered by a **ReACT Agent** engine that employs a **progressive strategy** to autonomously orchestrate knowledge retrieval, MCP tools, and web search, iteratively reasoning and reflecting to arrive at a final conclusion — suited for multi-source synthesis and complex tasks. The new **Wiki Mode** allows agents to autonomously generate and maintain a structured, interlinked markdown knowledge base from raw documents. Custom agents are also supported, allowing flexible configuration of dedicated knowledge bases, tool sets, and system prompts. Choose the right mode for the task, balancing response speed with reasoning depth.
-The framework supports auto-syncing knowledge from Feishu (more data sources coming soon), handles 10+ document formats including PDF, Word, images, and Excel, and can serve Q&A directly through IM channels like WeCom, Feishu, Slack, and Telegram. It is compatible with major LLM providers including OpenAI, DeepSeek, Qwen (Alibaba Cloud), Zhipu, Hunyuan, Gemini, MiniMax, NVIDIA, and Ollama. Its fully modular design allows swapping LLMs, vector databases, and storage backends, with support for local and private cloud deployment ensuring complete data sovereignty.
+The framework supports auto-syncing knowledge from Feishu, Notion, and Yuque (more data sources coming soon), handles 10+ document formats including PDF, Word, images, and Excel, and can serve Q&A directly through IM channels like WeCom, Feishu, Slack, and Telegram. It is compatible with major LLM providers including OpenAI, DeepSeek, Qwen (Alibaba Cloud), Zhipu, Hunyuan, Gemini, MiniMax, NVIDIA, and Ollama. Its fully modular design allows swapping LLMs, vector databases, and storage backends, with support for local and private cloud deployment ensuring complete data sovereignty. WeKnora also integrates with **Langfuse** for comprehensive observability into agent reasoning, token usage, and pipeline tracing.
## ✨ Latest Updates
+**v0.5.0 Highlights:**
+
+- **Wiki Mode**: A brand-new agent-driven Wiki knowledge system that automatically distills raw documents into interlinked markdown pages. It ships with a dedicated WikiBrowser and an interactive knowledge graph that visualizes references and relationships between pages, helping teams grow a structured, continuously evolving knowledge base from their own materials.
+- **Observability**: Integrated Langfuse for agent ReAct loop, LLM token tracking, tool calls, and asynq pipeline tracing, providing deep visibility into agent reasoning and system performance.
+- **Customizable Indexing Strategy**: Users can now independently configure and toggle Vector Search, Keyword Search (Hybrid), Wiki, and Knowledge Graph indexing per knowledge base.
+- **Vector Store UI & Per-KB Binding**: Full frontend management for Vector Stores with connectivity testing, plus the ability to bind distinct vector databases to specific knowledge bases.
+- **Yuque Connector**: Yuque data source integration with API client, full and incremental fetch, enabling seamless synchronization of Yuque documents.
+- **Agent Capabilities**: Added `json_repair` tool for automatic JSON fixing, preloaded `OpenMAIC Classroom` skill, and DuckDB multi-sheet Excel data analysis.
+- **Frontend & Debugging**: Added copy action for model cards in settings, and enhanced LLM request debugging and logging across all model providers.
+- **Bug Fixes**: Fixed DuckDB access issues by materializing knowledge files to temp path, removed rerank model requirement for wiki-only agents, and whitelisted offline protoc zip packages in dockerignore.
+
+
+Earlier Releases
+
**v0.4.0 Highlights:**
- **[Knowledge Assistant](https://weknora.weixin.qq.com/platform)**: Cloud-hosted knowledge assistant service for quick onboarding without local deployment
@@ -175,6 +189,7 @@ Fully modular pipeline from document parsing, vectorization, and retrieval to LL
|------------|---------|
| Intelligent Reasoning | ReACT progressive multi-step reasoning, autonomously orchestrating knowledge retrieval, MCP tools, and web search; custom agent support |
| Quick Q&A | RAG-based Q&A over knowledge bases for fast and accurate answers |
+| Wiki Mode | Agent-driven auto-generation of structured, interlinked markdown Wiki pages from raw documents |
| Tool Calling | Built-in tools, MCP tools, web search |
| Conversation Strategy | Online Prompt editing, retrieval threshold tuning, multi-turn context awareness |
| Suggested Questions | Auto-generated question suggestions based on knowledge base content |
@@ -183,8 +198,8 @@ Fully modular pipeline from document parsing, vectorization, and retrieval to LL
| Capability | Details |
|------------|---------|
-| Knowledge Base Types | FAQ / Document with folder import, URL import, tag management, and online entry |
-| Data Source Import | Auto-sync from Feishu / Notion (more data sources coming soon); incremental and full sync |
+| Knowledge Base Types | FAQ / Document / Wiki with folder import, URL import, tag management, and online entry |
+| Data Source Import | Auto-sync from Feishu / Notion / Yuque (more data sources coming soon); incremental and full sync |
| Document Formats | PDF / Word / Txt / Markdown / HTML / Images / CSV / Excel / PPT / JSON |
| Retrieval Strategies | BM25 sparse / Dense retrieval / GraphRAG / parent-child chunking / multi-dimensional indexing |
| E2E Testing | Full-pipeline visualization with recall hit rate, BLEU / ROUGE metric evaluation |
@@ -206,6 +221,7 @@ Fully modular pipeline from document parsing, vectorization, and retrieval to LL
|------------|---------|
| Deployment | Local / Docker / Kubernetes (Helm) with private and offline support |
| UI | Web UI / RESTful API / Chrome Extension |
+| Observability | Integrated Langfuse for ReAct loops, token tracking, tool calls, and pipeline tracing |
| 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 |
@@ -276,7 +292,11 @@ Stop services: `docker compose down`
Agent Mode Tool Call Process
 |
-
+
+ Wiki Browser
 |
+ Wiki Knowledge Graph
 |
+
+
Knowledge Base Management
 |
Conversation Settings
 |
diff --git a/README_CN.md b/README_CN.md
index 268405fa..3ed5deeb 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -22,7 +22,7 @@
-
+
@@ -44,12 +44,26 @@
**[WeKnora(维娜拉)](https://weknora.weixin.qq.com)** 是一款基于大语言模型(LLM)的智能知识管理与问答框架,专为企业级文档理解与语义检索场景打造。
-WeKnora 提供**快速问答**与**智能推理**两种问答模式。快速问答基于 **RAG(Retrieval-Augmented Generation)** 流水线,快速召回相关片段并生成回答,适合日常知识查询。智能推理基于 **ReACT Agent** 引擎,采用**渐进式策略**自主编排知识检索、MCP 工具和网络搜索,经过多轮迭代与反思逐步推导最终结论,适合多源信息整合与复杂任务。同时支持自定义智能体,灵活配置专属的知识库、工具集与系统提示词。两种模式按需选用,兼顾响应速度与推理深度。
+WeKnora 提供**快速问答**与**智能推理**两种问答模式,并新增了支持自治化内容构建的 **Wiki 模式**。快速问答基于 **RAG(Retrieval-Augmented Generation)** 流水线,快速召回相关片段并生成回答,适合日常知识查询。智能推理基于 **ReACT Agent** 引擎,采用**渐进式策略**自主编排知识检索、MCP 工具和网络搜索,经过多轮迭代与反思逐步推导最终结论,适合多源信息整合与复杂任务。全新的 **Wiki 模式** 允许 Agent 从原始文档中自主生成并维护一套结构化、相互链接的 Markdown Wiki 知识库。同时支持自定义智能体,灵活配置专属的知识库、工具集与系统提示词。两种模式按需选用,兼顾响应速度与推理深度。
-框架支持从飞书等外部平台自动同步知识(更多数据源持续接入中),覆盖 PDF、Word、图片、Excel 等十余种文档格式,并可通过企业微信、飞书、Slack、Telegram 等 IM 频道直接提供问答服务。模型层面兼容 OpenAI、DeepSeek、Qwen(阿里云)、智谱、混元、Gemini、MiniMax、NVIDIA、Ollama 等主流厂商。全流程模块化设计,大模型、向量数据库、存储等组件均可灵活替换,支持本地与私有云部署,数据完全自主可控。
+框架支持从飞书、Notion 及语雀等外部平台自动同步知识(更多数据源持续接入中),覆盖 PDF、Word、图片、Excel 等十余种文档格式,并可通过企业微信、飞书、Slack、Telegram 等 IM 频道直接提供问答服务。模型层面兼容 OpenAI、DeepSeek、Qwen(阿里云)、智谱、混元、Gemini、MiniMax、NVIDIA、Ollama 等主流厂商。全流程模块化设计,大模型、向量数据库、存储等组件均可灵活替换,支持本地与私有云部署,数据完全自主可控。WeKnora 还无缝集成了 **Langfuse**,为 Agent 运行、Token 使用及任务流水线提供了全面的可观测性追踪。
## ✨ 最新更新
+**v0.5.0 版本亮点:**
+
+- **Wiki 模式**:全新推出 Agent 驱动的 Wiki 知识体系,可从原始文档中自动梳理并生成相互关联的 Markdown 页面,内置独立的 Wiki 浏览器与可视化知识图谱,直观呈现页面之间的引用与关联关系,帮助团队沉淀结构化、可迭代演进的专属知识库
+- **可观测性**:集成 Langfuse 以深入跟踪 Agent ReAct 循环、LLM Token 消耗、工具调用以及 asynq 任务流水线,全面掌控 Agent 推理和系统性能
+- **自定义索引策略**:用户现在可以在知识库级别,独立开启或关闭 向量检索、关键词检索(混合检索)、Wiki 模式 以及 知识图谱 构建
+- **向量数据库 UI 与知识库绑定**:新增前端 Vector Store 管理界面与连通性测试功能,并支持为不同知识库绑定专属的向量数据库实例
+- **语雀数据源**:新增语雀连接器,提供完整的 API 客户端,支持文档的全量与增量同步,实现语雀知识的无缝接入
+- **Agent 能力增强**:新增 `json_repair` 工具以自动修复和解析异常 JSON 输出,预置了 `OpenMAIC Classroom` 智能体技能,并支持在 DuckDB 数据分析中加载 Excel 的所有工作表
+- **前端与调试优化**:设置页面模型卡片新增快速复制功能,全面增强了所有模型厂商的 LLM 请求调试(`llm_debug`)和日志记录机制
+- **问题修复**:修复 DuckDB 访问文件问题(将知识文件物化到临时目录)、移除纯 Wiki 模式 Agent 对 Rerank 模型的依赖,以及在 dockerignore 中将离线 protoc 压缩包加入白名单
+
+
+更早版本
+
**v0.4.0 版本亮点:**
- **[知识助理](https://weknora.weixin.qq.com/platform)**:云端托管的知识助理服务,无需本地部署即可快速体验
@@ -173,6 +187,7 @@ WeKnora 提供**快速问答**与**智能推理**两种问答模式。快速问
|------|------|
| 智能推理 | ReACT 渐进式多步推理,自主编排知识检索、MCP 工具与网络搜索,支持自定义智能体 |
| 快速问答 | 基于知识库的 RAG 问答,快速准确地回答问题 |
+| Wiki 模式 | Agent 驱动从原始文档中自动生成并维护结构化、相互链接的 Markdown Wiki 知识页面 |
| 工具调用 | 内置工具、MCP 工具、网络搜索 |
| 对话策略 | 在线 Prompt 编辑、检索阈值调节、多轮上下文感知 |
| 推荐问题 | 基于知识库内容自动生成推荐问题 |
@@ -181,8 +196,8 @@ WeKnora 提供**快速问答**与**智能推理**两种问答模式。快速问
| 能力 | 详情 |
|------|------|
-| 知识库类型 | FAQ / 文档,支持文件夹导入、URL 导入、标签管理、在线录入 |
-| 数据源导入 | 飞书 / Notion 知识库自动同步(更多数据源开发中),支持增量与全量同步 |
+| 知识库类型 | FAQ / 文档 / Wiki,支持文件夹导入、URL 导入、标签管理、在线录入 |
+| 数据源导入 | 飞书 / Notion / 语雀 知识库自动同步(更多数据源开发中),支持增量与全量同步 |
| 文档格式 | PDF / Word / Txt / Markdown / HTML / 图片 / CSV / Excel / PPT / JSON |
| 检索策略 | BM25 稀疏召回 / Dense 稠密召回 / GraphRAG 图谱增强 / 父子分块 / 多维度索引 |
| 端到端测试 | 检索+生成全链路可视化,评估召回命中率、BLEU / ROUGE 等指标 |
@@ -204,6 +219,7 @@ WeKnora 提供**快速问答**与**智能推理**两种问答模式。快速问
|------|------|
| 部署 | 本地 / Docker / Kubernetes (Helm),支持私有化离线部署 |
| 界面 | Web UI / RESTful API / Chrome Extension|
+| 可观测性 | 集成 Langfuse 以追踪 ReAct 循环、Token 消耗、工具调用和任务流水线 |
| 任务管理 | MQ 异步任务,版本升级自动数据库迁移 |
| 模型管理 | 集中配置,知识库级别模型选择,多租户共享内置模型,WeKnora Cloud 托管模型与文档解析 |
@@ -274,6 +290,10 @@ docker compose up -d # 启动核心服务
Agent模式工具调用过程
 |
+
+ Wiki 浏览器
 |
+ Wiki 知识图谱
 |
+
知识库管理
 |
对话设置
 |
diff --git a/README_JA.md b/README_JA.md
index 0704850b..64d05a2e 100644
--- a/README_JA.md
+++ b/README_JA.md
@@ -22,7 +22,7 @@
-
+
@@ -44,12 +44,26 @@
[**WeKnora(ウィーノラ)**](https://weknora.weixin.qq.com) は、大規模言語モデル(LLM)をベースとしたインテリジェントなナレッジ管理・Q&Aフレームワークで、エンタープライズ向けの文書理解と意味検索シナリオに特化して設計されています。
-WeKnora は**クイック Q&A** と**インテリジェント推論**の 2 つの Q&A モードを提供します。クイック Q&A は **RAG(Retrieval-Augmented Generation)** パイプラインで関連フラグメントを素早く検索・回答を生成し、日常的なナレッジ検索に最適です。インテリジェント推論は **ReACT Agent** エンジンにより、**プログレッシブ戦略**でナレッジ検索、MCP ツール、Web 検索を自律的にオーケストレーションし、反復推論とリフレクションで段階的に結論を導きます。複数情報源の統合や複雑なタスクに最適です。カスタムエージェントにも対応し、専用のナレッジベース、ツールセット、システムプロンプトを柔軟に設定できます。用途に応じてモードを選択し、応答速度と推論の深さを両立します。
+WeKnora は**クイック Q&A** と**インテリジェント推論**の 2 つの Q&A モードを提供し、さらに自律的なコンテンツ構築をサポートする**Wiki モード**を追加しました。クイック Q&A は **RAG(Retrieval-Augmented Generation)** パイプラインで関連フラグメントを素早く検索・回答を生成し、日常的なナレッジ検索に最適です。インテリジェント推論は **ReACT Agent** エンジンにより、**プログレッシブ戦略**でナレッジ検索、MCP ツール、Web 検索を自律的にオーケストレーションし、反復推論とリフレクションで段階的に結論を導きます。新しい**Wiki モード**により、Agent は生のドキュメントから構造化され、相互にリンクされたMarkdown Wikiナレッジベースを自律的に生成・維持できます。カスタムエージェントにも対応し、専用のナレッジベース、ツールセット、システムプロンプトを柔軟に設定できます。用途に応じてモードを選択し、応答速度と推論の深さを両立します。
-Feishuなどの外部プラットフォームからのナレッジ自動同期(他のデータソースも順次対応中)に対応し、PDF、Word、画像、Excelなど10以上の文書フォーマットをサポート。WeChat Work、Feishu、Slack、TelegramなどのIMチャネルから直接Q&Aサービスを提供できます。モデル層ではOpenAI、DeepSeek、Qwen(Alibaba Cloud)、Zhipu、Hunyuan、Gemini、MiniMax、NVIDIA、Ollamaなど主要プロバイダーに対応。全プロセスをモジュラー設計し、大規模モデル、ベクトルデータベース、ストレージなどのコンポーネントを柔軟に差し替え可能。ローカルおよびプライベートクラウドデプロイに対応し、データは完全に自己管理可能です。
+Feishu、Notion、Yuqueなどの外部プラットフォームからのナレッジ自動同期(他のデータソースも順次対応中)に対応し、PDF、Word、画像、Excelなど10以上の文書フォーマットをサポート。WeChat Work、Feishu、Slack、TelegramなどのIMチャネルから直接Q&Aサービスを提供できます。モデル層ではOpenAI、DeepSeek、Qwen(Alibaba Cloud)、Zhipu、Hunyuan、Gemini、MiniMax、NVIDIA、Ollamaなど主要プロバイダーに対応。全プロセスをモジュラー設計し、大規模モデル、ベクトルデータベース、ストレージなどのコンポーネントを柔軟に差し替え可能。ローカルおよびプライベートクラウドデプロイに対応し、データは完全に自己管理可能です。さらにWeKnoraは **Langfuse** とシームレスに統合され、Agentの推論、トークン消費、パイプラインに対する包括的な可観測性(オブザーバビリティ)を提供します。
## ✨ 最新アップデート
+**v0.5.0 バージョンのハイライト:**
+
+- **Wiki モード**:Agent 主導の Wiki ナレッジシステムを新たに提供。生のドキュメントから相互リンクされた Markdown ページを自動的に整理・生成し、専用の Wiki ブラウザに加えて、ページ間の参照や関連性を可視化するインタラクティブなナレッジグラフを備え、構造化され継続的に進化するチーム専用ナレッジベースの構築を支援します。
+- **可観測性**:Langfuseを統合し、AgentのReActループ、LLMトークントラッキング、ツール呼び出し、asynqパイプラインを詳細に追跡。Agentの推論とシステムパフォーマンスを包括的に把握できます。
+- **カスタマイズ可能なインデックス戦略**:ユーザーはナレッジベースごとに、ベクトル検索、キーワード検索(ハイブリッド)、Wiki、およびナレッジグラフのインデックス付けを個別に有効化/無効化できるようになりました。
+- **ベクトルデータベースUIとナレッジベースのバインド**:接続テストを含むVector Store管理用の完全なフロントエンドUIが追加され、特定のナレッジベースに専用のベクトルデータベースインスタンスをバインドする機能がサポートされました。
+- **Yuque コネクタ**:APIクライアントを通じたYuqueデータソース統合。フルおよび増分同期をサポートし、Yuqueドキュメントのシームレスな取り込みを実現します。
+- **Agent機能の強化**:不正なJSON出力を自動的に修正および解析する`json_repair`ツールが追加され、`OpenMAIC Classroom`スキルがプリロードされ、DuckDBデータ分析でExcelのすべてのシートを読み込むサポートが強化されました。
+- **フロントエンドとデバッグの最適化**:設定のモデルカードにクイックコピー機能が追加され、すべてのモデルプロバイダーにおいてLLMリクエストのデバッグ(`llm_debug`)およびログ記録メカニズムが包括的に強化されました。
+- **バグ修正**:DuckDBのアクセス問題(ナレッジファイルを一時パスに実体化)の修正、Wiki専用AgentのRerankモデル要件の削除、およびdockerignore内のオフラインprotoc zipパッケージのホワイトリスト化。
+
+
+過去のリリース
+
**v0.4.0 バージョンのハイライト:**
- **[知識アシスタント](https://weknora.weixin.qq.com/platform)**:クラウドホスティング型知識アシスタントサービス、ローカルデプロイ不要で即座に利用可能
@@ -175,6 +189,7 @@ Feishuなどの外部プラットフォームからのナレッジ自動同期
|------|------|
| インテリジェント推論 | ReACT プログレッシブ・マルチステップ推論、ナレッジ検索・MCP ツール・Web 検索を自律的にオーケストレーション、カスタムエージェント対応 |
| クイック Q&A | ナレッジベースベースの RAG Q&A、迅速かつ正確な回答 |
+| Wiki モード | Agent主導で生のドキュメントから構造化された相互リンク済みMarkdown Wikiページを自動生成・保守 |
| ツール呼び出し | 組み込みツール、MCP ツール、Web 検索 |
| 対話戦略 | オンライン Prompt 編集、検索閾値チューニング、マルチターン文脈認識 |
| 推奨質問 | ナレッジベースの内容に基づく質問の自動生成 |
@@ -183,8 +198,8 @@ Feishuなどの外部プラットフォームからのナレッジ自動同期
| 機能 | 詳細 |
|------|------|
-| ナレッジベースタイプ | FAQ / ドキュメント、フォルダーインポート・URL インポート・タグ管理・オンライン入力 |
-| データソースインポート | Feishu / Notion ナレッジベースの自動同期(他のデータソースも開発中)、増分・全量同期対応 |
+| ナレッジベースタイプ | FAQ / ドキュメント / Wiki、フォルダーインポート・URL インポート・タグ管理・オンライン入力 |
+| データソースインポート | Feishu / Notion / Yuque ナレッジベースの自動同期(他のデータソースも開発中)、増分・全量同期対応 |
| 文書フォーマット | PDF / Word / Txt / Markdown / HTML / 画像 / CSV / Excel / PPT / JSON |
| 検索戦略 | BM25 疎検索 / Dense 密検索 / GraphRAG グラフ強化 / 親子チャンキング / 多次元インデックス |
| E2E テスト | 検索+生成の全パイプライン可視化、リコール的中率・BLEU / ROUGE 指標評価 |
@@ -206,6 +221,7 @@ Feishuなどの外部プラットフォームからのナレッジ自動同期
|------|------|
| デプロイ | ローカル / Docker / Kubernetes (Helm)、プライベート化・オフラインデプロイ対応 |
| UI | Web UI / RESTful API / Chrome Extension |
+| 可観測性 | ReActループ、トークン消費、ツール呼び出し、パイプライン追跡のためのLangfuse統合 |
| タスク管理 | MQ 非同期タスク、バージョンアップ時の DB 自動マイグレーション |
| モデル管理 | 集中設定、ナレッジベース単位のモデル選択、マルチテナント組み込みモデル共有、WeKnora Cloud ホスティングモデルとドキュメント解析 |
@@ -275,7 +291,11 @@ docker compose up -d # コアサービスを起動
Agentモードツール呼び出しプロセス
 |
-
+
+ Wikiブラウザ
 |
+ Wikiナレッジグラフ
 |
+
+
ナレッジベース管理
 |
対話設定
 |
diff --git a/README_KO.md b/README_KO.md
index 32d4571d..d2c1e1ed 100644
--- a/README_KO.md
+++ b/README_KO.md
@@ -22,7 +22,7 @@
-
+
@@ -44,12 +44,26 @@
[**WeKnora**](https://weknora.weixin.qq.com)는 엔터프라이즈급 문서 이해와 시맨틱 검색을 위해 설계된, LLM 기반의 지능형 지식 관리 및 Q&A 프레임워크입니다.
-WeKnora는 **빠른 Q&A**와 **지능형 추론** 두 가지 Q&A 모드를 제공합니다. 빠른 Q&A는 **RAG(Retrieval-Augmented Generation)** 파이프라인으로 관련 조각을 빠르게 검색하여 답변을 생성하며, 일상적인 지식 검색에 적합합니다. 지능형 추론은 **ReACT Agent** 엔진이 **점진적 전략**으로 지식 검색, MCP 도구, 웹 검색을 자율적으로 오케스트레이션하며, 반복 추론과 리플렉션을 통해 단계적으로 결론을 도출합니다. 다중 소스 통합과 복잡한 작업에 적합합니다. 커스텀 에이전트도 지원하여 전용 지식베이스, 도구 세트, 시스템 프롬프트를 유연하게 구성할 수 있습니다. 용도에 맞게 모드를 선택하여 응답 속도와 추론 깊이를 동시에 달성합니다.
+WeKnora는 **빠른 Q&A**와 **지능형 추론** 두 가지 Q&A 모드와 더불어, 자율적인 콘텐츠 구성을 지원하는 **Wiki 모드**를 제공합니다. 빠른 Q&A는 **RAG(Retrieval-Augmented Generation)** 파이프라인으로 관련 조각을 빠르게 검색하여 답변을 생성하며, 일상적인 지식 검색에 적합합니다. 지능형 추론은 **ReACT Agent** 엔진이 **점진적 전략**으로 지식 검색, MCP 도구, 웹 검색을 자율적으로 오케스트레이션하며, 반복 추론과 리플렉션을 통해 단계적으로 결론을 도출합니다. 새로운 **Wiki 모드**를 통해 Agent는 원본 문서에서 구조화되고 상호 연결된 마크다운 Wiki 지식베이스를 자율적으로 생성하고 유지할 수 있습니다. 커스텀 에이전트도 지원하여 전용 지식베이스, 도구 세트, 시스템 프롬프트를 유연하게 구성할 수 있습니다. 용도에 맞게 모드를 선택하여 응답 속도와 추론 깊이를 동시에 달성합니다.
-Feishu 등 외부 플랫폼에서 지식 자동 동기화를 지원하며(추가 데이터 소스 개발 중), PDF, Word, 이미지, Excel 등 10가지 이상의 문서 포맷을 처리합니다. WeChat Work, Feishu, Slack, Telegram 등의 IM 채널을 통해 Q&A 서비스를 직접 제공할 수 있습니다. 모델 레이어에서 OpenAI, DeepSeek, Qwen(Alibaba Cloud), Zhipu, Hunyuan, Gemini, MiniMax, NVIDIA, Ollama 등 주요 프로바이더를 지원합니다. 전체 프로세스가 모듈화 설계되어 LLM, 벡터 DB, 스토리지 등 구성 요소를 유연하게 교체 가능하며, 로컬 및 프라이빗 클라우드 배포를 지원하여 데이터 완전 자체 관리가 가능합니다.
+Feishu, Notion, Yuque 등 외부 플랫폼에서 지식 자동 동기화를 지원하며(추가 데이터 소스 개발 중), PDF, Word, 이미지, Excel 등 10가지 이상의 문서 포맷을 처리합니다. WeChat Work, Feishu, Slack, Telegram 등의 IM 채널을 통해 Q&A 서비스를 직접 제공할 수 있습니다. 모델 레이어에서 OpenAI, DeepSeek, Qwen(Alibaba Cloud), Zhipu, Hunyuan, Gemini, MiniMax, NVIDIA, Ollama 등 주요 프로바이더를 지원합니다. 전체 프로세스가 모듈화 설계되어 LLM, 벡터 DB, 스토리지 등 구성 요소를 유연하게 교체 가능하며, 로컬 및 프라이빗 클라우드 배포를 지원하여 데이터 완전 자체 관리가 가능합니다. 또한 WeKnora는 **Langfuse**와 원활하게 통합되어 Agent 추론, 토큰 사용량 및 파이프라인에 대한 포괄적인 관측 가능성(Observability)을 제공합니다.
## ✨ 최신 업데이트
+**v0.5.0 하이라이트:**
+
+- **Wiki 모드**: Agent 기반의 새로운 Wiki 지식 체계를 도입했습니다. 원본 문서에서 상호 연결된 마크다운 페이지를 자동으로 정리·생성하고, 전용 Wiki 브라우저와 함께 페이지 간 참조 및 연관 관계를 시각화하는 인터랙티브 지식 그래프를 제공하여, 팀 전용으로 구조화되고 지속적으로 진화하는 지식 베이스를 구축할 수 있도록 돕습니다.
+- **관측 가능성(Observability)**: Langfuse를 통합하여 Agent의 ReAct 루프, LLM 토큰 추적, 도구 호출 및 asynq 파이프라인을 심층적으로 추적하여 Agent 추론 및 시스템 성능을 완벽하게 파악할 수 있습니다.
+- **사용자 정의 인덱싱 전략**: 사용자는 이제 지식베이스 수준에서 벡터 검색, 키워드 검색(하이브리드), Wiki 및 지식 그래프(Knowledge Graph) 인덱싱을 독립적으로 설정하고 전환할 수 있습니다.
+- **벡터 데이터베이스 UI 및 지식베이스 바인딩**: 연결 테스트가 포함된 벡터 데이터베이스 관리를 위한 프론트엔드 UI가 추가되었으며, 특정 지식베이스에 고유한 벡터 데이터베이스를 바인딩할 수 있는 기능이 지원됩니다.
+- **Yuque 커넥터**: API 클라이언트를 통한 Yuque 데이터 소스 통합으로 전체 및 증분 동기화를 지원하여 Yuque 문서를 원활하게 가져옵니다.
+- **Agent 기능 강화**: 잘못된 JSON 출력을 자동으로 수정하는 `json_repair` 도구가 추가되었으며, `OpenMAIC Classroom` 스킬이 사전 탑재되고, DuckDB 데이터 분석에서 Excel의 모든 시트를 로드하도록 지원이 강화되었습니다.
+- **프론트엔드 및 디버깅**: 설정의 모델 카드에 복사 작업이 추가되었으며, 모든 모델 프로바이더에 걸쳐 LLM 요청 디버깅(`llm_debug`) 및 로깅 메커니즘이 크게 향상되었습니다.
+- **버그 수정**: DuckDB 액세스 문제 수정(지식 파일을 임시 경로에 구체화), Wiki 전용 Agent의 Rerank 모델 요구 사항 제거, dockerignore에 오프라인 protoc zip 패키지 허용 목록 추가.
+
+
+이전 릴리스
+
**v0.4.0 하이라이트:**
- **[지식 어시스턴트](https://weknora.weixin.qq.com/platform)**: 클라우드 호스팅 지식 어시스턴트 서비스, 로컬 배포 없이 빠르게 시작 가능
@@ -184,6 +198,7 @@ Feishu 등 외부 플랫폼에서 지식 자동 동기화를 지원하며(추가
|------|------|
| 지능형 추론 | ReACT 점진적 멀티스텝 추론, 지식 검색·MCP 도구·웹 검색을 자율 오케스트레이션, 커스텀 에이전트 지원 |
| 빠른 Q&A | 지식베이스 기반 RAG Q&A, 빠르고 정확한 답변 |
+| Wiki 모드 | Agent가 주도하여 원본 문서에서 구조화된 마크다운 Wiki 페이지를 자동 생성 및 유지 관리 |
| 도구 호출 | 내장 도구, MCP 도구, 웹 검색 |
| 대화 전략 | 온라인 프롬프트 편집, 검색 임계값 조정, 멀티턴 문맥 인식 |
| 추천 질문 | 지식베이스 콘텐츠 기반 질문 자동 생성 |
@@ -192,8 +207,8 @@ Feishu 등 외부 플랫폼에서 지식 자동 동기화를 지원하며(추가
| 기능 | 상세 |
|------|------|
-| 지식베이스 타입 | FAQ / 문서, 폴더 임포트·URL 임포트·태그 관리·온라인 입력 |
-| 데이터 소스 임포트 | Feishu / Notion 지식베이스 자동 동기화(추가 데이터 소스 개발 중), 증분·전체 동기화 지원 |
+| 지식베이스 타입 | FAQ / 문서 / Wiki, 폴더 임포트·URL 임포트·태그 관리·온라인 입력 |
+| 데이터 소스 임포트 | Feishu / Notion / Yuque 지식베이스 자동 동기화(추가 데이터 소스 개발 중), 증분·전체 동기화 지원 |
| 문서 포맷 | PDF / Word / Txt / Markdown / HTML / 이미지 / CSV / Excel / PPT / JSON |
| 검색 전략 | BM25 희소 / Dense 밀집 / GraphRAG 그래프 강화 / 부모-자식 청킹 / 다차원 인덱싱 |
| E2E 테스트 | 전체 파이프라인 시각화, 리콜 적중률·BLEU / ROUGE 지표 평가 |
@@ -215,6 +230,7 @@ Feishu 등 외부 플랫폼에서 지식 자동 동기화를 지원하며(추가
|------|------|
| 배포 | 로컬 / Docker / Kubernetes (Helm), 프라이빗/오프라인 배포 지원 |
| UI | Web UI / RESTful API / Chrome Extension |
+| 관측 가능성 | ReAct 루프, 토큰 소비, 도구 호출, 파이프라인 추적을 위한 Langfuse 통합 |
| 작업 관리 | MQ 비동기 작업, 버전 업그레이드 시 자동 DB 마이그레이션 |
| 모델 관리 | 중앙 설정, 지식베이스별 모델 선택, 멀티테넌트 내장 모델 공유, WeKnora Cloud 호스팅 모델 및 문서 파싱 |
@@ -276,7 +292,7 @@ docker compose up -d # 코어 서비스 시작
| 백엔드 API | `http://localhost:8080` |
| Jaeger 트레이싱 | `http://localhost:16686` |
-## 📱 인터페이스 소개
+## 📱 기능 데모
@@ -285,6 +301,10 @@ docker compose up -d # 코어 서비스 시작
Agent 모드 도구 호출 과정
 |
+
+ Wiki 브라우저
 |
+ Wiki 지식 그래프
 |
+
지식베이스 관리
 |
대화 설정
 |
diff --git a/VERSION b/VERSION
index 1d0ba9ea..8f0916f7 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.4.0
+0.5.0
diff --git a/docs/QA.md b/docs/QA.md
index 96279f93..7fb417aa 100644
--- a/docs/QA.md
+++ b/docs/QA.md
@@ -179,5 +179,29 @@ docker compose restart app
```
+## 9. 如何开启和查看 Langfuse 可观测性追踪?
+
+WeKnora 支持通过 Langfuse 对 Agent 的 ReAct 循环、大模型 Token 消耗、工具调用以及异步任务流水线进行全链路追踪。
+
+**开启步骤**:
+1. 准备一个可用的 Langfuse 实例(支持云端版或私有部署版)。
+2. 在 `.env` 文件中配置以下环境变量:
+```bash
+LANGFUSE_PUBLIC_KEY=pk-lf-...
+LANGFUSE_SECRET_KEY=sk-lf-...
+LANGFUSE_HOST=https://cloud.langfuse.com # 或你的私有部署地址
+```
+3. 重启服务后,系统会自动对所有支持的模型调用和 Agent 运行轨迹进行追踪,你可以在 Langfuse 的 Traces 面板中直观地看到每次对话和后台任务的详细执行瀑布图与 Token 统计。
+
+## 10. 什么是 Wiki 模式?如何使用?
+
+Wiki 模式允许 Agent 根据原始文档自动生成并维护一套结构化、相互链接的 Markdown Wiki 知识库,从而实现复杂知识的体系化沉淀和图谱化。
+
+**使用方法**:
+1. 进入指定**知识库的设置** -> **索引策略 (Indexing Strategy)**。
+2. 开启 **Wiki** 索引功能(可同时结合开启**知识图谱**)。
+3. 当你向该知识库上传文档时,系统会自动触发异步任务,通过大模型提取文档中的实体与核心概念,并自动生成结构化的 Wiki 页面及页面间的知识图谱链接。
+4. 你可以在该知识库的“Wiki”标签页中,使用专用的 Wiki 浏览器查阅、管理页面,并通过可视化的知识图谱查看不同内容之间的关联关系。
+
## P.S.
如果以上方式未解决问题,请在issue中描述您的问题,并提供必要的日志信息辅助我们进行问题排查
diff --git a/docs/docs.go b/docs/docs.go
index 8e7bae98..a050168f 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -51,7 +51,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -83,7 +83,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.CreateAgentRequest"
+ "$ref": "#/definitions/internal_handler.CreateAgentRequest"
}
}
],
@@ -98,7 +98,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -136,6 +136,38 @@ const docTemplate = `{
}
}
},
+ "/agents/type-presets": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ },
+ {
+ "ApiKeyAuth": []
+ }
+ ],
+ "description": "返回所有 smart-reasoning 下可用的智能体类型预设(RAG/Wiki/Hybrid/Custom),用于编辑器自动填充系统提示词、工具和 KB 兼容性",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "智能体"
+ ],
+ "summary": "获取智能体类型预设列表",
+ "responses": {
+ "200": {
+ "description": "预设列表",
+ "schema": {
+ "type": "object",
+ "additionalProperties": true
+ }
+ }
+ }
+ }
+ },
"/agents/{id}": {
"get": {
"security": [
@@ -177,13 +209,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "智能体不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -222,7 +254,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.UpdateAgentRequest"
+ "$ref": "#/definitions/internal_handler.UpdateAgentRequest"
}
}
],
@@ -237,13 +269,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"403": {
"description": "无法修改内置智能体",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -288,19 +320,19 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"403": {
"description": "无法删除内置智能体",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "智能体不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -347,13 +379,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "智能体不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -418,13 +450,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "智能体不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -455,7 +487,7 @@ const docTemplate = `{
"schema": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.DataSource"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.DataSource"
}
}
},
@@ -489,7 +521,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.DataSource"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.DataSource"
}
}
],
@@ -497,7 +529,7 @@ const docTemplate = `{
"201": {
"description": "Created",
"schema": {
- "$ref": "#/definitions/types.DataSource"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.DataSource"
}
},
"400": {
@@ -535,7 +567,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.SyncLog"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.SyncLog"
}
},
"404": {
@@ -566,7 +598,7 @@ const docTemplate = `{
"schema": {
"type": "array",
"items": {
- "$ref": "#/definitions/datasource.ConnectorMetadata"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_datasource.ConnectorMetadata"
}
}
}
@@ -642,7 +674,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.DataSource"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.DataSource"
}
},
"404": {
@@ -682,7 +714,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.DataSource"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.DataSource"
}
}
],
@@ -690,7 +722,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.DataSource"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.DataSource"
}
},
"400": {
@@ -772,7 +804,7 @@ const docTemplate = `{
"schema": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.SyncLog"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.SyncLog"
}
}
},
@@ -851,7 +883,7 @@ const docTemplate = `{
"schema": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.Resource"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Resource"
}
}
},
@@ -925,7 +957,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.SyncLog"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.SyncLog"
}
},
"400": {
@@ -978,6 +1010,681 @@ const docTemplate = `{
}
}
},
+ "/api/v1/knowledgebase/{kb_id}/wiki/auto-fix": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Automatically fix fixable wiki issues (broken links, etc.)",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Auto-fix wiki issues",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "object",
+ "additionalProperties": true
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/graph": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Returns the wiki link graph data for visualization",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Get wiki link graph",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiGraphData"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/index": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Returns the wiki index page (creates default if not exists)",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Get wiki index page",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/issues": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "List issues flagged on wiki pages with optional filtering",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "List wiki page issues",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Filter by page slug",
+ "name": "slug",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "Filter by status (pending, ignored, resolved)",
+ "name": "status",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPageIssue"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/issues/{issue_id}/status": {
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Update the status of a flagged wiki page issue",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Update wiki page issue status",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Issue ID",
+ "name": "issue_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "New status {'status': 'ignored'}",
+ "name": "status",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "type": "object"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ },
+ "400": {
+ "description": "Bad Request",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/lint": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Perform a comprehensive health check on the wiki",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Run wiki lint",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_application_service.WikiLintReport"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/log": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Returns the wiki operation log page (creates default if not exists)",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Get wiki operation log",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/pages": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "List wiki pages with optional filtering and pagination",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "List wiki pages",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Filter by page type",
+ "name": "page_type",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "Filter by status",
+ "name": "status",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "Full-text search",
+ "name": "query",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "Page number",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "description": "Page size",
+ "name": "page_size",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "Sort field",
+ "name": "sort_by",
+ "in": "query"
+ },
+ {
+ "type": "string",
+ "description": "Sort order (asc/desc)",
+ "name": "sort_order",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPageListResponse"
+ }
+ },
+ "400": {
+ "description": "Bad Request",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Create a new wiki page in the knowledge base",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Create a wiki page",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Wiki page data",
+ "name": "page",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Created",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ },
+ "400": {
+ "description": "Bad Request",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/pages/{slug}": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Retrieve a wiki page by its slug",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Get a wiki page by slug",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Page slug",
+ "name": "slug",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ },
+ "404": {
+ "description": "Not Found",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
+ }
+ }
+ }
+ },
+ "put": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Update an existing wiki page by slug",
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Update a wiki page",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Page slug",
+ "name": "slug",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "Updated wiki page data",
+ "name": "page",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ },
+ "404": {
+ "description": "Not Found",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
+ }
+ }
+ }
+ },
+ "delete": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Soft-delete a wiki page by slug",
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Delete a wiki page",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Page slug",
+ "name": "slug",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ },
+ "404": {
+ "description": "Not Found",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/rebuild-links": {
+ "post": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Re-parse all pages and rebuild bidirectional link references",
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Rebuild wiki links",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/search": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Full-text search over wiki pages",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Search wiki pages",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "Search query",
+ "name": "q",
+ "in": "query",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "Max results (default 10)",
+ "name": "limit",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/knowledgebase/{kb_id}/wiki/stats": {
+ "get": {
+ "security": [
+ {
+ "Bearer": []
+ }
+ ],
+ "description": "Returns aggregate statistics about the wiki",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Wiki"
+ ],
+ "summary": "Get wiki statistics",
+ "parameters": [
+ {
+ "type": "string",
+ "description": "Knowledge base ID",
+ "name": "kb_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiStats"
+ }
+ }
+ }
+ }
+ },
"/auth/auto-setup": {
"post": {
"description": "Lite 版专用:首次启动时自动创建默认用户和租户并返回令牌,后续启动直接签发令牌,免除手动注册/登录流程",
@@ -995,13 +1702,13 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.LoginResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.LoginResponse"
}
},
"403": {
"description": "非 Lite 版本",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1055,7 +1762,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1081,7 +1788,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.LoginRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.LoginRequest"
}
}
],
@@ -1089,13 +1796,13 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.LoginResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.LoginResponse"
}
},
"401": {
"description": "认证失败",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1130,7 +1837,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1165,7 +1872,7 @@ const docTemplate = `{
"401": {
"description": "未授权",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1228,7 +1935,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.OIDCConfigResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OIDCConfigResponse"
}
}
}
@@ -1260,19 +1967,19 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.OIDCAuthURLResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OIDCAuthURLResponse"
}
},
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"403": {
"description": "OIDC未启用",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1318,7 +2025,7 @@ const docTemplate = `{
"401": {
"description": "令牌无效",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1344,7 +2051,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.RegisterRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RegisterRequest"
}
}
],
@@ -1352,19 +2059,19 @@ const docTemplate = `{
"201": {
"description": "Created",
"schema": {
- "$ref": "#/definitions/types.RegisterResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RegisterResponse"
}
},
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"403": {
"description": "注册功能已禁用",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1399,7 +2106,7 @@ const docTemplate = `{
"401": {
"description": "令牌无效",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1446,13 +2153,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "分块不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1513,13 +2220,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "分块不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1580,7 +2287,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1625,7 +2332,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1673,7 +2380,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.UpdateChunkRequest"
+ "$ref": "#/definitions/internal_handler.UpdateChunkRequest"
}
}
],
@@ -1688,13 +2395,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "分块不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1746,13 +2453,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "分块不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1799,7 +2506,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1831,7 +2538,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.EvaluationRequest"
+ "$ref": "#/definitions/internal_handler.EvaluationRequest"
}
}
],
@@ -1846,7 +2553,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1893,7 +2600,7 @@ const docTemplate = `{
"404": {
"description": "任务不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -1927,7 +2634,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.TextRelationExtractionRequest"
+ "$ref": "#/definitions/internal_handler.TextRelationExtractionRequest"
}
}
],
@@ -1942,7 +2649,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2000,7 +2707,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.FabriTextRequest"
+ "$ref": "#/definitions/internal_handler.FabriTextRequest"
}
}
],
@@ -2015,7 +2722,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2071,7 +2778,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2118,7 +2825,7 @@ const docTemplate = `{
"404": {
"description": "知识库不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2157,7 +2864,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.KBModelConfigRequest"
+ "$ref": "#/definitions/internal_handler.KBModelConfigRequest"
}
}
],
@@ -2172,13 +2879,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "知识库不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2227,7 +2934,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2276,7 +2983,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2310,7 +3017,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.RemoteModelCheckRequest"
+ "$ref": "#/definitions/internal_handler.RemoteModelCheckRequest"
}
}
],
@@ -2325,7 +3032,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2374,7 +3081,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2454,7 +3161,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2533,7 +3240,7 @@ const docTemplate = `{
"404": {
"description": "任务不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2571,7 +3278,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2628,7 +3335,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2682,7 +3389,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2752,7 +3459,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2784,7 +3491,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.KnowledgeBase"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.KnowledgeBase"
}
}
],
@@ -2799,7 +3506,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2833,7 +3540,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.CopyKnowledgeBaseRequest"
+ "$ref": "#/definitions/internal_handler.CopyKnowledgeBaseRequest"
}
}
],
@@ -2848,7 +3555,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2895,7 +3602,7 @@ const docTemplate = `{
"404": {
"description": "任务不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2948,13 +3655,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "知识库不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -2993,7 +3700,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.UpdateKnowledgeBaseRequest"
+ "$ref": "#/definitions/internal_handler.UpdateKnowledgeBaseRequest"
}
}
],
@@ -3008,7 +3715,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3053,7 +3760,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3136,7 +3843,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3175,7 +3882,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.FAQBatchUpsertPayload"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQBatchUpsertPayload"
}
}
],
@@ -3190,7 +3897,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3252,7 +3959,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3298,7 +4005,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3339,7 +4046,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.FAQEntryFieldsBatchUpdate"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQEntryFieldsBatchUpdate"
}
}
],
@@ -3354,7 +4061,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3410,7 +4117,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3464,13 +4171,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "条目不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3516,7 +4223,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.FAQEntryPayload"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQEntryPayload"
}
}
],
@@ -3531,7 +4238,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3579,7 +4286,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.addSimilarQuestionsRequest"
+ "$ref": "#/definitions/internal_handler.addSimilarQuestionsRequest"
}
}
],
@@ -3594,13 +4301,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "条目不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3641,7 +4348,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.FAQEntryPayload"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQEntryPayload"
}
}
],
@@ -3656,7 +4363,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3697,7 +4404,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.updateLastFAQImportResultDisplayStatusRequest"
+ "$ref": "#/definitions/internal_handler.updateLastFAQImportResultDisplayStatusRequest"
}
}
],
@@ -3712,13 +4419,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "知识库不存在或无导入记录",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3759,7 +4466,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.FAQSearchRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQSearchRequest"
}
}
],
@@ -3774,7 +4481,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3815,7 +4522,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.SearchParams"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.SearchParams"
}
}
],
@@ -3830,7 +4537,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3907,7 +4614,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -3952,13 +4659,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"403": {
"description": "权限不足",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4030,7 +4737,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"409": {
@@ -4078,7 +4785,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.ManualKnowledgePayload"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ManualKnowledgePayload"
}
}
],
@@ -4093,7 +4800,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4169,7 +4876,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"409": {
@@ -4223,7 +4930,7 @@ const docTemplate = `{
"404": {
"description": "知识库不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4257,7 +4964,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.ListSharesResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ListSharesResponse"
}
}
}
@@ -4293,7 +5000,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.ShareKnowledgeBaseRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ShareKnowledgeBaseRequest"
}
}
],
@@ -4353,7 +5060,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.UpdateSharePermissionRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.UpdateSharePermissionRequest"
}
}
],
@@ -4476,7 +5183,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4541,7 +5248,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4604,7 +5311,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4661,7 +5368,7 @@ const docTemplate = `{
"name": "body",
"in": "body",
"schema": {
- "$ref": "#/definitions/handler.DeleteTagRequest"
+ "$ref": "#/definitions/internal_handler.DeleteTagRequest"
}
}
],
@@ -4676,7 +5383,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4739,7 +5446,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4807,7 +5514,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4848,7 +5555,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.ManualKnowledgePayload"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ManualKnowledgePayload"
}
}
],
@@ -4863,7 +5570,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4933,7 +5640,7 @@ const docTemplate = `{
"400": {
"description": "Invalid request",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -4982,7 +5689,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5029,13 +5736,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "知识不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5074,7 +5781,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.Knowledge"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Knowledge"
}
}
],
@@ -5089,7 +5796,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5134,7 +5841,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5180,7 +5887,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5229,7 +5936,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5276,13 +5983,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"403": {
"description": "权限不足",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5320,7 +6027,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5352,7 +6059,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.MCPService"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MCPService"
}
}
],
@@ -5367,7 +6074,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5414,7 +6121,7 @@ const docTemplate = `{
"404": {
"description": "服务不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5468,7 +6175,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5513,7 +6220,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5560,7 +6267,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5607,7 +6314,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5654,7 +6361,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5720,7 +6427,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.SearchMessagesRequest"
+ "$ref": "#/definitions/internal_handler.SearchMessagesRequest"
}
}
],
@@ -5735,7 +6442,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5795,7 +6502,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5849,7 +6556,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5887,7 +6594,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -5919,7 +6626,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.CreateModelRequest"
+ "$ref": "#/definitions/internal_handler.CreateModelRequest"
}
}
],
@@ -5934,7 +6641,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -6021,7 +6728,7 @@ const docTemplate = `{
"404": {
"description": "模型不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -6060,7 +6767,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.UpdateModelRequest"
+ "$ref": "#/definitions/internal_handler.UpdateModelRequest"
}
}
],
@@ -6075,7 +6782,7 @@ const docTemplate = `{
"404": {
"description": "模型不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -6120,7 +6827,7 @@ const docTemplate = `{
"404": {
"description": "模型不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -6145,7 +6852,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.ListOrganizationsResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ListOrganizationsResponse"
}
}
}
@@ -6174,7 +6881,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.CreateOrganizationRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.CreateOrganizationRequest"
}
}
],
@@ -6220,7 +6927,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.JoinOrganizationRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.JoinOrganizationRequest"
}
}
],
@@ -6266,7 +6973,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.JoinByOrganizationIDRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.JoinByOrganizationIDRequest"
}
}
],
@@ -6312,7 +7019,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.SubmitJoinRequestRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.SubmitJoinRequestRequest"
}
}
],
@@ -6486,7 +7193,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.UpdateOrganizationRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.UpdateOrganizationRequest"
}
}
],
@@ -6575,7 +7282,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.InviteMemberRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.InviteMemberRequest"
}
}
],
@@ -6723,7 +7430,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.ReviewJoinRequestRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ReviewJoinRequestRequest"
}
}
],
@@ -6810,7 +7517,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.ListMembersResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ListMembersResponse"
}
}
}
@@ -6855,7 +7562,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.UpdateMemberRoleRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.UpdateMemberRoleRequest"
}
}
],
@@ -6951,7 +7658,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.RequestRoleUpgradeRequest"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RequestRoleUpgradeRequest"
}
}
],
@@ -7125,7 +7832,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/types.ListSharesResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ListSharesResponse"
}
}
}
@@ -7177,7 +7884,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7209,7 +7916,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler_session.CreateSessionRequest"
+ "$ref": "#/definitions/internal_handler_session.CreateSessionRequest"
}
}
],
@@ -7224,7 +7931,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7258,7 +7965,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler_session.batchDeleteRequest"
+ "$ref": "#/definitions/internal_handler_session.batchDeleteRequest"
}
}
],
@@ -7273,7 +7980,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7307,7 +8014,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler_session.SearchKnowledgeRequest"
+ "$ref": "#/definitions/internal_handler_session.SearchKnowledgeRequest"
}
}
],
@@ -7322,7 +8029,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7369,7 +8076,7 @@ const docTemplate = `{
"404": {
"description": "会话不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7408,7 +8115,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.Session"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Session"
}
}
],
@@ -7423,7 +8130,7 @@ const docTemplate = `{
"404": {
"description": "会话不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7468,7 +8175,7 @@ const docTemplate = `{
"404": {
"description": "会话不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7515,13 +8222,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "会话不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7562,7 +8269,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler_session.CreateKnowledgeQARequest"
+ "$ref": "#/definitions/internal_handler_session.CreateKnowledgeQARequest"
}
}
],
@@ -7577,7 +8284,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7631,7 +8338,7 @@ const docTemplate = `{
"404": {
"description": "会话或消息不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7672,7 +8379,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler_session.CreateKnowledgeQARequest"
+ "$ref": "#/definitions/internal_handler_session.CreateKnowledgeQARequest"
}
}
],
@@ -7687,7 +8394,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7728,7 +8435,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler_session.StopSessionRequest"
+ "$ref": "#/definitions/internal_handler_session.StopSessionRequest"
}
}
],
@@ -7743,7 +8450,7 @@ const docTemplate = `{
"404": {
"description": "会话或消息不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7784,7 +8491,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler_session.GenerateTitleRequest"
+ "$ref": "#/definitions/internal_handler_session.GenerateTitleRequest"
}
}
],
@@ -7799,7 +8506,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7863,7 +8570,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -7916,7 +8623,7 @@ const docTemplate = `{
"200": {
"description": "系统信息",
"schema": {
- "$ref": "#/definitions/handler.GetSystemInfoResponse"
+ "$ref": "#/definitions/internal_handler.GetSystemInfoResponse"
}
}
}
@@ -7992,7 +8699,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.StorageCheckRequest"
+ "$ref": "#/definitions/internal_handler.StorageCheckRequest"
}
}
],
@@ -8000,7 +8707,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/handler.StorageCheckResponse"
+ "$ref": "#/definitions/internal_handler.StorageCheckResponse"
}
}
}
@@ -8020,7 +8727,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
- "$ref": "#/definitions/handler.GetStorageEngineStatusResponse"
+ "$ref": "#/definitions/internal_handler.GetStorageEngineStatusResponse"
}
}
}
@@ -8055,7 +8762,7 @@ const docTemplate = `{
"500": {
"description": "服务器错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8084,7 +8791,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.Tenant"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Tenant"
}
}
],
@@ -8099,7 +8806,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8134,7 +8841,7 @@ const docTemplate = `{
"403": {
"description": "权限不足",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8172,7 +8879,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8210,7 +8917,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8248,7 +8955,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8286,7 +8993,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8333,7 +9040,7 @@ const docTemplate = `{
"400": {
"description": "不支持的键",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8387,7 +9094,7 @@ const docTemplate = `{
"400": {
"description": "不支持的键",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8453,7 +9160,7 @@ const docTemplate = `{
"403": {
"description": "权限不足",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8500,13 +9207,13 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"404": {
"description": "租户不存在",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8542,7 +9249,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/types.Tenant"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Tenant"
}
}
],
@@ -8557,7 +9264,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8599,7 +9306,7 @@ const docTemplate = `{
"400": {
"description": "请求参数错误",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8667,7 +9374,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.CreateStoreRequest"
+ "$ref": "#/definitions/internal_handler.CreateStoreRequest"
}
}
],
@@ -8682,7 +9389,7 @@ const docTemplate = `{
"400": {
"description": "Invalid request or validation error",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"401": {
@@ -8695,7 +9402,7 @@ const docTemplate = `{
"409": {
"description": "Duplicate endpoint and index",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
}
}
@@ -8729,7 +9436,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.TestStoreRequest"
+ "$ref": "#/definitions/internal_handler.TestStoreRequest"
}
}
],
@@ -8744,7 +9451,7 @@ const docTemplate = `{
"400": {
"description": "Invalid request",
"schema": {
- "$ref": "#/definitions/errors.AppError"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.AppError"
}
},
"401": {
@@ -8863,7 +9570,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
- "$ref": "#/definitions/handler.UpdateStoreRequest"
+ "$ref": "#/definitions/internal_handler.UpdateStoreRequest"
}
}
],
@@ -9010,7 +9717,87 @@ const docTemplate = `{
}
},
"definitions": {
- "datasource.ConnectorMetadata": {
+ "github_com_Tencent_WeKnora_internal_application_service.WikiLintIssue": {
+ "type": "object",
+ "properties": {
+ "auto_fixable": {
+ "type": "boolean"
+ },
+ "description": {
+ "type": "string"
+ },
+ "page_slug": {
+ "type": "string"
+ },
+ "severity": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_application_service.WikiLintIssueSeverity"
+ },
+ "target_slug": {
+ "description": "TargetSlug identifies the other page involved in the issue (e.g. the\nbroken link target, or the entity slug for a missing cross-ref). It is\nthe structured field used by AutoFix instead of parsing Description.",
+ "type": "string"
+ },
+ "type": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_application_service.WikiLintIssueType"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_application_service.WikiLintIssueSeverity": {
+ "type": "string",
+ "enum": [
+ "info",
+ "warning",
+ "error"
+ ],
+ "x-enum-varnames": [
+ "SeverityInfo",
+ "SeverityWarning",
+ "SeverityError"
+ ]
+ },
+ "github_com_Tencent_WeKnora_internal_application_service.WikiLintIssueType": {
+ "type": "string",
+ "enum": [
+ "orphan_page",
+ "broken_link",
+ "stale_ref",
+ "missing_cross_ref",
+ "empty_content",
+ "duplicate_slug"
+ ],
+ "x-enum-varnames": [
+ "LintIssueOrphanPage",
+ "LintIssueBrokenLink",
+ "LintIssueStaleRef",
+ "LintIssueMissingCrossRef",
+ "LintIssueEmptyContent",
+ "LintIssueDuplicateSlug"
+ ]
+ },
+ "github_com_Tencent_WeKnora_internal_application_service.WikiLintReport": {
+ "type": "object",
+ "properties": {
+ "health_score": {
+ "description": "0-100",
+ "type": "integer"
+ },
+ "issues": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_application_service.WikiLintIssue"
+ }
+ },
+ "knowledge_base_id": {
+ "type": "string"
+ },
+ "stats": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiStats"
+ },
+ "summary": {
+ "type": "string"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_datasource.ConnectorMetadata": {
"type": "object",
"properties": {
"auth_type": {
@@ -9042,11 +9829,11 @@ const docTemplate = `{
}
}
},
- "errors.AppError": {
+ "github_com_Tencent_WeKnora_internal_errors.AppError": {
"type": "object",
"properties": {
"code": {
- "$ref": "#/definitions/errors.ErrorCode"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_errors.ErrorCode"
},
"details": {},
"message": {
@@ -9054,7 +9841,7 @@ const docTemplate = `{
}
}
},
- "errors.ErrorCode": {
+ "github_com_Tencent_WeKnora_internal_errors.ErrorCode": {
"type": "integer",
"enum": [
1000,
@@ -9101,799 +9888,7 @@ const docTemplate = `{
"ErrAgentInvalidTemperature"
]
},
- "github_com_Tencent_WeKnora_internal_errors.AppError": {
- "type": "object",
- "properties": {
- "code": {
- "$ref": "#/definitions/errors.ErrorCode"
- },
- "details": {},
- "message": {
- "type": "string"
- }
- }
- },
- "gorm.DeletedAt": {
- "type": "object",
- "properties": {
- "time": {
- "type": "string"
- },
- "valid": {
- "description": "Valid is true if Time is not NULL",
- "type": "boolean"
- }
- }
- },
- "handler.CopyKnowledgeBaseRequest": {
- "type": "object",
- "required": [
- "source_id"
- ],
- "properties": {
- "source_id": {
- "type": "string"
- },
- "target_id": {
- "type": "string"
- },
- "task_id": {
- "type": "string"
- }
- }
- },
- "handler.CreateAgentRequest": {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "avatar": {
- "type": "string"
- },
- "config": {
- "$ref": "#/definitions/types.CustomAgentConfig"
- },
- "description": {
- "type": "string"
- },
- "name": {
- "type": "string"
- }
- }
- },
- "handler.CreateModelRequest": {
- "type": "object",
- "required": [
- "name",
- "parameters",
- "source",
- "type"
- ],
- "properties": {
- "description": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "parameters": {
- "$ref": "#/definitions/types.ModelParameters"
- },
- "source": {
- "$ref": "#/definitions/types.ModelSource"
- },
- "type": {
- "$ref": "#/definitions/types.ModelType"
- }
- }
- },
- "handler.CreateStoreRequest": {
- "type": "object",
- "required": [
- "connection_config",
- "engine_type",
- "name"
- ],
- "properties": {
- "connection_config": {
- "$ref": "#/definitions/types.ConnectionConfig"
- },
- "engine_type": {
- "$ref": "#/definitions/types.RetrieverEngineType"
- },
- "index_config": {
- "$ref": "#/definitions/types.IndexConfig"
- },
- "name": {
- "type": "string"
- }
- }
- },
- "handler.DeleteTagRequest": {
- "type": "object",
- "properties": {
- "exclude_ids": {
- "description": "Chunk seq_ids to exclude from deletion",
- "type": "array",
- "items": {
- "type": "integer"
- }
- }
- }
- },
- "handler.EvaluationRequest": {
- "type": "object",
- "properties": {
- "chat_id": {
- "description": "ID of chat model to use",
- "type": "string"
- },
- "dataset_id": {
- "description": "ID of dataset to evaluate",
- "type": "string"
- },
- "knowledge_base_id": {
- "description": "ID of knowledge base to use",
- "type": "string"
- },
- "rerank_id": {
- "description": "ID of rerank model to use",
- "type": "string"
- }
- }
- },
- "handler.FabriTextRequest": {
- "type": "object",
- "required": [
- "model_id"
- ],
- "properties": {
- "model_id": {
- "type": "string"
- },
- "tags": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- },
- "handler.GetStorageEngineStatusResponse": {
- "type": "object",
- "properties": {
- "engines": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/handler.StorageEngineStatusItem"
- }
- },
- "minio_env_available": {
- "type": "boolean"
- }
- }
- },
- "handler.GetSystemInfoResponse": {
- "type": "object",
- "properties": {
- "build_time": {
- "type": "string"
- },
- "commit_id": {
- "type": "string"
- },
- "db_version": {
- "type": "string"
- },
- "edition": {
- "type": "string"
- },
- "go_version": {
- "type": "string"
- },
- "graph_database_engine": {
- "type": "string"
- },
- "keyword_index_engine": {
- "type": "string"
- },
- "minio_enabled": {
- "type": "boolean"
- },
- "vector_store_engine": {
- "type": "string"
- },
- "version": {
- "type": "string"
- }
- }
- },
- "handler.KBModelConfigRequest": {
- "type": "object",
- "required": [
- "embeddingModelId",
- "llmModelId"
- ],
- "properties": {
- "asr_config": {
- "$ref": "#/definitions/types.ASRConfig"
- },
- "documentSplitting": {
- "description": "文档分块配置",
- "type": "object",
- "properties": {
- "childChunkSize": {
- "type": "integer"
- },
- "chunkOverlap": {
- "type": "integer"
- },
- "chunkSize": {
- "type": "integer"
- },
- "enableParentChild": {
- "type": "boolean"
- },
- "parentChunkSize": {
- "type": "integer"
- },
- "parserEngineRules": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/types.ParserEngineRule"
- }
- },
- "separators": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- },
- "embeddingModelId": {
- "type": "string"
- },
- "llmModelId": {
- "type": "string"
- },
- "multimodal": {
- "description": "多模态配置(仅模型相关;存储引擎在 storageProvider 中配置)",
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean"
- }
- }
- },
- "nodeExtract": {
- "description": "知识图谱配置",
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean"
- },
- "nodes": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/types.GraphNode"
- }
- },
- "relations": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/types.GraphRelation"
- }
- },
- "tags": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "text": {
- "type": "string"
- }
- }
- },
- "questionGeneration": {
- "description": "问题生成配置",
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean"
- },
- "questionCount": {
- "type": "integer"
- }
- }
- },
- "storageProvider": {
- "description": "存储引擎选择(\"local\" | \"minio\" | \"cos\"),影响文档上传与文档内图片存储,参数从全局设置读取",
- "type": "string"
- },
- "vlm_config": {
- "$ref": "#/definitions/types.VLMConfig"
- }
- }
- },
- "handler.RemoteModelCheckRequest": {
- "type": "object",
- "required": [
- "baseUrl",
- "modelName"
- ],
- "properties": {
- "apiKey": {
- "type": "string"
- },
- "baseUrl": {
- "type": "string"
- },
- "modelName": {
- "type": "string"
- },
- "provider": {
- "type": "string"
- }
- }
- },
- "handler.SearchMessagesRequest": {
- "type": "object",
- "required": [
- "query"
- ],
- "properties": {
- "limit": {
- "description": "Maximum number of results to return (default: 20)",
- "type": "integer"
- },
- "mode": {
- "description": "Search mode: \"keyword\", \"vector\", \"hybrid\" (default: \"hybrid\")",
- "type": "string"
- },
- "query": {
- "description": "Query text for search",
- "type": "string"
- },
- "session_ids": {
- "description": "Filter by specific session IDs (optional)",
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- },
- "handler.StorageCheckRequest": {
- "type": "object",
- "properties": {
- "cos": {
- "$ref": "#/definitions/types.COSEngineConfig"
- },
- "minio": {
- "$ref": "#/definitions/types.MinIOEngineConfig"
- },
- "oss": {
- "$ref": "#/definitions/types.OSSEngineConfig"
- },
- "provider": {
- "description": "\"minio\", \"cos\", \"tos\", \"s3\", \"oss\"",
- "type": "string"
- },
- "s3": {
- "$ref": "#/definitions/types.S3EngineConfig"
- },
- "tos": {
- "$ref": "#/definitions/types.TOSEngineConfig"
- }
- }
- },
- "handler.StorageCheckResponse": {
- "type": "object",
- "properties": {
- "bucket_created": {
- "type": "boolean"
- },
- "message": {
- "type": "string"
- },
- "ok": {
- "type": "boolean"
- }
- }
- },
- "handler.StorageEngineStatusItem": {
- "type": "object",
- "properties": {
- "available": {
- "description": "whether the engine can be used",
- "type": "boolean"
- },
- "description": {
- "description": "short description for UI",
- "type": "string"
- },
- "name": {
- "description": "\"local\", \"minio\", \"cos\", \"tos\"",
- "type": "string"
- }
- }
- },
- "handler.TestStoreRequest": {
- "type": "object",
- "required": [
- "connection_config",
- "engine_type"
- ],
- "properties": {
- "connection_config": {
- "$ref": "#/definitions/types.ConnectionConfig"
- },
- "engine_type": {
- "$ref": "#/definitions/types.RetrieverEngineType"
- }
- }
- },
- "handler.TextRelationExtractionRequest": {
- "type": "object",
- "required": [
- "model_id",
- "tags",
- "text"
- ],
- "properties": {
- "model_id": {
- "type": "string"
- },
- "tags": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "text": {
- "type": "string"
- }
- }
- },
- "handler.UpdateAgentRequest": {
- "type": "object",
- "properties": {
- "avatar": {
- "type": "string"
- },
- "config": {
- "$ref": "#/definitions/types.CustomAgentConfig"
- },
- "description": {
- "type": "string"
- },
- "name": {
- "type": "string"
- }
- }
- },
- "handler.UpdateChunkRequest": {
- "type": "object",
- "properties": {
- "chunk_index": {
- "type": "integer"
- },
- "content": {
- "type": "string"
- },
- "embedding": {
- "type": "array",
- "items": {
- "type": "number"
- }
- },
- "end_at": {
- "type": "integer"
- },
- "image_info": {
- "type": "string"
- },
- "is_enabled": {
- "type": "boolean"
- },
- "start_at": {
- "type": "integer"
- }
- }
- },
- "handler.UpdateKnowledgeBaseRequest": {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "config": {
- "$ref": "#/definitions/types.KnowledgeBaseConfig"
- },
- "description": {
- "type": "string"
- },
- "name": {
- "type": "string"
- }
- }
- },
- "handler.UpdateModelRequest": {
- "type": "object",
- "properties": {
- "description": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "parameters": {
- "$ref": "#/definitions/types.ModelParameters"
- },
- "source": {
- "$ref": "#/definitions/types.ModelSource"
- },
- "type": {
- "$ref": "#/definitions/types.ModelType"
- }
- }
- },
- "handler.UpdateStoreRequest": {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "type": "string"
- }
- }
- },
- "handler.addSimilarQuestionsRequest": {
- "type": "object",
- "required": [
- "similar_questions"
- ],
- "properties": {
- "similar_questions": {
- "type": "array",
- "minItems": 1,
- "items": {
- "type": "string"
- }
- }
- }
- },
- "handler.updateLastFAQImportResultDisplayStatusRequest": {
- "type": "object",
- "required": [
- "display_status"
- ],
- "properties": {
- "display_status": {
- "type": "string",
- "enum": [
- "open",
- "close"
- ]
- }
- }
- },
- "handler_session.AttachmentUpload": {
- "type": "object",
- "properties": {
- "data": {
- "description": "Base64-encoded file content",
- "type": "string"
- },
- "file_name": {
- "description": "Original filename",
- "type": "string"
- },
- "file_size": {
- "description": "File size in bytes",
- "type": "integer"
- }
- }
- },
- "handler_session.CreateKnowledgeQARequest": {
- "type": "object",
- "required": [
- "query"
- ],
- "properties": {
- "agent_enabled": {
- "description": "Whether agent mode is enabled for this request",
- "type": "boolean"
- },
- "agent_id": {
- "description": "Selected custom agent ID (backend resolves shared agent and its tenant from share relation)",
- "type": "string"
- },
- "attachment_uploads": {
- "description": "Attached files (documents, audio, etc.)",
- "type": "array",
- "items": {
- "$ref": "#/definitions/handler_session.AttachmentUpload"
- }
- },
- "channel": {
- "description": "Source channel: \"web\", \"api\", \"im\", etc.",
- "type": "string"
- },
- "disable_title": {
- "description": "Whether to disable auto title generation",
- "type": "boolean"
- },
- "enable_memory": {
- "description": "Whether memory feature is enabled for this request",
- "type": "boolean"
- },
- "images": {
- "description": "Attached images for multimodal chat",
- "type": "array",
- "items": {
- "$ref": "#/definitions/handler_session.ImageAttachment"
- }
- },
- "knowledge_base_ids": {
- "description": "Selected knowledge base ID for this request",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "knowledge_ids": {
- "description": "Selected knowledge ID for this request",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "mentioned_items": {
- "description": "@mentioned knowledge bases and files",
- "type": "array",
- "items": {
- "$ref": "#/definitions/handler_session.MentionedItemRequest"
- }
- },
- "query": {
- "description": "Query text for knowledge base search",
- "type": "string"
- },
- "summary_model_id": {
- "description": "Optional summary model ID for this request (overrides session default)",
- "type": "string"
- },
- "web_search_enabled": {
- "description": "Whether web search is enabled for this request",
- "type": "boolean"
- }
- }
- },
- "handler_session.CreateSessionRequest": {
- "type": "object",
- "properties": {
- "description": {
- "description": "Description for the session (optional)",
- "type": "string"
- },
- "title": {
- "description": "Title for the session (optional)",
- "type": "string"
- }
- }
- },
- "handler_session.GenerateTitleRequest": {
- "type": "object",
- "required": [
- "messages"
- ],
- "properties": {
- "messages": {
- "description": "Messages to use as context for title generation",
- "type": "array",
- "items": {
- "$ref": "#/definitions/types.Message"
- }
- }
- }
- },
- "handler_session.ImageAttachment": {
- "type": "object",
- "properties": {
- "caption": {
- "description": "VLM analysis result (context-aware, single call)",
- "type": "string"
- },
- "data": {
- "description": "base64 data URI from frontend (data:image/png;base64,...)",
- "type": "string"
- },
- "url": {
- "description": "serving URL after saving to storage",
- "type": "string"
- }
- }
- },
- "handler_session.MentionedItemRequest": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "kb_type": {
- "description": "\"document\" or \"faq\" (only for kb type)",
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "type": {
- "description": "\"kb\" for knowledge base, \"file\" for file",
- "type": "string"
- }
- }
- },
- "handler_session.SearchKnowledgeRequest": {
- "type": "object",
- "required": [
- "query"
- ],
- "properties": {
- "knowledge_base_id": {
- "description": "Single knowledge base ID (for backward compatibility)",
- "type": "string"
- },
- "knowledge_base_ids": {
- "description": "IDs of knowledge bases to search (multi-KB support)",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "knowledge_ids": {
- "description": "IDs of specific knowledge (files) to search",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "query": {
- "description": "Query text to search for",
- "type": "string"
- }
- }
- },
- "handler_session.StopSessionRequest": {
- "type": "object",
- "required": [
- "message_id"
- ],
- "properties": {
- "message_id": {
- "type": "string"
- }
- }
- },
- "handler_session.batchDeleteRequest": {
- "type": "object",
- "properties": {
- "delete_all": {
- "type": "boolean"
- },
- "ids": {
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- },
- "types.ASRConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ASRConfig": {
"type": "object",
"properties": {
"enabled": {
@@ -9908,7 +9903,7 @@ const docTemplate = `{
}
}
},
- "types.AgentConfig": {
+ "github_com_Tencent_WeKnora_internal_types.AgentConfig": {
"type": "object",
"properties": {
"allowed_skills": {
@@ -9978,6 +9973,10 @@ const docTemplate = `{
"description": "Whether to execute independent tool calls in parallel (default: false).\nWhen enabled and the LLM returns multiple tool calls, they run concurrently via errgroup.",
"type": "boolean"
},
+ "retain_retrieval_history": {
+ "description": "Whether to retain retrieval history (like wiki_read_page results) across turns (default: false)",
+ "type": "boolean"
+ },
"retrieve_kb_only_when_mentioned": {
"description": "Whether to retrieve knowledge base only when explicitly mentioned with @ (default: false)",
"type": "boolean"
@@ -10031,7 +10030,7 @@ const docTemplate = `{
}
}
},
- "types.AgentStep": {
+ "github_com_Tencent_WeKnora_internal_types.AgentStep": {
"type": "object",
"properties": {
"iteration": {
@@ -10050,12 +10049,12 @@ const docTemplate = `{
"description": "Tools called in this step (Act phase)",
"type": "array",
"items": {
- "$ref": "#/definitions/types.ToolCall"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ToolCall"
}
}
}
},
- "types.AnswerStrategy": {
+ "github_com_Tencent_WeKnora_internal_types.AnswerStrategy": {
"type": "string",
"enum": [
"all",
@@ -10066,7 +10065,7 @@ const docTemplate = `{
"AnswerStrategyRandom"
]
},
- "types.COSEngineConfig": {
+ "github_com_Tencent_WeKnora_internal_types.COSEngineConfig": {
"type": "object",
"properties": {
"app_id": {
@@ -10089,7 +10088,7 @@ const docTemplate = `{
}
}
},
- "types.ChatHistoryConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ChatHistoryConfig": {
"type": "object",
"properties": {
"embedding_model_id": {
@@ -10106,7 +10105,7 @@ const docTemplate = `{
}
}
},
- "types.ChunkingConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ChunkingConfig": {
"type": "object",
"properties": {
"child_chunk_size": {
@@ -10137,7 +10136,7 @@ const docTemplate = `{
"description": "ParserEngineRules configures which parser engine to use for each file type.\nWhen empty, the builtin engine is used for all types.",
"type": "array",
"items": {
- "$ref": "#/definitions/types.ParserEngineRule"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ParserEngineRule"
}
},
"separators": {
@@ -10149,7 +10148,7 @@ const docTemplate = `{
}
}
},
- "types.ConnectionConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ConnectionConfig": {
"type": "object",
"properties": {
"addr": {
@@ -10194,7 +10193,7 @@ const docTemplate = `{
}
}
},
- "types.ContextCompressionStrategy": {
+ "github_com_Tencent_WeKnora_internal_types.ContextCompressionStrategy": {
"type": "string",
"enum": [
"sliding_window",
@@ -10205,14 +10204,14 @@ const docTemplate = `{
"ContextCompressionSmart"
]
},
- "types.ContextConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ContextConfig": {
"type": "object",
"properties": {
"compression_strategy": {
"description": "Compression strategy: \"sliding_window\" or \"smart\"",
"allOf": [
{
- "$ref": "#/definitions/types.ContextCompressionStrategy"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ContextCompressionStrategy"
}
]
},
@@ -10230,7 +10229,7 @@ const docTemplate = `{
}
}
},
- "types.ConversationConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ConversationConfig": {
"type": "object",
"properties": {
"context_template": {
@@ -10300,7 +10299,7 @@ const docTemplate = `{
}
}
},
- "types.CreateOrganizationRequest": {
+ "github_com_Tencent_WeKnora_internal_types.CreateOrganizationRequest": {
"type": "object",
"required": [
"name"
@@ -10330,21 +10329,25 @@ const docTemplate = `{
}
}
},
- "types.CredentialsConfig": {
+ "github_com_Tencent_WeKnora_internal_types.CredentialsConfig": {
"type": "object",
"properties": {
"weknoracloud": {
- "$ref": "#/definitions/types.WeKnoraCloudCredentials"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WeKnoraCloudCredentials"
}
}
},
- "types.CustomAgentConfig": {
+ "github_com_Tencent_WeKnora_internal_types.CustomAgentConfig": {
"type": "object",
"properties": {
"agent_mode": {
"description": "===== Basic Settings =====\nAgent mode: \"quick-answer\" for RAG mode, \"smart-reasoning\" for ReAct agent mode",
"type": "string"
},
+ "agent_type": {
+ "description": "AgentType is a preset category under smart-reasoning mode that pre-fills\nsystem prompt, allowed tools and recommended KB compatibility.\nValid values: \"rag-qa\", \"wiki-qa\", \"hybrid-rag-wiki\", \"custom\".\nEmpty / unknown values are treated as \"custom\" (no preset applied).\nIgnored for quick-answer mode.",
+ "type": "string"
+ },
"allowed_tools": {
"description": "Allowed tools (only for agent type)",
"type": "array",
@@ -10474,6 +10477,10 @@ const docTemplate = `{
"description": "Rerank top K",
"type": "integer"
},
+ "retain_retrieval_history": {
+ "description": "Whether to retain retrieval history across turns",
+ "type": "boolean"
+ },
"retrieve_kb_only_when_mentioned": {
"description": "Whether to retrieve knowledge base only when explicitly mentioned with @ (default: false)\nWhen true, knowledge base retrieval only happens if user explicitly mentions KB/files with @\nWhen false, knowledge base retrieval happens according to KBSelectionMode",
"type": "boolean"
@@ -10557,7 +10564,7 @@ const docTemplate = `{
}
}
},
- "types.DataSource": {
+ "github_com_Tencent_WeKnora_internal_types.DataSource": {
"type": "object",
"properties": {
"config": {
@@ -10617,7 +10624,7 @@ const docTemplate = `{
"description": "Latest sync log (not stored in DB, populated on query)",
"allOf": [
{
- "$ref": "#/definitions/types.SyncLog"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.SyncLog"
}
]
},
@@ -10663,7 +10670,7 @@ const docTemplate = `{
}
}
},
- "types.EmbeddingParameters": {
+ "github_com_Tencent_WeKnora_internal_types.EmbeddingParameters": {
"type": "object",
"properties": {
"dimension": {
@@ -10674,7 +10681,7 @@ const docTemplate = `{
}
}
},
- "types.ExtractConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ExtractConfig": {
"type": "object",
"properties": {
"enabled": {
@@ -10683,13 +10690,13 @@ const docTemplate = `{
"nodes": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.GraphNode"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.GraphNode"
}
},
"relations": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.GraphRelation"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.GraphRelation"
}
},
"tags": {
@@ -10703,7 +10710,7 @@ const docTemplate = `{
}
}
},
- "types.FAQBatchUpsertPayload": {
+ "github_com_Tencent_WeKnora_internal_types.FAQBatchUpsertPayload": {
"type": "object",
"required": [
"entries"
@@ -10716,7 +10723,7 @@ const docTemplate = `{
"entries": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.FAQEntryPayload"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQEntryPayload"
}
},
"knowledge_id": {
@@ -10735,32 +10742,32 @@ const docTemplate = `{
}
}
},
- "types.FAQConfig": {
+ "github_com_Tencent_WeKnora_internal_types.FAQConfig": {
"type": "object",
"properties": {
"index_mode": {
- "$ref": "#/definitions/types.FAQIndexMode"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQIndexMode"
},
"question_index_mode": {
- "$ref": "#/definitions/types.FAQQuestionIndexMode"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQQuestionIndexMode"
}
}
},
- "types.FAQEntryFieldsBatchUpdate": {
+ "github_com_Tencent_WeKnora_internal_types.FAQEntryFieldsBatchUpdate": {
"type": "object",
"properties": {
"by_id": {
"description": "ByID 按条目ID更新,key为条目ID (seq_id)",
"type": "object",
"additionalProperties": {
- "$ref": "#/definitions/types.FAQEntryFieldsUpdate"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQEntryFieldsUpdate"
}
},
"by_tag": {
"description": "ByTag 按Tag批量更新,key为TagID (seq_id)",
"type": "object",
"additionalProperties": {
- "$ref": "#/definitions/types.FAQEntryFieldsUpdate"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQEntryFieldsUpdate"
}
},
"exclude_ids": {
@@ -10772,7 +10779,7 @@ const docTemplate = `{
}
}
},
- "types.FAQEntryFieldsUpdate": {
+ "github_com_Tencent_WeKnora_internal_types.FAQEntryFieldsUpdate": {
"type": "object",
"properties": {
"is_enabled": {
@@ -10786,14 +10793,14 @@ const docTemplate = `{
}
}
},
- "types.FAQEntryPayload": {
+ "github_com_Tencent_WeKnora_internal_types.FAQEntryPayload": {
"type": "object",
"required": [
"standard_question"
],
"properties": {
"answer_strategy": {
- "$ref": "#/definitions/types.AnswerStrategy"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.AnswerStrategy"
},
"answers": {
"type": "array",
@@ -10834,7 +10841,7 @@ const docTemplate = `{
}
}
},
- "types.FAQIndexMode": {
+ "github_com_Tencent_WeKnora_internal_types.FAQIndexMode": {
"type": "string",
"enum": [
"question_only",
@@ -10845,7 +10852,7 @@ const docTemplate = `{
"FAQIndexModeQuestionAnswer"
]
},
- "types.FAQQuestionIndexMode": {
+ "github_com_Tencent_WeKnora_internal_types.FAQQuestionIndexMode": {
"type": "string",
"enum": [
"combined",
@@ -10856,7 +10863,7 @@ const docTemplate = `{
"FAQQuestionIndexModeSeparate"
]
},
- "types.FAQSearchRequest": {
+ "github_com_Tencent_WeKnora_internal_types.FAQSearchRequest": {
"type": "object",
"required": [
"query_text"
@@ -10891,7 +10898,7 @@ const docTemplate = `{
}
}
},
- "types.GraphNode": {
+ "github_com_Tencent_WeKnora_internal_types.GraphNode": {
"type": "object",
"properties": {
"attributes": {
@@ -10911,7 +10918,7 @@ const docTemplate = `{
}
}
},
- "types.GraphRelation": {
+ "github_com_Tencent_WeKnora_internal_types.GraphRelation": {
"type": "object",
"properties": {
"node1": {
@@ -10925,7 +10932,7 @@ const docTemplate = `{
}
}
},
- "types.ImageProcessingConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ImageProcessingConfig": {
"type": "object",
"properties": {
"model_id": {
@@ -10934,7 +10941,7 @@ const docTemplate = `{
}
}
},
- "types.IndexConfig": {
+ "github_com_Tencent_WeKnora_internal_types.IndexConfig": {
"type": "object",
"properties": {
"collection_name": {
@@ -10942,11 +10949,15 @@ const docTemplate = `{
"type": "string"
},
"collection_prefix": {
- "description": "Qdrant",
+ "description": "Qdrant, Weaviate",
"type": "string"
},
+ "desired_shard_count": {
+ "description": "Weaviate: number of shards per collection",
+ "type": "integer"
+ },
"index_name": {
- "description": "ES, OpenSearch",
+ "description": "--- Existing fields ---",
"type": "string"
},
"number_of_replicas": {
@@ -10956,10 +10967,47 @@ const docTemplate = `{
"number_of_shards": {
"description": "ES, OpenSearch",
"type": "integer"
+ },
+ "replica_number": {
+ "description": "Milvus: in-memory replica count (LoadCollection)",
+ "type": "integer"
+ },
+ "replication_factor": {
+ "description": "Qdrant, Weaviate: number of replicas",
+ "type": "integer"
+ },
+ "shard_number": {
+ "description": "--- Scalability fields ---",
+ "type": "integer"
+ },
+ "shards_num": {
+ "description": "Milvus: number of shards per collection (CreateCollection)",
+ "type": "integer"
}
}
},
- "types.InviteMemberRequest": {
+ "github_com_Tencent_WeKnora_internal_types.IndexingStrategy": {
+ "type": "object",
+ "properties": {
+ "graph_enabled": {
+ "description": "GraphEnabled enables knowledge graph entity/relation extraction",
+ "type": "boolean"
+ },
+ "keyword_enabled": {
+ "description": "KeywordEnabled enables keyword-based (BM25) search",
+ "type": "boolean"
+ },
+ "vector_enabled": {
+ "description": "VectorEnabled enables semantic vector embedding and search",
+ "type": "boolean"
+ },
+ "wiki_enabled": {
+ "description": "WikiEnabled enables automatic wiki page generation from documents",
+ "type": "boolean"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_types.InviteMemberRequest": {
"type": "object",
"required": [
"role",
@@ -10970,7 +11018,7 @@ const docTemplate = `{
"description": "Role to assign: admin/editor/viewer",
"allOf": [
{
- "$ref": "#/definitions/types.OrgMemberRole"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrgMemberRole"
}
]
},
@@ -10980,7 +11028,7 @@ const docTemplate = `{
}
}
},
- "types.JoinByOrganizationIDRequest": {
+ "github_com_Tencent_WeKnora_internal_types.JoinByOrganizationIDRequest": {
"type": "object",
"required": [
"organization_id"
@@ -10998,13 +11046,13 @@ const docTemplate = `{
"description": "Optional: requested role (admin/editor/viewer); default viewer",
"allOf": [
{
- "$ref": "#/definitions/types.OrgMemberRole"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrgMemberRole"
}
]
}
}
},
- "types.JoinOrganizationRequest": {
+ "github_com_Tencent_WeKnora_internal_types.JoinOrganizationRequest": {
"type": "object",
"required": [
"invite_code"
@@ -11017,7 +11065,7 @@ const docTemplate = `{
}
}
},
- "types.Knowledge": {
+ "github_com_Tencent_WeKnora_internal_types.Knowledge": {
"type": "object",
"properties": {
"channel": {
@@ -11140,14 +11188,14 @@ const docTemplate = `{
}
}
},
- "types.KnowledgeBase": {
+ "github_com_Tencent_WeKnora_internal_types.KnowledgeBase": {
"type": "object",
"properties": {
"asr_config": {
"description": "ASR config (Automatic Speech Recognition)",
"allOf": [
{
- "$ref": "#/definitions/types.ASRConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ASRConfig"
}
]
},
@@ -11159,7 +11207,7 @@ const docTemplate = `{
"description": "Chunking configuration",
"allOf": [
{
- "$ref": "#/definitions/types.ChunkingConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ChunkingConfig"
}
]
},
@@ -11187,7 +11235,7 @@ const docTemplate = `{
"description": "Extract config",
"allOf": [
{
- "$ref": "#/definitions/types.ExtractConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ExtractConfig"
}
]
},
@@ -11195,7 +11243,7 @@ const docTemplate = `{
"description": "FAQConfig stores FAQ specific configuration such as indexing strategy",
"allOf": [
{
- "$ref": "#/definitions/types.FAQConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQConfig"
}
]
},
@@ -11207,7 +11255,15 @@ const docTemplate = `{
"description": "Image processing configuration",
"allOf": [
{
- "$ref": "#/definitions/types.ImageProcessingConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ImageProcessingConfig"
+ }
+ ]
+ },
+ "indexing_strategy": {
+ "description": "IndexingStrategy controls which indexing pipelines are active for this knowledge base.\nPipelines: vector search, keyword search, wiki generation, knowledge graph extraction.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.IndexingStrategy"
}
]
},
@@ -11243,7 +11299,7 @@ const docTemplate = `{
"description": "QuestionGenerationConfig stores question generation configuration for document knowledge bases",
"allOf": [
{
- "$ref": "#/definitions/types.QuestionGenerationConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.QuestionGenerationConfig"
}
]
},
@@ -11255,7 +11311,7 @@ const docTemplate = `{
"description": "Deprecated: legacy COS config column. Kept for backward compatibility with old data.",
"allOf": [
{
- "$ref": "#/definitions/types.StorageConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.StorageConfig"
}
]
},
@@ -11263,7 +11319,7 @@ const docTemplate = `{
"description": "Storage provider config (new): only stores provider selection; credentials from tenant StorageEngineConfig",
"allOf": [
{
- "$ref": "#/definitions/types.StorageProviderConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.StorageProviderConfig"
}
]
},
@@ -11283,24 +11339,36 @@ const docTemplate = `{
"description": "Last updated time of the knowledge base",
"type": "string"
},
+ "vector_store_id": {
+ "description": "VectorStoreID references the VectorStore this knowledge base is bound to.\nWhen nil, the KB falls back to the tenant's effective engines derived from\nthe RETRIEVE_DRIVER environment variable (env store flow).\nThis field is set once at creation time and must not be modified afterwards;\nenforcement lives at the GORM layer (` + "`" + `\u003c-:create` + "`" + `) plus the service-layer\nKB update path, which omits this field from its update DTO.",
+ "type": "string"
+ },
"vlm_config": {
"description": "VLM config",
"allOf": [
{
- "$ref": "#/definitions/types.VLMConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.VLMConfig"
+ }
+ ]
+ },
+ "wiki_config": {
+ "description": "WikiConfig stores wiki-specific configuration (only for wiki type knowledge bases)",
+ "allOf": [
+ {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiConfig"
}
]
}
}
},
- "types.KnowledgeBaseConfig": {
+ "github_com_Tencent_WeKnora_internal_types.KnowledgeBaseConfig": {
"type": "object",
"properties": {
"chunking_config": {
"description": "Chunking configuration",
"allOf": [
{
- "$ref": "#/definitions/types.ChunkingConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ChunkingConfig"
}
]
},
@@ -11308,7 +11376,7 @@ const docTemplate = `{
"description": "FAQ configuration (only for FAQ type knowledge bases)",
"allOf": [
{
- "$ref": "#/definitions/types.FAQConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.FAQConfig"
}
]
},
@@ -11316,13 +11384,29 @@ const docTemplate = `{
"description": "Image processing configuration",
"allOf": [
{
- "$ref": "#/definitions/types.ImageProcessingConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ImageProcessingConfig"
+ }
+ ]
+ },
+ "indexing_strategy": {
+ "description": "IndexingStrategy controls which indexing pipelines are active.\nnil means \"no change\" when updating (preserves existing strategy).",
+ "allOf": [
+ {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.IndexingStrategy"
+ }
+ ]
+ },
+ "wiki_config": {
+ "description": "Wiki configuration (only for wiki-enabled knowledge bases)",
+ "allOf": [
+ {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiConfig"
}
]
}
}
},
- "types.KnowledgeBaseShareResponse": {
+ "github_com_Tencent_WeKnora_internal_types.KnowledgeBaseShareResponse": {
"type": "object",
"properties": {
"chunk_count": {
@@ -11378,13 +11462,13 @@ const docTemplate = `{
}
}
},
- "types.ListMembersResponse": {
+ "github_com_Tencent_WeKnora_internal_types.ListMembersResponse": {
"type": "object",
"properties": {
"members": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.OrganizationMemberResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrganizationMemberResponse"
}
},
"total": {
@@ -11392,20 +11476,20 @@ const docTemplate = `{
}
}
},
- "types.ListOrganizationsResponse": {
+ "github_com_Tencent_WeKnora_internal_types.ListOrganizationsResponse": {
"type": "object",
"properties": {
"organizations": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.OrganizationResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrganizationResponse"
}
},
"resource_counts": {
"description": "各空间内知识库/智能体数量,供列表侧栏展示",
"allOf": [
{
- "$ref": "#/definitions/types.ResourceCountsByOrgResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ResourceCountsByOrgResponse"
}
]
},
@@ -11414,13 +11498,13 @@ const docTemplate = `{
}
}
},
- "types.ListSharesResponse": {
+ "github_com_Tencent_WeKnora_internal_types.ListSharesResponse": {
"type": "object",
"properties": {
"shares": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.KnowledgeBaseShareResponse"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.KnowledgeBaseShareResponse"
}
},
"total": {
@@ -11428,7 +11512,7 @@ const docTemplate = `{
}
}
},
- "types.LocalEngineConfig": {
+ "github_com_Tencent_WeKnora_internal_types.LocalEngineConfig": {
"type": "object",
"properties": {
"path_prefix": {
@@ -11436,7 +11520,7 @@ const docTemplate = `{
}
}
},
- "types.LoginRequest": {
+ "github_com_Tencent_WeKnora_internal_types.LoginRequest": {
"type": "object",
"required": [
"email",
@@ -11452,7 +11536,7 @@ const docTemplate = `{
}
}
},
- "types.LoginResponse": {
+ "github_com_Tencent_WeKnora_internal_types.LoginResponse": {
"type": "object",
"properties": {
"message": {
@@ -11465,17 +11549,17 @@ const docTemplate = `{
"type": "boolean"
},
"tenant": {
- "$ref": "#/definitions/types.Tenant"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Tenant"
},
"token": {
"type": "string"
},
"user": {
- "$ref": "#/definitions/types.User"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.User"
}
}
},
- "types.MCPAdvancedConfig": {
+ "github_com_Tencent_WeKnora_internal_types.MCPAdvancedConfig": {
"type": "object",
"properties": {
"retry_count": {
@@ -11492,7 +11576,7 @@ const docTemplate = `{
}
}
},
- "types.MCPAuthConfig": {
+ "github_com_Tencent_WeKnora_internal_types.MCPAuthConfig": {
"type": "object",
"properties": {
"api_key": {
@@ -11509,26 +11593,26 @@ const docTemplate = `{
}
}
},
- "types.MCPEnvVars": {
+ "github_com_Tencent_WeKnora_internal_types.MCPEnvVars": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
- "types.MCPHeaders": {
+ "github_com_Tencent_WeKnora_internal_types.MCPHeaders": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
- "types.MCPService": {
+ "github_com_Tencent_WeKnora_internal_types.MCPService": {
"type": "object",
"properties": {
"advanced_config": {
- "$ref": "#/definitions/types.MCPAdvancedConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MCPAdvancedConfig"
},
"auth_config": {
- "$ref": "#/definitions/types.MCPAuthConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MCPAuthConfig"
},
"created_at": {
"type": "string"
@@ -11546,12 +11630,12 @@ const docTemplate = `{
"description": "Environment variables for stdio",
"allOf": [
{
- "$ref": "#/definitions/types.MCPEnvVars"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MCPEnvVars"
}
]
},
"headers": {
- "$ref": "#/definitions/types.MCPHeaders"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MCPHeaders"
},
"id": {
"type": "string"
@@ -11567,7 +11651,7 @@ const docTemplate = `{
"description": "Required for stdio transport",
"allOf": [
{
- "$ref": "#/definitions/types.MCPStdioConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MCPStdioConfig"
}
]
},
@@ -11575,7 +11659,7 @@ const docTemplate = `{
"type": "integer"
},
"transport_type": {
- "$ref": "#/definitions/types.MCPTransportType"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MCPTransportType"
},
"updated_at": {
"type": "string"
@@ -11586,7 +11670,7 @@ const docTemplate = `{
}
}
},
- "types.MCPStdioConfig": {
+ "github_com_Tencent_WeKnora_internal_types.MCPStdioConfig": {
"type": "object",
"properties": {
"args": {
@@ -11602,7 +11686,7 @@ const docTemplate = `{
}
}
},
- "types.MCPTransportType": {
+ "github_com_Tencent_WeKnora_internal_types.MCPTransportType": {
"type": "string",
"enum": [
"sse",
@@ -11625,7 +11709,7 @@ const docTemplate = `{
"MCPTransportStdio"
]
},
- "types.ManualKnowledgePayload": {
+ "github_com_Tencent_WeKnora_internal_types.ManualKnowledgePayload": {
"type": "object",
"properties": {
"channel": {
@@ -11645,7 +11729,7 @@ const docTemplate = `{
}
}
},
- "types.MatchType": {
+ "github_com_Tencent_WeKnora_internal_types.MatchType": {
"type": "integer",
"enum": [
0,
@@ -11691,7 +11775,7 @@ const docTemplate = `{
"MatchTypeDataAnalysis"
]
},
- "types.MentionedItem": {
+ "github_com_Tencent_WeKnora_internal_types.MentionedItem": {
"type": "object",
"properties": {
"id": {
@@ -11710,7 +11794,7 @@ const docTemplate = `{
}
}
},
- "types.Message": {
+ "github_com_Tencent_WeKnora_internal_types.Message": {
"type": "object",
"properties": {
"agent_duration_ms": {
@@ -11721,14 +11805,14 @@ const docTemplate = `{
"description": "Agent execution steps (only for assistant messages generated by agent)\nThis contains the detailed reasoning process and tool calls made by the agent\nStored for user history display, but NOT included in LLM context to avoid redundancy",
"type": "array",
"items": {
- "$ref": "#/definitions/types.AgentStep"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.AgentStep"
}
},
"attachments": {
"description": "Attached files (documents, audio, etc., for user messages)",
"type": "array",
"items": {
- "$ref": "#/definitions/types.MessageAttachment"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MessageAttachment"
}
},
"channel": {
@@ -11759,7 +11843,7 @@ const docTemplate = `{
"description": "Attached images with OCR/Caption text (for user messages)",
"type": "array",
"items": {
- "$ref": "#/definitions/types.MessageImage"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MessageImage"
}
},
"is_completed": {
@@ -11778,14 +11862,14 @@ const docTemplate = `{
"description": "References to knowledge chunks used in the response",
"type": "array",
"items": {
- "$ref": "#/definitions/types.SearchResult"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.SearchResult"
}
},
"mentioned_items": {
"description": "Mentioned knowledge bases and files (for user messages)\nStores the @mentioned items when user sends a message",
"type": "array",
"items": {
- "$ref": "#/definitions/types.MentionedItem"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MentionedItem"
}
},
"request_id": {
@@ -11806,7 +11890,7 @@ const docTemplate = `{
}
}
},
- "types.MessageAttachment": {
+ "github_com_Tencent_WeKnora_internal_types.MessageAttachment": {
"type": "object",
"properties": {
"content": {
@@ -11839,7 +11923,7 @@ const docTemplate = `{
}
}
},
- "types.MessageImage": {
+ "github_com_Tencent_WeKnora_internal_types.MessageImage": {
"type": "object",
"properties": {
"caption": {
@@ -11850,7 +11934,7 @@ const docTemplate = `{
}
}
},
- "types.MinIOEngineConfig": {
+ "github_com_Tencent_WeKnora_internal_types.MinIOEngineConfig": {
"type": "object",
"properties": {
"access_key_id": {
@@ -11877,7 +11961,7 @@ const docTemplate = `{
}
}
},
- "types.ModelParameters": {
+ "github_com_Tencent_WeKnora_internal_types.ModelParameters": {
"type": "object",
"properties": {
"api_key": {
@@ -11894,8 +11978,15 @@ const docTemplate = `{
"base_url": {
"type": "string"
},
+ "custom_headers": {
+ "description": "CustomHeaders 允许在调用远程模型 API 时附加自定义 HTTP 请求头,\n用途类似 Python OpenAI SDK 的 extra_headers 参数,\n常见场景包括透传企业网关鉴权信息、追踪 ID、路由标识等。\n保留字段(Authorization、api-key、Content-Type、Accept 等)会在运行期被忽略以避免破坏签名/鉴权流程。",
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
"embedding_parameters": {
- "$ref": "#/definitions/types.EmbeddingParameters"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.EmbeddingParameters"
},
"extra_config": {
"description": "Provider-specific configuration",
@@ -11921,7 +12012,7 @@ const docTemplate = `{
}
}
},
- "types.ModelSource": {
+ "github_com_Tencent_WeKnora_internal_types.ModelSource": {
"type": "string",
"enum": [
"local",
@@ -12000,7 +12091,7 @@ const docTemplate = `{
"ModelSourceAzureOpenAI"
]
},
- "types.ModelType": {
+ "github_com_Tencent_WeKnora_internal_types.ModelType": {
"type": "string",
"enum": [
"Embedding",
@@ -12031,7 +12122,7 @@ const docTemplate = `{
"ModelTypeASR"
]
},
- "types.OIDCAuthURLResponse": {
+ "github_com_Tencent_WeKnora_internal_types.OIDCAuthURLResponse": {
"type": "object",
"properties": {
"authorization_url": {
@@ -12048,7 +12139,7 @@ const docTemplate = `{
}
}
},
- "types.OIDCConfigResponse": {
+ "github_com_Tencent_WeKnora_internal_types.OIDCConfigResponse": {
"type": "object",
"properties": {
"enabled": {
@@ -12062,7 +12153,7 @@ const docTemplate = `{
}
}
},
- "types.OSSEngineConfig": {
+ "github_com_Tencent_WeKnora_internal_types.OSSEngineConfig": {
"type": "object",
"properties": {
"access_key": {
@@ -12094,7 +12185,7 @@ const docTemplate = `{
}
}
},
- "types.OrgMemberRole": {
+ "github_com_Tencent_WeKnora_internal_types.OrgMemberRole": {
"type": "string",
"enum": [
"admin",
@@ -12107,7 +12198,7 @@ const docTemplate = `{
"OrgRoleViewer"
]
},
- "types.OrganizationMemberResponse": {
+ "github_com_Tencent_WeKnora_internal_types.OrganizationMemberResponse": {
"type": "object",
"properties": {
"avatar": {
@@ -12136,7 +12227,7 @@ const docTemplate = `{
}
}
},
- "types.OrganizationResponse": {
+ "github_com_Tencent_WeKnora_internal_types.OrganizationResponse": {
"type": "object",
"properties": {
"agent_share_count": {
@@ -12206,7 +12297,7 @@ const docTemplate = `{
}
}
},
- "types.ParserEngineConfig": {
+ "github_com_Tencent_WeKnora_internal_types.ParserEngineConfig": {
"type": "object",
"properties": {
"mineru_api_key": {
@@ -12251,7 +12342,7 @@ const docTemplate = `{
}
}
},
- "types.ParserEngineRule": {
+ "github_com_Tencent_WeKnora_internal_types.ParserEngineRule": {
"type": "object",
"properties": {
"engine": {
@@ -12265,7 +12356,7 @@ const docTemplate = `{
}
}
},
- "types.QuestionGenerationConfig": {
+ "github_com_Tencent_WeKnora_internal_types.QuestionGenerationConfig": {
"type": "object",
"properties": {
"enabled": {
@@ -12277,7 +12368,7 @@ const docTemplate = `{
}
}
},
- "types.RegisterRequest": {
+ "github_com_Tencent_WeKnora_internal_types.RegisterRequest": {
"type": "object",
"required": [
"email",
@@ -12299,7 +12390,7 @@ const docTemplate = `{
}
}
},
- "types.RegisterResponse": {
+ "github_com_Tencent_WeKnora_internal_types.RegisterResponse": {
"type": "object",
"properties": {
"message": {
@@ -12309,14 +12400,14 @@ const docTemplate = `{
"type": "boolean"
},
"tenant": {
- "$ref": "#/definitions/types.Tenant"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Tenant"
},
"user": {
- "$ref": "#/definitions/types.User"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.User"
}
}
},
- "types.RequestRoleUpgradeRequest": {
+ "github_com_Tencent_WeKnora_internal_types.RequestRoleUpgradeRequest": {
"type": "object",
"required": [
"requested_role"
@@ -12331,13 +12422,13 @@ const docTemplate = `{
"description": "The role user wants to upgrade to",
"allOf": [
{
- "$ref": "#/definitions/types.OrgMemberRole"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrgMemberRole"
}
]
}
}
},
- "types.Resource": {
+ "github_com_Tencent_WeKnora_internal_types.Resource": {
"type": "object",
"properties": {
"description": {
@@ -12379,7 +12470,7 @@ const docTemplate = `{
}
}
},
- "types.ResourceCountsByOrgResponse": {
+ "github_com_Tencent_WeKnora_internal_types.ResourceCountsByOrgResponse": {
"type": "object",
"properties": {
"agents": {
@@ -12406,7 +12497,7 @@ const docTemplate = `{
}
}
},
- "types.RetrievalConfig": {
+ "github_com_Tencent_WeKnora_internal_types.RetrievalConfig": {
"type": "object",
"properties": {
"embedding_top_k": {
@@ -12435,14 +12526,14 @@ const docTemplate = `{
}
}
},
- "types.RetrieverEngineParams": {
+ "github_com_Tencent_WeKnora_internal_types.RetrieverEngineParams": {
"type": "object",
"properties": {
"retriever_engine_type": {
"description": "Retriever engine type",
"allOf": [
{
- "$ref": "#/definitions/types.RetrieverEngineType"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RetrieverEngineType"
}
]
},
@@ -12450,13 +12541,13 @@ const docTemplate = `{
"description": "Retriever type",
"allOf": [
{
- "$ref": "#/definitions/types.RetrieverType"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RetrieverType"
}
]
}
}
},
- "types.RetrieverEngineType": {
+ "github_com_Tencent_WeKnora_internal_types.RetrieverEngineType": {
"type": "string",
"enum": [
"postgres",
@@ -12479,18 +12570,18 @@ const docTemplate = `{
"SQLiteRetrieverEngineType"
]
},
- "types.RetrieverEngines": {
+ "github_com_Tencent_WeKnora_internal_types.RetrieverEngines": {
"type": "object",
"properties": {
"engines": {
"type": "array",
"items": {
- "$ref": "#/definitions/types.RetrieverEngineParams"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RetrieverEngineParams"
}
}
}
},
- "types.RetrieverType": {
+ "github_com_Tencent_WeKnora_internal_types.RetrieverType": {
"type": "string",
"enum": [
"keywords",
@@ -12513,7 +12604,7 @@ const docTemplate = `{
"WebSearchRetrieverType"
]
},
- "types.ReviewJoinRequestRequest": {
+ "github_com_Tencent_WeKnora_internal_types.ReviewJoinRequestRequest": {
"type": "object",
"properties": {
"approved": {
@@ -12527,13 +12618,13 @@ const docTemplate = `{
"description": "Optional: role to assign when approving; overrides applicant's requested role",
"allOf": [
{
- "$ref": "#/definitions/types.OrgMemberRole"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrgMemberRole"
}
]
}
}
},
- "types.S3EngineConfig": {
+ "github_com_Tencent_WeKnora_internal_types.S3EngineConfig": {
"type": "object",
"properties": {
"access_key": {
@@ -12556,7 +12647,7 @@ const docTemplate = `{
}
}
},
- "types.SearchParams": {
+ "github_com_Tencent_WeKnora_internal_types.SearchParams": {
"type": "object",
"properties": {
"disable_keywords_match": {
@@ -12612,7 +12703,7 @@ const docTemplate = `{
}
}
},
- "types.SearchResult": {
+ "github_com_Tencent_WeKnora_internal_types.SearchResult": {
"type": "object",
"properties": {
"chunk_index": {
@@ -12678,7 +12769,7 @@ const docTemplate = `{
"description": "Match type",
"allOf": [
{
- "$ref": "#/definitions/types.MatchType"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MatchType"
}
]
},
@@ -12718,7 +12809,7 @@ const docTemplate = `{
}
}
},
- "types.Session": {
+ "github_com_Tencent_WeKnora_internal_types.Session": {
"type": "object",
"properties": {
"created_at": {
@@ -12748,7 +12839,7 @@ const docTemplate = `{
}
}
},
- "types.ShareKnowledgeBaseRequest": {
+ "github_com_Tencent_WeKnora_internal_types.ShareKnowledgeBaseRequest": {
"type": "object",
"required": [
"organization_id",
@@ -12759,11 +12850,11 @@ const docTemplate = `{
"type": "string"
},
"permission": {
- "$ref": "#/definitions/types.OrgMemberRole"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrgMemberRole"
}
}
},
- "types.StorageConfig": {
+ "github_com_Tencent_WeKnora_internal_types.StorageConfig": {
"type": "object",
"properties": {
"app_id": {
@@ -12789,34 +12880,34 @@ const docTemplate = `{
}
}
},
- "types.StorageEngineConfig": {
+ "github_com_Tencent_WeKnora_internal_types.StorageEngineConfig": {
"type": "object",
"properties": {
"cos": {
- "$ref": "#/definitions/types.COSEngineConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.COSEngineConfig"
},
"default_provider": {
"description": "\"local\", \"minio\", \"cos\", \"tos\", \"s3\", \"oss\"",
"type": "string"
},
"local": {
- "$ref": "#/definitions/types.LocalEngineConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.LocalEngineConfig"
},
"minio": {
- "$ref": "#/definitions/types.MinIOEngineConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MinIOEngineConfig"
},
"oss": {
- "$ref": "#/definitions/types.OSSEngineConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OSSEngineConfig"
},
"s3": {
- "$ref": "#/definitions/types.S3EngineConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.S3EngineConfig"
},
"tos": {
- "$ref": "#/definitions/types.TOSEngineConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.TOSEngineConfig"
}
}
},
- "types.StorageProviderConfig": {
+ "github_com_Tencent_WeKnora_internal_types.StorageProviderConfig": {
"type": "object",
"properties": {
"provider": {
@@ -12825,7 +12916,7 @@ const docTemplate = `{
}
}
},
- "types.SubmitJoinRequestRequest": {
+ "github_com_Tencent_WeKnora_internal_types.SubmitJoinRequestRequest": {
"type": "object",
"required": [
"invite_code"
@@ -12844,13 +12935,13 @@ const docTemplate = `{
"description": "Optional: role the applicant requests (admin/editor/viewer); default viewer",
"allOf": [
{
- "$ref": "#/definitions/types.OrgMemberRole"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrgMemberRole"
}
]
}
}
},
- "types.SyncLog": {
+ "github_com_Tencent_WeKnora_internal_types.SyncLog": {
"type": "object",
"properties": {
"created_at": {
@@ -12922,7 +13013,7 @@ const docTemplate = `{
}
}
},
- "types.TOSEngineConfig": {
+ "github_com_Tencent_WeKnora_internal_types.TOSEngineConfig": {
"type": "object",
"properties": {
"access_key": {
@@ -12945,14 +13036,14 @@ const docTemplate = `{
}
}
},
- "types.Tenant": {
+ "github_com_Tencent_WeKnora_internal_types.Tenant": {
"type": "object",
"properties": {
"agent_config": {
"description": "Deprecated: AgentConfig is deprecated, use CustomAgent (builtin-smart-reasoning) config instead.\nThis field is kept for backward compatibility and will be removed in future versions.",
"allOf": [
{
- "$ref": "#/definitions/types.AgentConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.AgentConfig"
}
]
},
@@ -12968,7 +13059,7 @@ const docTemplate = `{
"description": "Chat history config: knowledge base configuration for indexing and searching chat messages via vector search",
"allOf": [
{
- "$ref": "#/definitions/types.ChatHistoryConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ChatHistoryConfig"
}
]
},
@@ -12976,7 +13067,7 @@ const docTemplate = `{
"description": "Global Context configuration for this tenant (default for all sessions)",
"allOf": [
{
- "$ref": "#/definitions/types.ContextConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ContextConfig"
}
]
},
@@ -12984,7 +13075,7 @@ const docTemplate = `{
"description": "Deprecated: ConversationConfig is deprecated, use CustomAgent (builtin-quick-answer) config instead.\nThis field is kept for backward compatibility and will be removed in future versions.",
"allOf": [
{
- "$ref": "#/definitions/types.ConversationConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ConversationConfig"
}
]
},
@@ -12996,7 +13087,7 @@ const docTemplate = `{
"description": "Credentials config: third-party provider credentials (e.g. WeKnoraCloud AppID/AppSecret)",
"allOf": [
{
- "$ref": "#/definitions/types.CredentialsConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.CredentialsConfig"
}
]
},
@@ -13024,7 +13115,7 @@ const docTemplate = `{
"description": "Parser engine config overrides (MinerU endpoint, API key, etc.). Used when parsing documents; overrides env.",
"allOf": [
{
- "$ref": "#/definitions/types.ParserEngineConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ParserEngineConfig"
}
]
},
@@ -13032,7 +13123,7 @@ const docTemplate = `{
"description": "Retrieval config: global search/retrieval parameters shared by knowledge search and message search",
"allOf": [
{
- "$ref": "#/definitions/types.RetrievalConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RetrievalConfig"
}
]
},
@@ -13040,7 +13131,7 @@ const docTemplate = `{
"description": "Retriever engines",
"allOf": [
{
- "$ref": "#/definitions/types.RetrieverEngines"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RetrieverEngines"
}
]
},
@@ -13052,7 +13143,7 @@ const docTemplate = `{
"description": "Storage engine config: parameters for Local, MinIO, COS. Used for document/file storage and docreader.",
"allOf": [
{
- "$ref": "#/definitions/types.StorageEngineConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.StorageEngineConfig"
}
]
},
@@ -13072,13 +13163,13 @@ const docTemplate = `{
"description": "Global WebSearch configuration for this tenant",
"allOf": [
{
- "$ref": "#/definitions/types.WebSearchConfig"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WebSearchConfig"
}
]
}
}
},
- "types.ToolCall": {
+ "github_com_Tencent_WeKnora_internal_types.ToolCall": {
"type": "object",
"properties": {
"args": {
@@ -13106,13 +13197,13 @@ const docTemplate = `{
"description": "Execution result (contains Output)",
"allOf": [
{
- "$ref": "#/definitions/types.ToolResult"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ToolResult"
}
]
}
}
},
- "types.ToolResult": {
+ "github_com_Tencent_WeKnora_internal_types.ToolResult": {
"type": "object",
"properties": {
"data": {
@@ -13141,18 +13232,18 @@ const docTemplate = `{
}
}
},
- "types.UpdateMemberRoleRequest": {
+ "github_com_Tencent_WeKnora_internal_types.UpdateMemberRoleRequest": {
"type": "object",
"required": [
"role"
],
"properties": {
"role": {
- "$ref": "#/definitions/types.OrgMemberRole"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrgMemberRole"
}
}
},
- "types.UpdateOrganizationRequest": {
+ "github_com_Tencent_WeKnora_internal_types.UpdateOrganizationRequest": {
"type": "object",
"properties": {
"avatar": {
@@ -13186,18 +13277,18 @@ const docTemplate = `{
}
}
},
- "types.UpdateSharePermissionRequest": {
+ "github_com_Tencent_WeKnora_internal_types.UpdateSharePermissionRequest": {
"type": "object",
"required": [
"permission"
],
"properties": {
"permission": {
- "$ref": "#/definitions/types.OrgMemberRole"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OrgMemberRole"
}
}
},
- "types.User": {
+ "github_com_Tencent_WeKnora_internal_types.User": {
"type": "object",
"properties": {
"avatar": {
@@ -13236,7 +13327,7 @@ const docTemplate = `{
"description": "Association relationship, not stored in the database",
"allOf": [
{
- "$ref": "#/definitions/types.Tenant"
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Tenant"
}
]
},
@@ -13254,7 +13345,7 @@ const docTemplate = `{
}
}
},
- "types.VLMConfig": {
+ "github_com_Tencent_WeKnora_internal_types.VLMConfig": {
"type": "object",
"properties": {
"api_key": {
@@ -13281,7 +13372,7 @@ const docTemplate = `{
}
}
},
- "types.WeKnoraCloudCredentials": {
+ "github_com_Tencent_WeKnora_internal_types.WeKnoraCloudCredentials": {
"type": "object",
"properties": {
"app_id": {
@@ -13292,7 +13383,7 @@ const docTemplate = `{
}
}
},
- "types.WebSearchConfig": {
+ "github_com_Tencent_WeKnora_internal_types.WebSearchConfig": {
"type": "object",
"properties": {
"api_key": {
@@ -13334,11 +13425,1109 @@ const docTemplate = `{
"description": "Deprecated: Use WebSearchProviderEntity.Parameters.APIKey instead.",
"type": "string"
},
+ "proxy_url": {
+ "description": "Optional per-request proxy override; normally empty — use WebSearchProviderEntity.Parameters.proxy_url. Merged at call time when set.",
+ "type": "string"
+ },
"rerank_model_id": {
"description": "重排模型ID(用于RAG压缩)",
"type": "string"
}
}
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiConfig": {
+ "type": "object",
+ "properties": {
+ "extraction_granularity": {
+ "description": "ExtractionGranularity controls how many candidate slugs Pass 0 extracts\nper document. Empty / unknown value is treated as WikiExtractionStandard.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiExtractionGranularity"
+ }
+ ]
+ },
+ "max_pages_per_ingest": {
+ "description": "MaxPagesPerIngest limits pages created/updated per ingest operation (0 = no limit)",
+ "type": "integer"
+ },
+ "synthesis_model_id": {
+ "description": "SynthesisModelID is the LLM model ID used for wiki page generation and updates",
+ "type": "string"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiExtractionGranularity": {
+ "type": "string",
+ "enum": [
+ "focused",
+ "standard",
+ "exhaustive"
+ ],
+ "x-enum-varnames": [
+ "WikiExtractionFocused",
+ "WikiExtractionStandard",
+ "WikiExtractionExhaustive"
+ ]
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiGraphData": {
+ "type": "object",
+ "properties": {
+ "edges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiGraphEdge"
+ }
+ },
+ "nodes": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiGraphNode"
+ }
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiGraphEdge": {
+ "type": "object",
+ "properties": {
+ "source": {
+ "description": "source slug",
+ "type": "string"
+ },
+ "target": {
+ "description": "target slug",
+ "type": "string"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiGraphNode": {
+ "type": "object",
+ "properties": {
+ "link_count": {
+ "description": "Number of inbound + outbound links",
+ "type": "integer"
+ },
+ "page_type": {
+ "type": "string"
+ },
+ "slug": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiPage": {
+ "type": "object",
+ "properties": {
+ "aliases": {
+ "description": "Alternate names, abbreviations, acronyms or translated names",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "chunk_refs": {
+ "description": "ChunkRefs records the specific source-document chunks this page was\nbuilt from — one UUID per cited chunk. Populated during ingest from\nthe chunk-citation pass; refreshed wholesale whenever the page is\nre-materialized. Empty for summary pages (they are document-level\nsynopses and don't carry chunk-level citations). Use this when you\nneed to surface the underlying evidence for a wiki page, or to\nretract citations when a source document is deleted.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "content": {
+ "description": "Full markdown content",
+ "type": "string"
+ },
+ "created_at": {
+ "description": "Creation time",
+ "type": "string"
+ },
+ "deleted_at": {
+ "description": "Soft delete",
+ "allOf": [
+ {
+ "$ref": "#/definitions/gorm.DeletedAt"
+ }
+ ]
+ },
+ "id": {
+ "description": "Unique identifier (UUID)",
+ "type": "string"
+ },
+ "in_links": {
+ "description": "Slugs of pages that link TO this page (backlinks)",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "knowledge_base_id": {
+ "description": "Knowledge base this page belongs to",
+ "type": "string"
+ },
+ "out_links": {
+ "description": "Slugs of pages this page links to (outbound links)",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "page_metadata": {
+ "description": "Arbitrary metadata (tags, categories, dates, etc.)",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "page_type": {
+ "description": "Page type: summary, entity, concept, index, log, synthesis, comparison",
+ "type": "string"
+ },
+ "slug": {
+ "description": "URL-friendly slug for addressing, e.g. \"entity/acme-corp\", \"concept/rag\"\nUnique within a knowledge base",
+ "type": "string"
+ },
+ "source_refs": {
+ "description": "References to source knowledge IDs that contributed to this page.\nFormat matches the legacy \"\u003cknowledge_id\u003e|\u003cdoc_title\u003e\" convention used\nacross the ingest pipeline, so retract / display code can split on ` + "`" + `|` + "`" + `\nto recover the title. Document-level granularity.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "status": {
+ "description": "Page status: draft, published, archived",
+ "type": "string"
+ },
+ "summary": {
+ "description": "One-line summary for index listing",
+ "type": "string"
+ },
+ "tenant_id": {
+ "description": "Tenant ID for multi-tenant isolation",
+ "type": "integer"
+ },
+ "title": {
+ "description": "Human-readable title",
+ "type": "string"
+ },
+ "updated_at": {
+ "description": "Last update time",
+ "type": "string"
+ },
+ "version": {
+ "description": "Version number. Incremented only when a user-visible content field\n(title, content, summary, page_type, status) actually changes; pure\nbookkeeping writes (link maintenance, same-content re-ingest, status\nsync from background jobs) leave it untouched so it can be used as a\nreal \"the page was edited\" signal.",
+ "type": "integer"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiPageIssue": {
+ "type": "object",
+ "properties": {
+ "created_at": {
+ "type": "string"
+ },
+ "deleted_at": {
+ "$ref": "#/definitions/gorm.DeletedAt"
+ },
+ "description": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "issue_type": {
+ "type": "string"
+ },
+ "knowledge_base_id": {
+ "type": "string"
+ },
+ "reported_by": {
+ "type": "string"
+ },
+ "slug": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "suspected_knowledge_ids": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "tenant_id": {
+ "type": "integer"
+ },
+ "updated_at": {
+ "type": "string"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiPageListResponse": {
+ "type": "object",
+ "properties": {
+ "page": {
+ "type": "integer"
+ },
+ "page_size": {
+ "type": "integer"
+ },
+ "pages": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ },
+ "total": {
+ "type": "integer"
+ },
+ "total_pages": {
+ "type": "integer"
+ }
+ }
+ },
+ "github_com_Tencent_WeKnora_internal_types.WikiStats": {
+ "type": "object",
+ "properties": {
+ "is_active": {
+ "description": "whether wiki ingestion is currently running",
+ "type": "boolean"
+ },
+ "orphan_count": {
+ "description": "pages with no inbound links",
+ "type": "integer"
+ },
+ "pages_by_type": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int64"
+ }
+ },
+ "pending_issues": {
+ "description": "number of pending wiki issues",
+ "type": "integer"
+ },
+ "pending_tasks": {
+ "description": "number of documents waiting to be ingested",
+ "type": "integer"
+ },
+ "recent_updates": {
+ "description": "last N updated pages",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.WikiPage"
+ }
+ },
+ "total_links": {
+ "type": "integer"
+ },
+ "total_pages": {
+ "type": "integer"
+ }
+ }
+ },
+ "gorm.DeletedAt": {
+ "type": "object",
+ "properties": {
+ "time": {
+ "type": "string"
+ },
+ "valid": {
+ "description": "Valid is true if Time is not NULL",
+ "type": "boolean"
+ }
+ }
+ },
+ "internal_handler.CopyKnowledgeBaseRequest": {
+ "type": "object",
+ "required": [
+ "source_id"
+ ],
+ "properties": {
+ "source_id": {
+ "type": "string"
+ },
+ "target_id": {
+ "type": "string"
+ },
+ "task_id": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.CreateAgentRequest": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "avatar": {
+ "type": "string"
+ },
+ "config": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.CustomAgentConfig"
+ },
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.CreateModelRequest": {
+ "type": "object",
+ "required": [
+ "name",
+ "parameters",
+ "source",
+ "type"
+ ],
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "parameters": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ModelParameters"
+ },
+ "source": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ModelSource"
+ },
+ "type": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ModelType"
+ }
+ }
+ },
+ "internal_handler.CreateStoreRequest": {
+ "type": "object",
+ "required": [
+ "connection_config",
+ "engine_type",
+ "name"
+ ],
+ "properties": {
+ "connection_config": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ConnectionConfig"
+ },
+ "engine_type": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RetrieverEngineType"
+ },
+ "index_config": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.IndexConfig"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.DeleteTagRequest": {
+ "type": "object",
+ "properties": {
+ "exclude_ids": {
+ "description": "Chunk seq_ids to exclude from deletion",
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "internal_handler.EvaluationRequest": {
+ "type": "object",
+ "properties": {
+ "chat_id": {
+ "description": "ID of chat model to use",
+ "type": "string"
+ },
+ "dataset_id": {
+ "description": "ID of dataset to evaluate",
+ "type": "string"
+ },
+ "knowledge_base_id": {
+ "description": "ID of knowledge base to use",
+ "type": "string"
+ },
+ "rerank_id": {
+ "description": "ID of rerank model to use",
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.FabriTextRequest": {
+ "type": "object",
+ "required": [
+ "model_id"
+ ],
+ "properties": {
+ "model_id": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "internal_handler.GetStorageEngineStatusResponse": {
+ "type": "object",
+ "properties": {
+ "engines": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/internal_handler.StorageEngineStatusItem"
+ }
+ },
+ "minio_env_available": {
+ "type": "boolean"
+ }
+ }
+ },
+ "internal_handler.GetSystemInfoResponse": {
+ "type": "object",
+ "properties": {
+ "build_time": {
+ "type": "string"
+ },
+ "commit_id": {
+ "type": "string"
+ },
+ "db_version": {
+ "type": "string"
+ },
+ "edition": {
+ "type": "string"
+ },
+ "go_version": {
+ "type": "string"
+ },
+ "graph_database_engine": {
+ "type": "string"
+ },
+ "keyword_index_engine": {
+ "type": "string"
+ },
+ "minio_enabled": {
+ "type": "boolean"
+ },
+ "vector_store_engine": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.KBModelConfigRequest": {
+ "type": "object",
+ "required": [
+ "llmModelId"
+ ],
+ "properties": {
+ "asr_config": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ASRConfig"
+ },
+ "documentSplitting": {
+ "description": "文档分块配置",
+ "type": "object",
+ "properties": {
+ "childChunkSize": {
+ "type": "integer"
+ },
+ "chunkOverlap": {
+ "type": "integer"
+ },
+ "chunkSize": {
+ "type": "integer"
+ },
+ "enableParentChild": {
+ "type": "boolean"
+ },
+ "parentChunkSize": {
+ "type": "integer"
+ },
+ "parserEngineRules": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ParserEngineRule"
+ }
+ },
+ "separators": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "embeddingModelId": {
+ "description": "optional when RAG indexing is disabled",
+ "type": "string"
+ },
+ "llmModelId": {
+ "type": "string"
+ },
+ "multimodal": {
+ "description": "多模态配置(仅模型相关;存储引擎在 storageProvider 中配置)",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ }
+ }
+ },
+ "nodeExtract": {
+ "description": "知识图谱配置",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ },
+ "nodes": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.GraphNode"
+ }
+ },
+ "relations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.GraphRelation"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "text": {
+ "type": "string"
+ }
+ }
+ },
+ "questionGeneration": {
+ "description": "问题生成配置",
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ },
+ "questionCount": {
+ "type": "integer"
+ }
+ }
+ },
+ "storageProvider": {
+ "description": "存储引擎选择(\"local\" | \"minio\" | \"cos\"),影响文档上传与文档内图片存储,参数从全局设置读取",
+ "type": "string"
+ },
+ "vlm_config": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.VLMConfig"
+ }
+ }
+ },
+ "internal_handler.RemoteModelCheckRequest": {
+ "type": "object",
+ "required": [
+ "modelName"
+ ],
+ "properties": {
+ "apiKey": {
+ "type": "string"
+ },
+ "baseUrl": {
+ "type": "string"
+ },
+ "customHeaders": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "dimension": {
+ "type": "integer"
+ },
+ "extraConfig": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "interfaceType": {
+ "type": "string"
+ },
+ "modelName": {
+ "type": "string"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "source": {
+ "description": "为空时按需默认为 \"remote\"",
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.SearchMessagesRequest": {
+ "type": "object",
+ "required": [
+ "query"
+ ],
+ "properties": {
+ "limit": {
+ "description": "Maximum number of results to return (default: 20)",
+ "type": "integer"
+ },
+ "mode": {
+ "description": "Search mode: \"keyword\", \"vector\", \"hybrid\" (default: \"hybrid\")",
+ "type": "string"
+ },
+ "query": {
+ "description": "Query text for search",
+ "type": "string"
+ },
+ "session_ids": {
+ "description": "Filter by specific session IDs (optional)",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "internal_handler.StorageCheckRequest": {
+ "type": "object",
+ "properties": {
+ "cos": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.COSEngineConfig"
+ },
+ "minio": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.MinIOEngineConfig"
+ },
+ "oss": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.OSSEngineConfig"
+ },
+ "provider": {
+ "description": "\"minio\", \"cos\", \"tos\", \"s3\", \"oss\"",
+ "type": "string"
+ },
+ "s3": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.S3EngineConfig"
+ },
+ "tos": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.TOSEngineConfig"
+ }
+ }
+ },
+ "internal_handler.StorageCheckResponse": {
+ "type": "object",
+ "properties": {
+ "bucket_created": {
+ "type": "boolean"
+ },
+ "message": {
+ "type": "string"
+ },
+ "ok": {
+ "type": "boolean"
+ }
+ }
+ },
+ "internal_handler.StorageEngineStatusItem": {
+ "type": "object",
+ "properties": {
+ "available": {
+ "description": "whether the engine can be used",
+ "type": "boolean"
+ },
+ "description": {
+ "description": "short description for UI",
+ "type": "string"
+ },
+ "name": {
+ "description": "\"local\", \"minio\", \"cos\", \"tos\"",
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.TestStoreRequest": {
+ "type": "object",
+ "required": [
+ "connection_config",
+ "engine_type"
+ ],
+ "properties": {
+ "connection_config": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ConnectionConfig"
+ },
+ "engine_type": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.RetrieverEngineType"
+ }
+ }
+ },
+ "internal_handler.TextRelationExtractionRequest": {
+ "type": "object",
+ "required": [
+ "model_id",
+ "tags",
+ "text"
+ ],
+ "properties": {
+ "model_id": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "text": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.UpdateAgentRequest": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "type": "string"
+ },
+ "config": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.CustomAgentConfig"
+ },
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.UpdateChunkRequest": {
+ "type": "object",
+ "properties": {
+ "chunk_index": {
+ "type": "integer"
+ },
+ "content": {
+ "type": "string"
+ },
+ "embedding": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ }
+ },
+ "end_at": {
+ "type": "integer"
+ },
+ "image_info": {
+ "type": "string"
+ },
+ "is_enabled": {
+ "type": "boolean"
+ },
+ "start_at": {
+ "type": "integer"
+ }
+ }
+ },
+ "internal_handler.UpdateKnowledgeBaseRequest": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "config": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.KnowledgeBaseConfig"
+ },
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.UpdateModelRequest": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "parameters": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ModelParameters"
+ },
+ "source": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ModelSource"
+ },
+ "type": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.ModelType"
+ }
+ }
+ },
+ "internal_handler.UpdateStoreRequest": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler.addSimilarQuestionsRequest": {
+ "type": "object",
+ "required": [
+ "similar_questions"
+ ],
+ "properties": {
+ "similar_questions": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "internal_handler.updateLastFAQImportResultDisplayStatusRequest": {
+ "type": "object",
+ "required": [
+ "display_status"
+ ],
+ "properties": {
+ "display_status": {
+ "type": "string",
+ "enum": [
+ "open",
+ "close"
+ ]
+ }
+ }
+ },
+ "internal_handler_session.AttachmentUpload": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "description": "Base64-encoded file content",
+ "type": "string"
+ },
+ "file_name": {
+ "description": "Original filename",
+ "type": "string"
+ },
+ "file_size": {
+ "description": "File size in bytes",
+ "type": "integer"
+ }
+ }
+ },
+ "internal_handler_session.CreateKnowledgeQARequest": {
+ "type": "object",
+ "required": [
+ "query"
+ ],
+ "properties": {
+ "agent_enabled": {
+ "description": "Whether agent mode is enabled for this request",
+ "type": "boolean"
+ },
+ "agent_id": {
+ "description": "Selected custom agent ID (backend resolves shared agent and its tenant from share relation)",
+ "type": "string"
+ },
+ "attachment_uploads": {
+ "description": "Attached files (documents, audio, etc.)",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/internal_handler_session.AttachmentUpload"
+ }
+ },
+ "channel": {
+ "description": "Source channel: \"web\", \"api\", \"im\", etc.",
+ "type": "string"
+ },
+ "disable_title": {
+ "description": "Whether to disable auto title generation",
+ "type": "boolean"
+ },
+ "enable_memory": {
+ "description": "Whether memory feature is enabled for this request",
+ "type": "boolean"
+ },
+ "images": {
+ "description": "Attached images for multimodal chat",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/internal_handler_session.ImageAttachment"
+ }
+ },
+ "knowledge_base_ids": {
+ "description": "Selected knowledge base ID for this request",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "knowledge_ids": {
+ "description": "Selected knowledge ID for this request",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "mentioned_items": {
+ "description": "@mentioned knowledge bases and files",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/internal_handler_session.MentionedItemRequest"
+ }
+ },
+ "query": {
+ "description": "Query text for knowledge base search",
+ "type": "string"
+ },
+ "summary_model_id": {
+ "description": "Optional summary model ID for this request (overrides session default)",
+ "type": "string"
+ },
+ "web_search_enabled": {
+ "description": "Whether web search is enabled for this request",
+ "type": "boolean"
+ }
+ }
+ },
+ "internal_handler_session.CreateSessionRequest": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "description": "Description for the session (optional)",
+ "type": "string"
+ },
+ "title": {
+ "description": "Title for the session (optional)",
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler_session.GenerateTitleRequest": {
+ "type": "object",
+ "required": [
+ "messages"
+ ],
+ "properties": {
+ "messages": {
+ "description": "Messages to use as context for title generation",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/github_com_Tencent_WeKnora_internal_types.Message"
+ }
+ }
+ }
+ },
+ "internal_handler_session.ImageAttachment": {
+ "type": "object",
+ "properties": {
+ "caption": {
+ "description": "VLM analysis result (context-aware, single call)",
+ "type": "string"
+ },
+ "data": {
+ "description": "base64 data URI from frontend (data:image/png;base64,...)",
+ "type": "string"
+ },
+ "url": {
+ "description": "serving URL after saving to storage",
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler_session.MentionedItemRequest": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "kb_type": {
+ "description": "\"document\" or \"faq\" (only for kb type)",
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "description": "\"kb\" for knowledge base, \"file\" for file",
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler_session.SearchKnowledgeRequest": {
+ "type": "object",
+ "required": [
+ "query"
+ ],
+ "properties": {
+ "knowledge_base_id": {
+ "description": "Single knowledge base ID (for backward compatibility)",
+ "type": "string"
+ },
+ "knowledge_base_ids": {
+ "description": "IDs of knowledge bases to search (multi-KB support)",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "knowledge_ids": {
+ "description": "IDs of specific knowledge (files) to search",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "query": {
+ "description": "Query text to search for",
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler_session.StopSessionRequest": {
+ "type": "object",
+ "required": [
+ "message_id"
+ ],
+ "properties": {
+ "message_id": {
+ "type": "string"
+ }
+ }
+ },
+ "internal_handler_session.batchDeleteRequest": {
+ "type": "object",
+ "properties": {
+ "delete_all": {
+ "type": "boolean"
+ },
+ "ids": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
}
},
"securityDefinitions": {
diff --git a/docs/images/architecture.png b/docs/images/architecture.png
index a163d96873692c72a64fac9869ed0ec9981de90c..dfb06f9acb5dd6a75d2da161f776bfde43c5cbe6 100644
GIT binary patch
literal 1110377
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