langchat-editor

An AI-first, framework-agnostic editor for JavaScript applications, powered by Tiptap and Web Components.
412
Install
npm install langchat-editor
Latest Version:1.0.1
Vue:3
License:MIT
Last Updated:Sep 1, 2026
Links: npm
Maintainer: tycoding

LangChat Editor Logo

LangChat Editor

English

面向所有 JavaScript 应用的框架无关开源 AI 编辑器。
通过 Web Component 直接接入原生 JS、React、Svelte、Angular、JSP/Servlet 等环境,也提供 Vue 3 原生组件入口。

npm version MIT License Web Components TypeScript

产品官网 · Playground · LangChat 官网 · 问题反馈


LangChat Editor 是一套 AI-first、框架无关的可组合编辑系统,不只是传统富文本工具栏。它把选区级 AI、整篇文档 Agent、流式生成和可审阅的建议状态放回写作上下文,同时保留完整的文档结构、导入导出与分页能力。编辑器核心通过 Tiptap 构建,跨框架入口通过标准 Web Component 和 CustomEvent 协议提供;宿主应用可以是原生 JS、Vue、React、Svelte、Angular、Preact、Solid、JSP/Servlet,或任何能够输出 HTML 并加载 JavaScript 的 Java、PHP、.NET、Python 等服务端应用。

为什么选择 LangChat Editor

能力 说明
四种产品形态 default、mini、notion、word 使用同一套内容基础,分别服务标准 AI 编辑、快速输入、文档 Agent 和长文档工作流。
AI 编辑扩展 选区改写、总结、续写、文档 Agent、流式生成与建议审阅按需组合。
能力级 Mini 模式 不只是隐藏按钮;Mini 会过滤扩展集合,主动限制不必要的复杂操作。
Office 风格 Word 模式 固定 Ribbon、A4 分页、目录导航、状态栏与缩放控制共同构成长文档工作台。
主题与国际化 内置亮色、暗色、主题色、圆角配置、简体中文和英文界面。
AI 协议适配 使用原生 TypeScript fetch 与 SSE 解析器接入 OpenAI 兼容协议,不依赖 OpenAI SDK。
跨框架交付 Web Component 自包含 Vue runtime、样式和编辑器能力;React 提供薄适配包,其他框架直接使用标准 DOM API。
实例隔离 多个编辑器可在同一应用中独立工作,预览、打印、目录与内容状态不会互相串扰。

四种 AI 编辑形态

标准模式

适合内容后台、知识库、文章编辑和常规业务表单。它保留完整菜单、工具栏、浮动菜单以及丰富的文档扩展,并支持选区 AI 改写、总结和上下文审阅。

LangChat Editor 标准模式

Mini 模式

适合评论、摘要、消息输入和嵌入式写作。它保留关键格式、文字颜色、背景色与斜杠菜单,让 AI 帮助把粗略想法快速整理成可发送内容,同时从扩展层限制复杂能力。

LangChat Editor Mini 模式

Notion 模式

适合知识库、研究笔记和长篇思考。它把编辑画布放在中心,通过上下文 AI 与整篇文档 Agent 完成总结、提纲、补写和结构化整理。

Word 模式

适合报告、方案和长篇业务文档。界面提供 Office 风格 Ribbon、A4 页面、可折叠 TOC、页码与字数状态、阅读视图和缩放控制。

LangChat Editor Word 模式

图片均直接截取自仓库中的真实 Playground。演示页在任意时刻只挂载一个独立 AI 编辑器实例,切换模式时会创建新的实例。

环境要求

  • Node.js 20.19 或更高版本
  • 现代浏览器:Chrome 88+、Edge 88+、Firefox 78+、Safari 14+
  • pnpm 11(参与项目开发时使用)

Vue 3 只在直接使用 langchat-editor 主入口时需要;使用 langchat-editor/element 或 @langchat/editor-react 时,编辑器运行时会随产物提供,宿主应用不需要改造成 Vue 项目。

安装

pnpm add langchat-editor

也可以使用 npm:

npm install langchat-editor

跨框架使用(推荐入口)

跨框架集成的推荐边界是 Web Component。langchat-editor/element 会把 Vue runtime、编辑器样式、AI 能力和扩展运行时一起打进产物,宿主只需要使用标准自定义元素、DOM property 和 CustomEvent:

import 'langchat-editor/element'
import { AI, BaseKit, History } from 'langchat-editor/element'

const editor = document.querySelector('langchat-editor')
editor.value = '<h1>AI launch brief</h1><p>Select text to ask AI.</p>'
editor.extensions = [BaseKit, History, AI]
editor.addEventListener('lc-change', event => {
  console.log(event.detail.value, event.detail.format)
})

editor.openAI('document')

原生 JS、JSP/Servlet、Vue、Svelte、Angular、Preact、Solid 和其他支持 Web Components 的页面都可以直接使用 <langchat-editor>;Java、PHP、.NET、Python 等服务端语言只需要把生成的 JS/CSS 作为静态资源输出即可。这些宿主共享同一套 DOM property 与 CustomEvent 协议,不需要重复实现编辑器。React 项目可以安装薄包装 @langchat/editor-react,它只负责 props、ref 和 DOM CustomEvents 的映射,不会复制编辑器 UI 或 AI 实现。主包的 Web Component 入口和 React 适配包都带有明确的 TypeScript declaration files,能够直接获得元素、props、事件和 AI detail 类型。

宿主环境 推荐入口 适配方式
原生 JS / JSP / Servlet langchat-editor/element <langchat-editor> + DOM property + CustomEvent
Vue 3 langchat-editor 原生 Vue 组件和 v-model
React @langchat/editor-react 薄 wrapper + typed props/ref/events
Svelte / Angular / Preact / Solid langchat-editor/element 直接消费 Web Component

跨框架适配层使用统一的 DOM 协议:lc-ready、lc-input、lc-change、lc-enter、lc-error 和 lc-ai。lc-ai 的 detail.type 覆盖 start、delta、complete、error、abort、accept、reject、insert 与 regenerate,因此原生 JS、React、JSP/Servlet 和其他框架都能观察同一条 AI 流式与审阅链路。复杂配置通过 DOM property 传递,AI 请求仍然使用 OpenAI-compatible Chat Completions + SSE;生产环境建议由 Servlet 或其他服务端代理保存模型密钥。

完整示例见 examples/。

注意:上面的 langchat-editor/element 是 npm 裸模块名,必须由 Vite/Webpack 等 bundler 或 import map 解析,不能直接在 file:// 页面中解析。仓库里的 examples/vanilla/index.html 使用 lib/langchat-editor-element.umd.js,执行 pnpm build:element 后可以直接双击打开。

快速开始(Vue 3 原生组件)

<script setup lang="ts">
import { ref } from 'vue'
import {
  BaseKit,
  AI,
  Bold,
  BulletList,
  Heading,
  History,
  Italic,
  LangChatEditor,
  Link,
  OrderedList,
  Underline,
} from 'langchat-editor'
import 'langchat-editor/style.css'

const content = ref('<h1>AI launch brief</h1><p>Select a sentence and ask AI to rewrite it in context.</p>')
const extensions = [BaseKit, History, Heading, Bold, Italic, Underline, Link, BulletList, OrderedList, AI]
</script>

<template>
  <LangChatEditor v-model="content" :extensions="extensions" :min-height="320" />
</template>

也可以全局安装组件:

import { createApp } from 'vue'
import LangChatEditor from 'langchat-editor'
import 'langchat-editor/style.css'
import App from './App.vue'

createApp(App).use(LangChatEditor).mount('#app')

切换编辑模式

模式是组件配置,不会改变 v-model 的使用方式。

<template>
  <!-- 完整编辑器 -->
  <LangChatEditor v-model="standardContent" :extensions="standardExtensions" mode="default" />

  <!-- 只开放必要能力的紧凑编辑器 -->
  <LangChatEditor
    v-model="miniContent"
    :extensions="miniExtensions"
    :mini-extensions="[
      'base-kit',
      'history',
      'heading',
      'bold',
      'italic',
      'underline',
      'color',
      'highlight',
      'bulletList',
      'orderedList',
      'textAlign',
      'link',
      'slashCommand',
    ]"
    mode="mini"
  />

  <!-- Office 风格分页工作台 -->
  <LangChatEditor
    v-model="documentContent"
    v-model:word-header-footer="wordHeaderFooter"
    :extensions="wordExtensions"
    :toc="{ enable: true, position: 'left', maxLevel: 3, defaultOpen: false }"
    :word-page-count="2"
    mode="word"
  />
</template>

常用配置

参数 类型 默认值 说明
mode 'default' | 'mini' | 'notion' | 'word' 'default' 编辑器的产品形态与 AI 能力策略
modelValue string | JSONContent '' 编辑器内容
output 'html' | 'json' | 'text' 'html' v-model 输出格式
extensions AnyExtension[] [] 启用的 Tiptap / LangChat 扩展
miniExtensions string[] 内置必要集合 Mini 模式允许使用的扩展名称
wordPageCount number 2 Word 模式展示的 A4 页数
wordHeaderFooter WordHeaderFooterConfig 关闭 每页重复显示的页眉、页脚与页码配置
disabled boolean false 禁止编辑
hideToolbar boolean false 隐藏工具栏
hideMenubar boolean true 隐藏顶部菜单栏
hideBubble boolean false 隐藏文本浮动菜单
dark boolean 跟随系统 使用暗色主题
theme Theme 'zinc' 编辑器主题色
radius BorderRadius 0.5 组件圆角尺度
minHeight string | number 未设置 最小高度,数字按像素处理
maxHeight string | number 未设置 最大高度,超出后滚动
maxWidth string | number 未设置 内容区域最大宽度
toc TocConfig 关闭 目录位置、最大层级、标题与默认展开状态

完整类型定义见 src/type.ts。

事件与编辑器实例

  • update:modelValue:内容变化时更新 v-model。
  • change:返回编辑器实例与当前输出内容。
  • enter:配置 enter 后,在按下 Enter 时触发。

需要直接调用 Tiptap API 时,可以通过组件引用取得实例:

<script setup lang="ts">
import { ref } from 'vue'

const editorRef = ref()

function focusEditor() {
  editorRef.value?.editor.commands.focus()
}
</script>

<template>
  <LangChatEditor ref="editorRef" />
</template>

扩展系统

项目导出的主要扩展包括:

  • 基础:BaseKit、History、Clear、FormatPainter、Fullscreen
  • 文本:Bold、Italic、Underline、Strike、MoreMark、Color、Highlight
  • 排版:Heading、FontSize、FontFamily、TextAlign、LineHeight、Indent
  • 内容块:Blockquote、HorizontalRule、Code、CodeBlock、Iframe、Columns
  • 列表:BulletList、OrderedList、TaskList
  • 媒体:Image、ImageUpload、Video、VideoUpload
  • 文档:Table、Link、Toc、FindAndReplace、SourceCode、Preview、Printer、ImportWord、ExportWord
  • 交互:SlashCommand、SpecialCharacter、AI

每个扩展都可以通过 configure 独立调整:

const extensions = [
  BaseKit.configure({
    placeholder: { placeholder: '输入内容...' },
    characterCount: { limit: 50000 },
  }),
  Heading.configure({ levels: [1, 2, 3] }),
  Image.configure({ inline: false }),
  Table.configure({ resizable: true }),
]

完整组合示例见 playground/src/utils/createDemoExtensions.ts。更多可交互的模式、插件和框架配置见 在线文档。

AI 接入

LangChat Editor 内置 OpenAI Chat Completions 兼容适配器,通过浏览器原生 fetch 请求接口,并正确解析流式 SSE 数据。项目不包含也不需要 openai npm 依赖。

import { AI, createOpenAICompletions } from 'langchat-editor'

const ai = AI.configure({
  completions: createOpenAICompletions({
    temperature: 0.7,
  }),
  modelConfig: {
    model: 'gpt-4.1-mini',
    baseURL: 'https://api.openai.com/v1',
    apiKey: 'your-api-key',
  },
  showModelConfig: true,
})

baseURL 可以指向任何兼容 /chat/completions 与流式响应格式的服务。生产环境不应把长期有效的 API Key 直接写入前端代码;建议由自己的服务端代理鉴权,并通过 headers 或短期令牌接入。

如果需要完全控制请求过程,也可以向 AI.configure({ completions }) 传入自己的回调。

Playground 使用 Gitee AI

Playground 已预置 Gitee AI 的 OpenAI 兼容接口和 GLM-5 模型。复制示例配置到 Playground 的本地环境文件,再填写自己的密钥:

cp playground/.env.example playground/.env.local
VITE_PLAYGROUND_AI_API_KEY='your-gitee-api-key'
VITE_PLAYGROUND_AI_BASE_URL='https://ai.gitee.com/v1/chat/completions'
VITE_PLAYGROUND_AI_MODEL='GLM-5'

然后运行 pnpm dev,在 Playground 中即可使用 AI 工具。playground/.env.local 已加入 .gitignore,不会被提交;请勿把真实密钥写入 .env.example、源码或截图中。

这些 VITE_ 变量会随前端构建产物暴露给浏览器,只适合本地演示。生产环境请使用自己的服务端代理保存密钥,再将代理地址配置到 VITE_PLAYGROUND_AI_BASE_URL。

文档工作流

TOC 目录

启用 Toc 扩展并传入 toc 配置后,工具栏会显示目录开关。目录默认折叠;用户点击后才会从编辑区域左侧或右侧展开,并根据滚动位置同步当前标题层级。

Word 导出

把 ExportWord 加入扩展列表后,文件菜单和工具栏会提供 Word 导出入口。也可以直接调用:

editor.commands.exportToWord('report.docx')

预览与打印

预览会把当前实例切换为只读呈现,不再创建互相覆盖的全局弹窗。打印内容同样来自触发操作的编辑器实例,并使用独立打印样式。

本地开发

git clone https://github.com/tycoding/langchat-editor.git
cd langchat-editor
pnpm install
pnpm dev

根目录的 workspace 会同时安装 Playground、React example 和 Svelte example。启动其他案例:

pnpm --filter langchat-editor-react-example dev
pnpm --filter langchat-editor-svelte-example dev

常用命令:

命令 作用
pnpm dev 启动产品官网与 Playground
pnpm playground 同样启动 Playground
pnpm build:lib 构建发布包
pnpm build:element 构建自包含 Web Component
pnpm build:playground 构建 Playground
pnpm type:check 检查 TypeScript
pnpm lint 检查代码规范
pnpm check 执行完整交付检查

项目结构

langchat-editor/
├── src/
│   ├── components/       # 编辑器外壳、菜单、目录与对话框
│   ├── extensions/       # 可组合的 Tiptap 扩展
│   ├── hooks/            # 主题、状态、焦点与 TOC hooks
│   ├── locales/          # 简体中文与英文文案
│   └── styles/           # 以 .lc-editor 为边界的编辑器样式
├── playground/           # 产品首页、生态页与交互式 Playground
├── packages/editor-react/ # React 薄适配包
├── examples/              # 原生 JS、React、Svelte、JSP/Servlet 示例
├── vite.element.config.ts # 自包含 Web Component 构建入口
└── README.en.md          # English project overview

编辑器的模块边界、插件生命周期、AI 事件协议、主题方案和构建流程见 在线文档中心。

文档索引

常见问题

Mini 模式只是把按钮隐藏了吗?

不是。Mini 模式会根据 miniExtensions 过滤实际启用的扩展,未开放的命令不会仅仅因为隐藏了按钮而继续保留。

同一页面可以放多个编辑器吗?

可以。编辑器内容、预览、打印、TOC 与 UI 状态按实例隔离。Playground 采用单实例切换,是为了让演示行为更清晰,而不是组件的使用限制。

必须使用 OpenAI 服务吗?

不需要。默认适配器遵循 OpenAI 兼容协议,也可以替换为自己的 completions 回调,连接私有模型、服务端代理或其他流式生成服务。

必须使用 Vue 才能接入吗?

不需要。Vue 3 只是主包提供的原生组件入口。其他 JavaScript 框架和 JSP/Servlet 页面使用 langchat-editor/element Web Component;React 可以使用 @langchat/editor-react 薄适配包。所有入口共享同一套编辑器能力、AI 事件协议和 TypeScript 类型。

参与贡献

欢迎提交 Issue、文档改进、扩展能力与修复。开始前请阅读:

提交 Pull Request 前建议运行 pnpm check,并同步更新受影响的文档与 Playground 示例。

LangChat Team

LangChat Editor 由 LangChat Team 构建和维护,是 LangChat 开源 AI 产品生态中的编辑基础设施。

致谢

项目建立在 Vue、Tiptap、Reka UI 与 Lucide 等优秀开源项目之上。

许可证

LangChat Editor 基于 MIT License 开源。你可以自由使用、修改和分发,并保留许可证与版权声明。

Related Packages

vdc-editor

A modern WYSIWYG rich-text editor using tiptap + Vue.js for SBS

29,808
echo-editor

A modern AI-powered WYSIWYG rich-text editor for Vue, based on Tiptap and shadcn...

16,933
aurora-editor

A modern AI-powered WYSIWYG rich-text editor for Vue, based on Tiptap and shadcn...

6,047
@bryce-loskie/echo-editor

Forked from LeeAt67/echo-editor, a modern AI-powered WYSIWYG and Highly Customiz...

5,180 0
@globalpress/lantern

A modern WYSIWYG rich-text editor using tiptap for Vue.js. Built with TypeScript...

2,389

Version History

Version Released Vue License
1.0.1 >= 3.0.0 MIT