内容
="center">
<img src://raw.githubusercontent.com/jeeftor/kl/master/internal/webassets.svg" width="120" alt="Klipbord />
# 剪
**自托管的体和人类共享的剪贴板。**
拖拽文件,粘贴文本,通过精美的网页界面 API和MCP图片——所有操作都可以通过简单的拖拽和粘。
[
[](github.com/je/klipbord/p/container/klip[](https://go.dev)
[](https://github.com/jeeftor/klipbord/actions)
[](LICENSE)
</div>
---
## 功能特点
| | |
|--|--|
| **网页界面** | Ctrl+V 粘贴图片,拖拽文件片段,语法高亮,搜索 |
| **** | 列出、下载、删除、固定文件和文本片段 |
| **MCP 服务器** AI 智能体aude Code、Hermesin 等)提供 种工具调用 |
| **视觉预处理** | 通过任何 OpenAI 兼容的视觉 LLM 自动识别/描述上传的图片 |
| **多提示分析** | 使用多个提示分析一张图片 — 所有排存储 |
| **预设比较** | 并行运行图片通过所有视觉后端,LLM 评判排名 **客户端搜索** | 跨两个选项卡搜索 OCR 文本和粘贴内容 |
| **** | 每项可配置 TTL(1 小时 天,7 天,30 天,无限期) **永久固定** | 将为永久,免 |
| **智能检测** | 从扩展内容嗅探自动类型,当客户端发送时 |
| **短 | 可分享的 `/{id}/{filename}` URL重定向,`=1` 和 `=1` |
|波形图** | 浏览器内波形播放支持播放/暂停拽和进度条,支持 MP3/WAVG/FLAC |
| **OpenAPI 3** | `/api/openapi.json` 处的机器可 + Swagger UI |
Go 二进制文件 无运行时依赖;检测测试和静态分析---
## 快速bash
docker run \
-p 8080:8080 \
v ./data:/ -e BASE_URL=https://klipbord.example.com \
ghcr.io/je/klip
```
然后打开 `localhost:8080 拖拽文件贴图片,分享代码片段。
---
## 配置
变量
| 环境 默认值 | 描述---------|---------|-------------|
| `PORT` | `808 | HTTP 端口 |
DATA_DIR` |` | 存储目录 |
BASE_URL` |://localhost:8080` | 用于生成链接的 |
| `MAX_UPLOAD_MB` | `2048 最大上传大小( |
| `VISION_ENABLED` | `true` | 启用上传时自动图片分析 |
| `VISION_REQUEST_TIMEOUT` | `2m` | 每个矩阵推理请求的最大时间 |
| `VISION_UNLOAD_TIMEOUT` | `2m` | 等待卸载和观察内存释放的最大时间 |
| `VISION_ENDPOINT` | *(设)* | Open兼容的视觉点(覆盖) |
| `` | *(见预设)* | 要使用的视觉模型名称(覆盖 UI 配置) |
###
通过 UI 中的选项卡** 或环境配置。
**环境优先** — 如果设置了 `VISION_ENDPOINT` 或 `VISION_MODEL`,它们 UI。锁定 "env" 预设将在 UI 中指示这一点。
三个预设在首次启动时生效:
| 预设 | 端点 | 模型 |
----------|-------|
| `` | `http:13305/v1/chat/completions` | `3-VL-4B-Instruct-GGUF` |
| `ollama`http://localhost:11434/v1/chat/completions` | `llama2-vision` `openai` | `https://api.openai.com/chat/completions `gpt-4o-mini` |
要完全禁用:`VISION_ENABLED=false`
---
## 视觉预当图片上传时贴板会自动将其配置的视觉 LLM。提取的文本 +存储在图片旁边 MCP 工具和 显示。
### 内置| 提示 | |
|--------|---------- `default` | — OCR + 描述 |
| `terminal` | 命令、输出、错误 `code` | 代码截图 — 保留缩进,检测语言 |
| `document` | 文档/收据 — 结构化布局提取 |
|` | 图表 结构、流程 |
### 自定义bash
curl -XH 'Content-Type/json' \
'{"name":"ui","description":"UI analysis","prompt":" UI mockup... \
/api
# 更新
PUT -H-Type: application/json -d '{"Updated"}' /pts/ui_mockup 删除
curl -api/prompts/ui_mockup
```
### 多提示分析
```bash
curl -X POST /api/analyze/{id}?prompt=terminal
curl -X POST /api/analyze/{id}?prompt=code
curl /api/files/{id} # 两个结果都返回在分析字段---
##<details>
><strong>项目</strong></summary>
``` /api/files出所有项目 -F 'file.png' -F=7dapi/upload #(自动检测 MIME 类型)
curl /api/files/{ -o file.png 下载
curl - -H 'Content application/json' \
content":"hello":"note.txt","ttl":"7d"}' /api/text # 创建
curl /api/text/{id} #文本
curl -Xapi/files/{id # 删除
curl PATCH -H ': application/json' -d '{"persistent}' /api/files/{id} # 固定固定
curl - -H 'Content application/json' \
-d '{"mime_type/gif"}' /id} # MIME 类型
```
</details>
<details>
<strong>视觉</strong></summary>
```bash -X POST /api/analyze/{id}?prompt=terminal #
curl -X POST/vision/test 内置样本测试
POST -H: application/json -d '{"image_type":"code"}'/vision/test # 测试特定图像类型
curl -X POST -H ' application/json' -d '{"image_type":"terminal"}' /ision/compare #预设
curl -X POST -H 'Content-Type: application/json' -d '{"item123"}'/vision/compare # 使用上传的图片比较
curl -X POST -H 'Content-Type: application/json' \
-d '{"image_type":"terminal"}' /api/vision/compare-prompts # 比较所有提示
```
</details>
<details>
<summary><strong>视觉配置</strong></summary>
```bash
curl /api/config/vision # 获取配置
curl -X POST -H 'Content-Type: application/json' \
-d '{"preset":"ollama"}' /api/config/vision/active # 设置活动预设
curl -X POST -H 'Content-Type: application/json' \
-d '{"enabled":false}' /api/config/vision/enabled # 切换视觉功能
curl -X POST -H 'Content-Type: application/json' \
-d '{"name":"my-llm","endpoint":"http://localhost:8080/v1/chatmodel":"' \
api/config/vision/presets # 创建
curl -Xapi/config/vision/presets/my-ll # 删除预设 -X POST -Content-Type: application \
-d '{"preset":"lemonade"}api/config/vision # 测试连接
details>
<details>
><strong>提示></summary>
```bash
curl /api/prompts # 列出所有curl /api/promname} #提示
curl - -H 'Content application/json' \
'{"name":"description":"y","z"}'/prompts # 创建
curl -X PUT -H 'Content-Type:' \
-d '{"prompt":"new text"}' /api/prompts} # 更新 -X DELETE //{name} # 删除(仅限```
</details>
summary><strong</strong></```bash
curl/health # →":"ok"}
curl/version # →vX.Y /api/openapi.json
```
</---
## MCP 服务器
```json
{ "Servers": { " { "url": "klipbord/mcp" }```
<details>
<strong>所有 工具</strong></| 工具 ||------|-------------|
| `list_files`出所有项目及其 |
| `get 获取文件内容64)或文本| `get_file 获取项目的公共 URL |
| `upload_file` | 上传文件(base + 文件名) |
| `create_text` | 创建文本片段 |
get_text` |文本片段内容 |
| `delete_file` | 删除项目 |
| `persist 固定或项目 |
| `describe_image` | 获取图片分析 |
|_image` | 触发/重新触发视觉分析 |
| `inspect_image` | 提出一个聚焦的视觉问题并返回结构化的可见证据 |
| `list_prompts` | 列出所有可用的视觉提示 |
| `create_prompt` | 创建新的视觉提示模板 |
| `update_prompt现有的 `delete | 删除自定义 `list_presets`所有配置 LLM 预设 |
set_vision_preset` | 切换活动视觉设 |
|_vision_preset`预设的 `test_v | 在样本图像完整的视觉处理| `compare_v 运行图像通过设,排名结果 |
| `compare_prompts 运行图像通过所有提示,排名结果 |
</details>
<details>
<strong>工具调用示例></summary>
// 描述{"name":_image", "arguments":": "abc123"}}
// 使用特定提示
{"name": "describe "arguments":": "abc123prompt": "terminal 触发重新分析name": "analyze "arguments":": "abc123", "prompt": "code"}}
// 提出问题并化证据
": "inspect_imagearguments": {"idabc123", " "ui", "question": "Which tab, and is the clipboard still loading?"}}
//预设
{"name": "compare_v "arguments": {"": "terminal"}提示
{"compare_prompts", "arguments": {" "terminal"}切换活动预设name": "", "arguments": {"preset": "oll}}
```
</---
## 直接链接
```
https://kl.example.com/{id # 标准URL 中)
https://kl.example.com/{id # 重定向到id}/{filenameklipbordid}?direct # 直接定向(curl 友好)
httpsipbord.example.com}?download= # 重定向到,强制下载
ipbord.example # 旧版形式(仍然有效)
```
---
## 网页界面路由
每个界面部分都有一个稳定的 URL,因此在刷新后保持选中状态,可以收藏。
| 路由 | 界面部分 |
|-------|------------|
| `/clip` | 剪贴板项目和 |
| `/persist永久项目 |
| `/config`视觉配置 |
| `/mcp-web` |和工具参考rest-web` API 参考 |
`定向到 `/clip浏览器界面路由与机器接口单独分离:REST 仍在 `/` 下,MCP 仍在 `/m,直接项目链接使用短形式 `/{(带有 `/link}` 作为旧别。
---
##
| 路径 | 内容 |
|------|| `{DATA_DIR}/files/` | 上传的文件 `{DATA_DIR}/text/` | 文本| `{DATA_DIR}/chunks/` |上传临时文件 |
DATA_DIR}/metadata | 项目元ID、名称、MIME、TTL、分析| `{DATAprompts.json`视觉提示 |
| `{DATA_DIR}/vision_config.json` | 视觉设和活动## 更新日志
2.9
- **数据通过 ffprobe和视频上传ffprobe`在 Docker 镜像进行探测,以解码器、比特率、采样通道和分辨率数据存储在项目,并在页面加载时 — 无需文件。
- **波**:形现在使用 `OfflineAudioContext`(无需用户手势)在页面。以前,由于浏览器自动播放策略,仅在点击播放。
- **视频信息叠加层**:显示分辨率、编解码比特率作为视频叠加层 v2.8
- **通知**:CI向 Telegram 频道公告和 CI警报。需要LEGRAM_TOKEN `TELEGRAM 仓库秘密。
规范音频 MIME在初始化时.AddExtensionType` 注册 `.mp3`、`.wav`、`.ogg`、`.flac`、`.m4a`、`.aac`、`.opus`,以确保在 Linux 和 macOS 上检测一致。
### v2.7.0
- **形播放器**:音频文件(MP3、WAV、OGG、FLAC、A)现在显示播放/暂停拖拽和加的画形。峰值通过 API 在 — 无后端依赖形在滚动时延迟解码 **单行工具:标题栏卡栏合并 — 标志 + 版本),选项卡中),帮助(右侧)。更紧凑,浪费的更少。
###.6.- **短链接分享的 URL 现在为 `/{id}/{filename}` 而不是/{id}`。 `/{id重定向到命名形式,以便下载工具和 AI 智能体看到正确的文件名。 `/link}` 仍然作为旧别名工作。
IME 自动检测**:上传的文件类型Content-Type` `application/oct` 来自 curl首先从文件名中检测真实类型内容嗅 `.gif` 通过 curl 上传,则正确存储image/gif`。
- **下载按钮**:图片卡有一个专用的下载强制 `Content attachment`。
-IME 类型编辑`PATCH /api}` 接受一个 `mime_type`。应用内卡片上的标签您手动修复 类型。
- **HEAD 支持**:`HEAD /{id}`(文件名、内容类型、大小)而文 —`curl - 兼容,无需 `-L`。
### v2.5.9
-证据检查(MCP 工具)**:实时日志抽屉
- 剪贴板加载状态修复
---
##```bash
make build build -o klipbord .
make run # go run .
make # go test ./...
```
测试视觉服务器 — 无需外部 LLM。CI 在构建 Docker 镜像之前运行测试;`build` 作业以 `test条件。
### Telegram 通知
CI 在发布时和 CI 失败时向 Telegram 发送通知。要启用,请设置两个仓库秘密:
```bash
gh secretGRAM_TOKEN --repo $(gh repojson nameWithOwner -q .nameWithOwner)
gh secret set TELEGRAM_TO --repo $(gh repo view --json nameWithOwner -q .nameWithOwner)
```
- `TELEGRAM_TOKEN` — 来自 [@BotFather](https://t.me/BotFather) 的机器人令牌
- `TELEGRAM_TO` — 频道 ID (`@yourchannel` 或 `-1001234567890` 用于私人频道)
---
<div align">
许可证   <ahttps://github.com/je/klipbord">githubjeeftor/klipa>
</div>