linkyun-infiniti-agent
v0.8.6
Published
LinkYun Infiniti Agent — long-running CLI agent (Node.js, React + Ink TUI)
Readme
Infiniti Agent
项目级 AI 智能体框架。每个目录启动的 agent 都可以拥有独立的 skills、memory 和 session,天然支持多智能体协同。
支持 Anthropic (Claude) / OpenAI / Gemini 等多模型,可配置多个 LLM profile 用于不同场景。
快速开始
# 安装
npm install -g linkyun-infiniti-agent
# 首次配置(交互式,支持一次配置多个 LLM profile)
infiniti-agent init
# 在项目目录初始化独立实例
cd your-project
infiniti-agent migrate
# 开始对话
infiniti-agent本地全栈:大模型与 TTS
要完整跑通 对话(LLM)+ 语音(TTS),先在兄弟 service 仓库启动本地模型服务,然后在 ~/.infiniti-agent/config.json 或项目下 .infiniti-agent/config.json(infiniti-agent migrate 后)里配置 service URL。
本仓库现在定位为 Agent 编排层:CLI / TUI / LiveUI / 会话 / LLM 调度 / TTS client / ASR。重模型服务建议放在兄弟仓库独立运行:
../infiniti-llm-service:Ollama / vLLM 启动、健康检查、延迟测试。../infiniti-tts-service:VoxCPM2 / MOSS-TTS-Nano ONNX 安装、模型下载、HTTP 服务。
主仓只需要知道这些服务的 URL。配置片段见 docs/services.fragment.json;仓库内旧 TTS 脚本会暂时保留用于兼容,新的开发和部署优先使用独立 service 仓库。
大模型(LLM)
本项目的 LLM 走 OpenAI 兼容 HTTP API(provider: "openai")。本机服务由 ../infiniti-llm-service 启动;主仓只配置 baseUrl、model、apiKey。
常用 service URL:
- Ollama:
http://127.0.0.1:11434/v1 - vLLM:
http://127.0.0.1:8000/v1 - LM Studio 等:使用工具界面提供的 OpenAI-compatible
baseUrl
示例:
{
"llm": {
"provider": "openai",
"baseUrl": "http://127.0.0.1:11434/v1",
"model": "qwen2.5:7b",
"apiKey": "ollama",
"disableTools": true
}
}TTS
TTS 服务由 ../infiniti-tts-service 独立启动;主仓只配置 provider 和 baseUrl,以及声音参数。
常用 service URL:
- VoxCPM2:
http://127.0.0.1:8810 - MOSS-TTS-Nano ONNX:
http://127.0.0.1:18083
示例:
{
"tts": {
"provider": "voxcpm",
"baseUrl": "http://127.0.0.1:8810",
"controlInstruction": "年轻女性,温柔自然",
"amplitudeNormalize": "rms"
}
}命令一览
| 命令 | 说明 |
|------|------|
| infiniti-agent | 进入交互对话(TUI) |
| infiniti-agent chat | 同上 |
| infiniti-agent cli <prompt> | 非交互执行一轮,结果输出到 stdout |
| infiniti-agent init | 配置 LLM(写入全局 ~/.infiniti-agent/config.json) |
| infiniti-agent migrate | 将全局配置复制到当前目录 .infiniti-agent/,实现项目级独立 |
| infiniti-agent upgrade | 升级旧版 config.json 到最新格式 |
| infiniti-agent export <file> | 导出当前 agent layout 为 zip 格式 .agent 文件 |
| infiniti-agent import <file> | 从 .agent 文件导入 agent layout,已有 layout 时询问是否覆盖 |
| infiniti-agent sync | 登录 LinkYun,选择 Agent,并按时间戳双向同步 .agent 归档 |
| infiniti-agent link | 从 SOUL.md 提取邮件配置,生成 mail-poller.sh 邮件轮询守护脚本 |
| infiniti-agent skill add <source> | 安装 Skill(支持 owner/repo、git URL、本地路径) |
| infiniti-agent skill list | 列出当前项目已安装的 Skills |
| infiniti-agent live | LiveUI:WebSocket + Electron 透明窗 + TUI(需先 npm run build;虚拟人窗口依赖本包内的 electron 模块,全局安装后若看不到窗口,在包安装目录执行一次 npm install 或重装本包以拉取 optional 依赖) |
Live 语音输入默认是 按住空格说话:点击麦克风按钮启用后,长按空格开始录音,松开发送 ASR 识别。若要恢复旧版自动 VAD / 自动打断模式,启动时加 --auto:infiniti-agent live --auto。
Live 底部文本框会保留最近输入历史;焦点在文本框内且斜杠补全未打开时,可用 ↑ / ↓ 在历史输入中导航。
LiveUI 窗口为无边框透明窗:在底部深色对话条上,除按钮与输入框以外的区域(条的外沿与留白)可拖动窗口;人物区域不再弹出单独拖动面板。
Electron 窗口(默认):无边框、透明、置顶叠层。需要标题栏 + 视图 菜单(重新加载、开发者工具、缩放等)时:INFINITI_LIVEUI_DEBUG_WINDOW=1。启动时自动打开 DevTools(独立窗口):INFINITI_LIVEUI_DEVTOOLS=1;infiniti-agent live 带 --debug 时也会自动设置 DevTools。
渲染依赖 Live2D Cubism Core:已内置在 liveui/public/live2dcubismcore.min.js(构建时复制到 dist/),index.html 以相对路径 ./live2dcubismcore.min.js 加载,避免 Electron file:// 下绝对路径 /xxx.js 指向磁盘根目录导致加载失败。模型入口为配置解析出的 file: 路径(.model3.json)。
LiveUI / Live2D(config.json 顶层 liveUi,对齐 Open-LLM-VTuber 的目录与 model_dict.json):
live2dModelsDir:模型根目录(如./live2d-models,其下为模型名/runtime/*.model3.json)。live2dModelDict:模型清单 JSON 路径,默认./model_dict.json。live2dModelName:清单里某条目的name(与 VTubercharacter_config.live2d_model_name一致)。live2dModel3Json:若已离线下载,可直接写.model3.json路径(优先于 dict+name)。port:WebSocket 端口;也可用infiniti-agent live -p 9000或环境变量INFINITI_LIVEUI_PORT覆盖。subconsciousHeartbeatMs:subconscious-agent heartbeat 间隔,单位毫秒;默认60000,范围5000~3600000。figureZoom:LiveUI 虚拟人缩放比例,范围0.4~1.5;infiniti-agent live --zoom可临时覆盖。renderer:角色渲染方式,可选live2d、sprite、real2d。未设置时保持旧逻辑:有spriteExpressions.dir则用sprite,否则用live2d。spriteExpressions.dir:sprite模式使用含exp_01.png…exp_08.png的目录(如./live2d-models/luna/expression);real2d模式按/real2d参考代码使用含exp01.png…exp06.png、可选exp_open.png的目录(如./live2d-models/jess/expression2d),并通过 MediaPipe landmarks 做实时 2D 变形与口型驱动。
一键写入默认 liveUi(合并到项目的 .infiniti-agent/config.json,并在缺少 ./model_dict.json 时从包内示例复制):
# 方式 A:在已 migrate 的项目根执行(把脚本路径换成你的 infiniti-agent 克隆目录)
cd ~/your-project
node ~/Dev/infiniti-agent/infiniti-agent/scripts/merge-liveui-config.mjs
# 方式 B:在 infiniti-agent 源码根执行,并传入项目路径
cd ~/Dev/infiniti-agent/infiniti-agent
npm run setup:liveui -- ~/your-project将 Open-LLM-VTuber 的 live2d-models 文件夹拷到项目根下的 live2d-models/,与 model_dict.json 中的 url 一致即可校验通过。
TTS(config.tts):本仓库只作为 TTS client 调用外部 service。VoxCPM2、MOSS-TTS-Nano ONNX 的安装、模型下载和启动见 ../infiniti-tts-service;这里仅配置 "provider" 与 "baseUrl"。VoxCPM2 可选 referenceAudioPath、controlInstruction、amplitudeNormalize(rms / peak / none,默认 rms)等字段,详见 src/config/types.ts 的 VoxcpmTtsConfig。
Seedance 视频(config.seedance):/video <提示词> 或 /seedance <提示词> 会调用火山方舟异步视频任务,完成后下载到本地 .infiniti-agent/inbox/assets/ 并写入你的邮箱。若当前消息带有 Live 拍照图片或用户上传图片,会自动作为参考图传给视频 API;LLM 也可通过内置工具 seedance_video 发起同样的异步任务。常用配置:
{
"seedance": {
"provider": "volcengine",
"baseUrl": "https://ark.cn-beijing.volces.com",
"apiKey": "YOUR_ARK_API_KEY",
"model": "doubao-seedance-2-0-260128",
"ratio": "16:9",
"duration": 5,
"resolution": "720p",
"generateAudio": true,
"watermark": false
}
}常用选项:
infiniti-agent cli 查询天气 --debug # 输出调试日志到 stderr
infiniti-agent cli 查询天气 --disable-thinking # 禁用深度思考模式
infiniti-agent --dangerously-skip-permissions # 跳过工具安全评估项目级独立运行
每个目录下的 .infiniti-agent/ 是该项目的独立数据空间:
your-project/
├── .infiniti-agent/
│ ├── config.json # 项目级配置(不存在则 fallback 到全局)
│ ├── session.json # 对话历史
│ ├── memory.md # 长期记忆
│ ├── skills/ # 已安装的 Skills
│ └── error.log # 错误日志
├── SOUL.md # Agent 人格定义(可选)
├── INFINITI.md # 项目说明 / 指令(可选)
└── ...不同目录的 agent 完全隔离——可以各自安装不同的 skills,拥有不同的 memory 和对话历史。
可以把当前目录的 agent 打包迁移到另一个目录:
infiniti-agent export jess.agent
cd ../another-project
infiniti-agent import ../jess.agent.agent 文件本质上是 zip,包含 .infiniti-agent/ 以及 SOUL.md、INFINITI.md、CLAUDE.md 等 agent 提示文件。若目标目录已存在 agent layout,导入时会询问是否覆盖;自动化脚本可使用 infiniti-agent import jess.agent --force。
infiniti-agent sync 会把 LinkYun 登录信息、workspace 和选中的 Agent code 保存在当前目录 .env.local,下次自动复用;该文件不会被 export 打进 .agent,也默认不提交 Git。手动同步时会先拉取 Agent 的 SOUL / 角色素材,再查看服务器 .agent 版本:如果服务器归档比本地 .infiniti-agent/session.json 更新,就下载并覆盖当前 layout;如果服务器没有归档或本地 session 更新,就导出并上传本地 .agent。可用 --pull 或 --push 强制方向,--login 强制重新登录,--agent <code> 切换绑定的 LinkYun Agent。
当当前目录已有 .env.local 绑定 Agent 时,infiniti-agent / chat / live / cli 启动前会自动做一次 pull-only 同步:只在服务器 .agent 更新时下载,不会在启动时自动上传旧本地状态;正常退出时会自动 push 一次。覆盖导入前会把 SOUL.md、session.json、memory.json、subconscious.json、schedules.json、sessions.db、knowledge.db 等关键文件备份到 .infiniti-agent/backups/sync/(保留最近 5 份),每次同步会追加记录到 .infiniti-agent/sync-history.jsonl。临时跳过自动同步可用 INFINITI_AGENT_SKIP_STARTUP_SYNC=1 infiniti-agent。
自定义 Agent 行为
在项目根目录创建以下文件即可定制 agent:
SOUL.md— 定义 agent 的人格、角色和行为准则INFINITI.md— 项目专属指令(也兼容CLAUDE.md)
示例 SOUL.md:
你是一个专注于 Python 后端开发的助手。
偏好使用 FastAPI 和 SQLAlchemy。
回复简洁,优先给出可运行的代码。多 LLM Profile
在 config.json 中配置多个 LLM,用于不同场景:
{
"version": 1,
"llm": {
"default": "main",
"metaAgentProfile": "gate",
"subconsciousProfile": "dream",
"profiles": {
"main": { "provider": "anthropic", "baseUrl": "https://api.anthropic.com", "model": "claude-sonnet-4-20250514", "apiKey": "sk-..." },
"gate": { "provider": "gemini", "baseUrl": "https://generativelanguage.googleapis.com/v1beta", "model": "gemini-2.0-flash", "apiKey": "AIza..." },
"compact": { "provider": "openai", "baseUrl": "https://api.openai.com/v1", "model": "gpt-4.1-mini", "apiKey": "sk-..." }
}
}
}| Profile | 用途 |
|---------|------|
| main(default) | 主对话模型 |
| gate | 工具安全评估(meta-agent,可用便宜快速的模型) |
| compact | 会话压缩摘要 |
llm.metaAgentProfile 可单独指定 meta-agent / 工具安全评估使用哪个 provider profile;未配置时默认尝试 gate。如果该 profile 连接或请求失败,会自动回退到当前默认 LLM 再评估。
llm.subconsciousProfile 可单独指定 subconscious-agent / 心理状态引擎使用哪个 provider profile;未配置时默认使用当前主 LLM。
旧格式(平铺 provider/model/apiKey)仍完全兼容,运行 infiniti-agent upgrade 即可自动升级。
Skills
Skills 是可插拔的能力扩展,本质是 SKILL.md 文件注入到系统提示中:
# 从 GitHub 安装
infiniti-agent skill add owner/repo
# 从本地路径安装
infiniti-agent skill add ./my-skill
# 查看已安装
infiniti-agent skill list你也可以直接在 .infiniti-agent/skills/my-skill/SKILL.md 中手写 skill。
内置工具
Agent 开箱即用以下工具(无需额外配置):
read_file/write_file/str_replace— 文件读写与编辑list_directory/glob_files/grep_files— 目录浏览与搜索bash— 执行 shell 命令http_request— HTTP 请求update_memory— 写入长期记忆
还可以通过 MCP 服务器扩展更多工具。
邮件轮询守护(link)
infiniti-agent link 从当前目录的 SOUL.md 中自动提取邮件相关配置(Agent 地址、Agent ID、API Key),生成一个开箱即用的 mail-poller.sh 守护脚本。
前提: SOUL.md 中需包含以下信息(格式不限,命令会自动识别):
- Agent 地址:
[email protected] - Agent ID:UUID 格式(如
30bc8485-c1af-4fad-b83b-5915c8673632) - API Key:以
amk_开头的密钥
使用方式:
# 生成 mail-poller.sh
infiniti-agent link
# 前台运行(Ctrl-C 停止)
./mail-poller.sh
# 后台运行
nohup ./mail-poller.sh &
# 仅检查一次后退出
./mail-poller.sh --once脚本每 60 秒检查一次 Mail Broker 收件箱,发现未读邮件时自动调用 infiniti-agent cli 处理。运行日志写入 mail-poller.log,终端仅显示单行状态。
无限循环运行示例
除了 link 生成的邮件轮询脚本,你也可以用最简单的方式让 agent 持续运行——cli 模式 + shell 循环:
#!/bin/bash
# loop-agent.sh — 每 60 秒执行一轮 agent 任务
while true; do
infiniti-agent cli "检查 inbox/ 目录下的新文件,处理后移到 done/"
sleep 60
done或用 cron 定时触发:
# crontab -e
*/5 * * * * cd /path/to/project && infiniti-agent cli "检查并处理待办任务"配合 SOUL.md 定义角色 + Skills 扩展能力,每个目录都可以成为一个独立的自动化智能体。
会话管理
- 对话历史自动保存在
.infiniti-agent/session.json - 配置
compaction.autoThresholdTokens可自动压缩过长的对话:
{
"compaction": {
"autoThresholdTokens": 30000
}
}- TUI 中输入
/clear清空当前会话,/compact手动触发压缩
开发
git clone https://github.com/stelee410/infiniti-agent.git
cd infiniti-agent
npm install
npm run dev # 启动 TUI(开发模式)
npm run dev -- cli 你好 # CLI 模式
npm run build && npm link # 全局安装本地版本发布到 npm
npm run build
npm publish # 包名: linkyun-infiniti-agent,命令: infiniti-agent协议
见 package.json 中的 license 字段。
