diff --git a/CHANGELOG.md b/CHANGELOG.md
index f3d0cab7..4d5adb91 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,10 @@
## [Unreleased]
+### 变更
+
+- P1.4:本机模型与本机知识库作为默认路径。设置向导默认先选 Ollama(本机 OpenAI 兼容地址不必填云密钥);模型页默认打开「本地」标签;知识库空状态先引导本机文件夹,向量默认本机 ONNX。云厂商与 ima 仍是可选项。说明见 `docs/user-guide.md`、`docs/configuration.md`。
+
### 文档
- 冻结 FreeOS 产品契约(P0.1):[docs/product-contract.md](docs/product-contract.md) / [docs/product-contract.zh-CN.md](docs/product-contract.zh-CN.md)。核心愿景采用「创立初心」定稿(中文原文;英文 README 为忠实对应;使用方式段为工作室比喻:本机安顿起步,组织像另一间可独立布置的房间)。产品口号:**FreeOS:自由的 AI 工作室,想象空间由你来打开** / *Your FreeOS, free for you.* 托管 Node / 内嵌组织页仅为过渡桥,终态是把 openXYOS 迁入宿主并导出可商业化源码。取代先前「组织身份为唯一权威」与「永久 / 默认捆绑 Node 运行时」表述。冲突文档改为 Historical vs Current,不删工程历史。
diff --git a/README.md b/README.md
index 8d6a72cc..f64e37f1 100644
--- a/README.md
+++ b/README.md
@@ -130,7 +130,17 @@ uv run freeos run
`freeos` is the product CLI. `octop` remains a package-compatible alias.
-Open the dashboard (default listen port is printed by `run`, commonly `http://127.0.0.1:18900`). Complete the first-run wizard.
+Open the dashboard (default listen port is printed by `run`, commonly `http://127.0.0.1:18900`). Complete the first-run wizard — **Ollama / a local OpenAI-compatible URL is the first choice**; cloud keys stay optional.
+
+### Local models and knowledge bases
+
+FreeOS prefers runtimes and files on this computer. Cloud vendors are optional.
+
+| What | Where |
+|---|---|
+| Chat models | First-run wizard (Ollama selected first) or **Models → Local**: start Ollama, register GGUF, or add a local OpenAI-compatible URL (LM Studio, llama.cpp, vLLM). |
+| Knowledge | Sidebar **Knowledge Bases**: mount a local folder first. Local ONNX embeddings are the default vector path. ima / WeKnora remain optional connectors. |
+| Detail | [User guide](docs/user-guide.md#四配置模型llm-供应商) · [Configuration](docs/configuration.md#local-models-and-knowledge-bases) · [Product contract](docs/product-contract.md#local-models-and-knowledge-bases) |
Data directory precedence:
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 6cf0efe8..bdde5f63 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -43,6 +43,8 @@ uv sync
uv run freeos run
```
+第一次打开控制台时,向导默认先选 **Ollama / 本机 OpenAI 兼容地址**,不必先填云厂商密钥。侧栏 **模型 → 本地** 可启动 Ollama、注册 GGUF;**知识库** 先挂接本机文件夹,向量默认本机 ONNX。说明见 [用户指南](docs/user-guide.md)、[配置](docs/configuration.md#local-models-and-knowledge-bases)。
+
不要将 API Key、令牌或真实客户资料提交到公开仓库。
完整功能、架构和发布说明请见 [English README](README.md)、[中文宿主说明](README_CN.md) 与 [Wiki](https://github.com/XYAIStudio/FreeOS/wiki)。openXYOS 能力哪些已在宿主原生、哪些仍在托管 Node / iframe,见 [能力迁移图(P0.2)](docs/org-capability-migration-map.zh-CN.md)。
diff --git a/README_CN.md b/README_CN.md
index 7da53cbb..92cd08a3 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -276,7 +276,7 @@ octop run --host 0.0.0.0 --port 8088
octop service start
```
-打开 **http://127.0.0.1:8088**。Docker 首次初始化会自动生成随机管理员密码(写入 `/data/.octop/credential.txt`),除非设置了 `OCTOP_DEFAULT_PASSWORD`。交互式 `octop init` / 设置向导会让你自行设置密码(至少 8 位,且同时包含字母和数字)。
+打开 **http://127.0.0.1:8088**。Docker 首次初始化会自动生成随机管理员密码(写入 `/data/.octop/credential.txt`),除非设置了 `OCTOP_DEFAULT_PASSWORD`。交互式 `octop init` / 设置向导会让你自行设置密码(至少 8 位,且同时包含字母和数字)。向导模型步默认先选本机 Ollama;知识库默认走本机文件夹 + ONNX 向量,云厂商与 ima 是可选项。详见 [docs/user-guide.md](docs/user-guide.md)。
### Docker(推荐用于生产部署)
@@ -384,7 +384,7 @@ octop user list
### 支持的 LLM 供应商
-OpenAI 兼容 API、DashScope(千问)、Ollama 等预设 — 在控制台或通过 `octop provider` 按 Agent 配置。
+**本机优先:** Ollama、本机 OpenAI 兼容端点(LM Studio / llama.cpp / vLLM)、本机 ONNX Embedding。云厂商(OpenAI 兼容 API、DashScope 等)是可选项 — 在向导或控制台「模型 → 本地」先配本机,再按需加云。
### 支持的通道
diff --git a/dashboard/src/locales/en.json b/dashboard/src/locales/en.json
index 70a41b82..ebd494b4 100644
--- a/dashboard/src/locales/en.json
+++ b/dashboard/src/locales/en.json
@@ -557,19 +557,21 @@
},
"knowledgeBases": {
"title": "Knowledge Bases",
- "subtitle": "Mount a local folder or cloud knowledge base first. Cleaning, labeling, and distillation come later.",
+ "subtitle": "Start with a folder on this computer. Cloud mounts stay optional. Cleaning, labeling, and distillation come later.",
"featureTitle": "Enable Knowledge Bases",
"settingsTitle": "Knowledge base settings",
"settingsFoundation": "Foundation settings",
- "settingsFoundationLead": "These settings are for later cleaning, labeling, and distillation. You can mount sources first without changing them.",
+ "settingsFoundationLead": "Vector models default to local ONNX. These settings are for later cleaning, labeling, and distillation. You can mount a local folder first without changing them.",
"settingsTabVector": "Vector model",
"settingsTabImage": "Images",
"settingsTabOcr": "Scanned-document OCR",
"settingsLead": "Advanced switch. It is on by default on the desktop. Turning it off hides knowledge bases from colleagues.",
"settingsOpen": "Knowledge base feature",
- "homeTitle": "Mount your sources first",
- "homeDesc": "Pick a folder on this computer, or connect ima with the official Agent Interface and choose which knowledge bases and documents to attach. The original folder stays read-only. Parse results go to a new folder you choose. Colleagues can look them up in chat.",
- "homeAdvancedHint": "Vector, image, and scanned-document OCR settings are for later cleaning, labeling, and distillation.",
+ "homeTitle": "Keep knowledge on this computer",
+ "homeDesc": "Mount a folder on this computer first so chat and colleagues retrieve local files. Connecting ima is optional. The original folder stays read-only; parse results go to a new folder you choose.",
+ "homeRecommended": "Start here · local folder",
+ "homeOptionalCloud": "Optional cloud",
+ "homeAdvancedHint": "Local ONNX embeddings, images, and scanned-document OCR are for later cleaning, labeling, and distillation.",
"defaultLocalName": "Local files",
"defaultCloudName": "Cloud knowledge",
"pickFolder": "Choose folder",
@@ -578,7 +580,7 @@
"imageSettingsDesc": "Turn this on to recognize text in pictures, so you can clean and label them later.",
"ocrFoundationHint": "Turn this on so scanned PDFs can be read as text for later distillation.",
"disabledTitle": "Knowledge bases are turned off",
- "disabledDesc": "You can turn the feature back on in foundation settings. After that, mount a local folder or a cloud knowledge base to start.",
+ "disabledDesc": "You can turn the feature back on in foundation settings. After that, mount a local folder first; cloud knowledge bases stay optional.",
"manageModels": "Manage models",
"unavailableTitle": "Knowledge bases are not ready",
"unavailableDescription": "Open Foundation settings in the top-right to turn knowledge bases on.",
@@ -591,7 +593,7 @@
"description": "Description",
"empty": "No knowledge bases yet",
"emptyGuideTitle": "No knowledge bases yet",
- "emptyGuideDesc": "Turn documents into a searchable library for chat citations, and optionally share them with users on this instance.",
+ "emptyGuideDesc": "Turn local documents into a searchable library for chat citations. Sharing with users on this instance is optional.",
"emptyGuideStepWhat": "What is a knowledge base?",
"emptyGuideStepWhatDetail": "A knowledge base splits and embeds uploaded documents so experts can retrieve relevant passages in chat, instead of stuffing the full text into context.",
"emptyGuideStepHow": "How to use it",
@@ -605,7 +607,7 @@
"enableGuideStepToggle": "Enable knowledge bases",
"enableGuideStepToggleDetail": "Turn on Enable knowledge bases. When off, knowledge bases are unavailable for everyone.",
"enableGuideStepModel": "Configure an embedding model",
- "enableGuideStepModelDetail": "Choose local ONNX (download the model first) or an online embedding provider, then save.",
+ "enableGuideStepModelDetail": "Choose local ONNX (download the model first). An online embedding provider is optional, then save.",
"noDescription": "No description",
"selectBase": "Select a knowledge base, or mount a source first",
"mountTitle": "Local folder mount",
@@ -3141,7 +3143,7 @@
"presetLocal": "Local",
"noPresetProvidersInTab": "No providers in this tab",
"customProviders": "Custom Providers",
- "noCustomProvidersHint": "No custom providers yet. Click \"Add provider\" above to create one.",
+ "noCustomProvidersHint": "No custom providers yet. Add a local OpenAI-compatible endpoint (Ollama, LM Studio, llama.cpp) or a cloud gateway.",
"builtinProviders": "Built-in Providers",
"addProvider": "Add Provider",
"addProviderTitle": "Add Custom Provider",
@@ -3196,7 +3198,7 @@
"localDownloadPending": "Preparing to download...",
"localDownloading": "Downloading {{repo}}... This may take a few minutes.",
"localHardwareTitle": "This PC",
- "localHardwareHint": "Detected RAM, CPU, optional NVIDIA GPU, Ollama, and already-downloaded GGUF / Ollama models. Chat can switch to a registered local model to reduce cloud use.",
+ "localHardwareHint": "Start here: detected RAM, CPU, optional GPU, Ollama, and already-downloaded GGUF / Ollama models. Register a local model for chat. Cloud providers stay optional.",
"localCpu": "CPU cores",
"localRam": "RAM",
"localGpu": "GPU",
@@ -3365,6 +3367,7 @@
"nameLabel": "Name",
"namePlaceholder": "e.g., my-openai",
"baseUrlExtra": "OpenAI-compatible endpoint base URL. Leave blank to use the official default.",
+ "baseUrlExtraLocal": "Prefer a local OpenAI-compatible URL, such as Ollama (http://127.0.0.1:11434/v1), LM Studio (:1234/v1), or llama.cpp (:8080/v1). Cloud URLs stay optional.",
"defaultModelLabel": "Default Model",
"defaultModelPlaceholder": "e.g., gpt-4o-mini",
"noteLabel": "Note (optional)",
@@ -4720,7 +4723,7 @@
"intro": "Create the first administrator account."
},
"model": {
- "intro": "Configure one model provider so the assistant can reply. You can skip this step and configure it later.",
+ "intro": "Start with a local runtime such as Ollama, or a local OpenAI-compatible URL. Cloud providers are optional. You can skip and finish later on Models.",
"skip": "Skip",
"skipToWorkspace": "Skip and enter workspace",
"presetTab": "Preset provider",
@@ -4728,7 +4731,10 @@
"showMorePresets": "Show more providers ({{count}})",
"hideMorePresets": "Show less",
"choosePreset": "Choose a preset provider",
- "choosePresetHint": "Click a card to pre-fill settings — you only need to enter your API key. Multi-site brands open a site picker first.",
+ "choosePresetHint": "Ollama is selected first so chat can stay on this computer. Cloud cards still work if you need them — you only enter an API key for those.",
+ "localRecommended": "This computer",
+ "localOptionalTest": "If Ollama or another local runtime is already up, test the connection. You can also continue and pull models later on Models → Local.",
+ "continueLocal": "Continue with local setup",
"siteCount": "{{count}} sites",
"customSetup": "Custom setup",
"testButton": "Test connection",
@@ -5668,7 +5674,7 @@
},
"models": {
"title": "Model Management",
- "subtitle": "Configure conversation, generation, voice, and search engines"
+ "subtitle": "Prefer models on this computer. Cloud, generation, voice, and search stay optional."
},
"voice": {
"title": "Voice Services",
diff --git a/dashboard/src/locales/zh.json b/dashboard/src/locales/zh.json
index 45758399..43f8da3a 100644
--- a/dashboard/src/locales/zh.json
+++ b/dashboard/src/locales/zh.json
@@ -557,19 +557,21 @@
},
"knowledgeBases": {
"title": "知识库",
- "subtitle": "先挂接本地文件夹或云知识库,再按需做清洗、标注和蒸馏。",
+ "subtitle": "先挂接这台电脑上的文件夹。云知识库是可选项。清洗、标注和蒸馏可以稍后做。",
"featureTitle": "启用知识库",
"settingsTitle": "知识库设置",
"settingsFoundation": "基础设置",
- "settingsFoundationLead": "这些是后续清洗、标注、蒸馏用的基础设置。先挂接资料即可开始,不必先改这里。",
+ "settingsFoundationLead": "向量模型默认用本机 ONNX。这些是后续清洗、标注、蒸馏用的基础设置。先挂接本机文件夹即可开始,不必先改这里。",
"settingsTabVector": "向量模型",
"settingsTabImage": "图片",
"settingsTabOcr": "扫描件 OCR",
"settingsLead": "高级开关。桌面默认已打开。关掉后,同事都无法再使用知识库。",
"settingsOpen": "知识库功能",
- "homeTitle": "先把资料挂进来",
- "homeDesc": "选电脑上的文件夹,或通过官方 IMA Agent Interface 连接 ima,再自选要接入的知识库和文档。原来的文件夹只读,不会被改动;解析结果会存到你另选的新文件夹。同事可以在对话里查阅。",
- "homeAdvancedHint": "向量模型、图片和扫描件 OCR 留给后续清洗、标注、蒸馏。",
+ "homeTitle": "知识先留在这台电脑上",
+ "homeDesc": "先挂接本机文件夹,对话和同事检索的就是本地资料。连接 ima 是可选项。原来的文件夹只读,不会被改动;解析结果会存到你另选的新文件夹。",
+ "homeRecommended": "从这里开始 · 本机文件夹",
+ "homeOptionalCloud": "可选云端",
+ "homeAdvancedHint": "本机 ONNX 向量、图片和扫描件 OCR 留给后续清洗、标注、蒸馏。",
"defaultLocalName": "本地资料",
"defaultCloudName": "云知识库",
"pickFolder": "选择文件夹",
@@ -578,7 +580,7 @@
"imageSettingsDesc": "打开后,可以把图片里的字认出来,方便以后清洗和标注。",
"ocrFoundationHint": "打开后,扫描件 PDF 也能认成文字,方便以后蒸馏。",
"disabledTitle": "知识库功能已关闭",
- "disabledDesc": "可以在基础设置里重新打开。打开后,先挂接本地文件夹或云知识库即可使用。",
+ "disabledDesc": "可以在基础设置里重新打开。打开后,先挂接本机文件夹即可使用;云知识库仍是可选项。",
"manageModels": "管理模型",
"unavailableTitle": "知识库尚未就绪",
"unavailableDescription": "请先在右上角基础设置中打开知识库。",
@@ -591,7 +593,7 @@
"description": "描述",
"empty": "暂无知识库",
"emptyGuideTitle": "还没有知识库",
- "emptyGuideDesc": "把文档做成可检索的资料库,对话时引用,也可按需共享给同实例用户。",
+ "emptyGuideDesc": "把本机文档做成可检索的资料库,对话时引用。共享给同实例用户是可选项。",
"emptyGuideStepWhat": "什么是知识库?",
"emptyGuideStepWhatDetail": "知识库会把上传的文档切分并向量化。对话时专家可以检索引用相关段落,而不必把全文塞进上下文。",
"emptyGuideStepHow": "知识库怎么用",
@@ -605,7 +607,7 @@
"enableGuideStepToggle": "启用知识库",
"enableGuideStepToggleDetail": "打开「启用知识库」开关。关闭后全实例都无法使用知识库。",
"enableGuideStepModel": "配置向量模型",
- "enableGuideStepModelDetail": "选择本地 ONNX(需先下载模型)或在线 Embedding 提供商,保存后即可使用。",
+ "enableGuideStepModelDetail": "优先选择本机 ONNX(需先下载模型)。在线 Embedding 提供商是可选项,保存后即可使用。",
"noDescription": "暂无描述",
"selectBase": "选一个知识库查看文档,或先挂接资料",
"mountTitle": "本地文件夹挂接",
@@ -3139,7 +3141,7 @@
"presetLocal": "本地",
"noPresetProvidersInTab": "暂无提供商",
"customProviders": "自定义提供商",
- "noCustomProvidersHint": "暂无自定义提供商,点击右上角「自定义供应商」添加",
+ "noCustomProvidersHint": "还没有自定义提供商。可添加本机 OpenAI 兼容端点(Ollama、LM Studio、llama.cpp),或云网关。",
"builtinProviders": "内置提供商",
"addProvider": "添加提供商",
"addProviderTitle": "添加自定义提供商",
@@ -3194,7 +3196,7 @@
"localDownloadPending": "准备下载...",
"localDownloading": "正在下载 {{repo}}... 可能需要几分钟。",
"localHardwareTitle": "本机",
- "localHardwareHint": "已检测内存、CPU、NVIDIA 显卡(如有)、Ollama 以及本机已有的 GGUF / Ollama 模型。注册后可在对话中切换到本地模型,减少云端算力。",
+ "localHardwareHint": "从这里开始:已检测内存、CPU、显卡(如有)、Ollama 以及本机已有的 GGUF / Ollama 模型。注册后即可在对话中使用本机模型。云厂商仍是可选项。",
"localCpu": "CPU 核心",
"localRam": "内存",
"localGpu": "显卡",
@@ -3363,6 +3365,7 @@
"nameLabel": "名称",
"namePlaceholder": "例如:my-openai",
"baseUrlExtra": "OpenAI 兼容 endpoint 的 base URL,留空则使用官方默认。",
+ "baseUrlExtraLocal": "优先填写本机 OpenAI 兼容地址,例如 Ollama(http://127.0.0.1:11434/v1)、LM Studio(:1234/v1)或 llama.cpp(:8080/v1)。云端地址仍可用。",
"defaultModelLabel": "默认模型",
"defaultModelPlaceholder": "例如:gpt-4o-mini",
"noteLabel": "备注(可选)",
@@ -4859,7 +4862,7 @@
"intro": "创建第一个管理员账户。"
},
"model": {
- "intro": "配置一个模型提供商,助手就可以回应你了。你也可以跳过本步,稍后在「模型」页配置。",
+ "intro": "先选本机运行时(如 Ollama)或本机 OpenAI 兼容地址。云厂商是可选项。也可以跳过,稍后在「模型」页完成。",
"skip": "跳过",
"skipToWorkspace": "跳过,进入工作台",
"presetTab": "预置提供商",
@@ -4867,7 +4870,10 @@
"showMorePresets": "显示更多提供商({{count}} 个)",
"hideMorePresets": "收起",
"choosePreset": "选择预置提供商",
- "choosePresetHint": "点击卡片快速填入配置,只需填写 API Key。同品牌多站点会先弹出站点选择。",
+ "choosePresetHint": "默认先选 Ollama,让对话留在这台电脑上。需要云厂商时再点对应卡片并填写 API Key。",
+ "localRecommended": "这台电脑",
+ "localOptionalTest": "若 Ollama 或其他本机运行时已启动,可以先测连通性。也可以直接继续,稍后在「模型 → 本地」拉取模型。",
+ "continueLocal": "按本机配置继续",
"siteCount": "{{count}} 个站点",
"customSetup": "自定义配置",
"testButton": "测试连通性",
@@ -5807,7 +5813,7 @@
},
"models": {
"title": "模型配置",
- "subtitle": "配置对话模型、生成模型、语音模型与搜索引擎"
+ "subtitle": "优先使用这台电脑上的模型。云端、生成、语音和搜索仍是可选项。"
},
"voice": {
"title": "语音服务",
diff --git a/dashboard/src/pages/KnowledgeBases/KnowledgeMountHome.test.tsx b/dashboard/src/pages/KnowledgeBases/KnowledgeMountHome.test.tsx
index c9818c73..703f2449 100644
--- a/dashboard/src/pages/KnowledgeBases/KnowledgeMountHome.test.tsx
+++ b/dashboard/src/pages/KnowledgeBases/KnowledgeMountHome.test.tsx
@@ -24,6 +24,12 @@ describe("", () => {
);
expect(screen.getByText("knowledgeBases.homeTitle")).toBeInTheDocument();
+ expect(
+ screen.getByText("knowledgeBases.homeRecommended"),
+ ).toBeInTheDocument();
+ expect(
+ screen.getByText("knowledgeBases.homeOptionalCloud"),
+ ).toBeInTheDocument();
expect(screen.getByText("knowledgeBases.mountTitle")).toBeInTheDocument();
expect(
screen.getByText("knowledgeBases.cloudMountTitle"),
diff --git a/dashboard/src/pages/KnowledgeBases/KnowledgeMountHome.tsx b/dashboard/src/pages/KnowledgeBases/KnowledgeMountHome.tsx
index af0bf1b3..5ea49f95 100644
--- a/dashboard/src/pages/KnowledgeBases/KnowledgeMountHome.tsx
+++ b/dashboard/src/pages/KnowledgeBases/KnowledgeMountHome.tsx
@@ -32,10 +32,13 @@ export function KnowledgeMountHome({
{t("knowledgeBases.homeDesc")}