@runappsai /代理
agent harness:模型↔工具循环、带技能的文件工作区、保存的会话、上下文压缩、JavaScript沙箱——另外还有一个用于网页的完整聊天UI和用于命令行工具的助手。它可以与任何openai兼容的模型API (RunApps, OpenAI, DeepSeek, OpenRouter,你自己的代理),没有运行时依赖。
| 进口 | 什么 | 运行在 |
|---|---|---|
@runappsai/agent | 核心: createAgent, openWorkspace、供应商、工具、技能 | 浏览器、Node、Deno、worker |
@runappsai/agent/ui | 聊天界面: renderChat,下拉菜单,主题 | 吃嫩叶的动物 |
@runappsai/agent/node | 一个文件夹作为工作空间,存储在磁盘上,终端对话框 | 节点18 + |
模仿 π (MIT):压缩提示,编辑匹配,模板参数和技能措辞都来自它。
状态:测试阶段 - API仍有可能改变。
安装
npm i @runappsai/agent
import { createAgent, openWorkspace, defineTool, openAIProvider } from "@runappsai/agent";
import { renderChat } from "@runappsai/agent/ui"; // web pages
import { nodeFS, nodeStore, terminalUI } from "@runappsai/agent/node"; // Node
或者在一个页面中,没有构建步骤-核心和UI在一个脚本中 window.RunAppsAgent:
<script src="https://www.runapps.ai/sdk/agent-latest.js"></script>
(dist/agent-core.umd.js,也 @runappsai/agent/browser/core,是核心。)
快速开始:五分钟内聊天
<div id="assistant" style="height: 640px"></div>
<script src="https://www.runapps.ai/sdk/agent-latest.js"></script>
<script type="module">
// With npm: import { openWorkspace, openAIProvider, defineTool } from "@runappsai/agent";
// import { renderChat } from "@runappsai/agent/ui";
const { renderChat, openWorkspace, openAIProvider, defineTool } = RunAppsAgent;
// 1. Where the model calls go. Keep API keys on your server: point at your own proxy.
const provider = openAIProvider({ baseURL: "/api/llm", models: "fetch" });
// 2. A tool of your app's (optional).
const getTime = defineTool({
name: "get_time",
description: "The current date and time in the user's timezone.",
execute: () => new Date().toString(),
});
// 3. The chat. Each conversation gets its own directory of files in IndexedDB.
const chat = renderChat(document.getElementById("assistant"), {
provider,
model: "gpt-4.1",
appName: "My app",
instructions: "You are the assistant inside My app. Be brief.",
tools: [getTime],
workspace: (sessionId) => openWorkspace(provider, { id: sessionId }),
suggestions: ["What time is it?", "Write a haiku about Mondays"],
});
await chat.ready;
</script>
这是一个完整的助手:流媒体Markdown回复,折叠工具调用,实时“正在做什么”状态,文件附件,文件面板,技能菜单,保存对话,斜杠命令,设置(模型,思维水平,限制),倒带,浅/暗主题。
与 RunApps 相反,用户登录并为自己的使用付费——不需要代理,也不需要密钥。
<script src="https://www.runapps.ai/sdk/latest.js"></script>
<script src="https://www.runapps.ai/sdk/agent-latest.js"></script>
<script type="module">
const client = new RunApps({ project: "my-app" });
const chat = RunAppsAgent.renderChat(document.getElementById("assistant"), {
client,
workspace: (id) => RunAppsAgent.openWorkspace(client, { id }),
});
</script>
快速入门:命令行代理
import { createAgent, openAIProvider, openWorkspace } from "@runappsai/agent";
import { nodeFS, nodeStore, terminalUI } from "@runappsai/agent/node";
const provider = openAIProvider({ baseURL: process.env.OPENAI_BASE_URL, apiKey: process.env.OPENAI_API_KEY, models: "fetch" });
const workspace = await openWorkspace(provider, {
id: "my-project",
dir: nodeFS(process.cwd()), // the agent works in this folder
store: nodeStore(), // sessions and skills in ~/.runapps-agent
});
const agent = createAgent(provider, { workspace, ui: terminalUI() }); // confirmations as y/N in the terminal
agent.on("text_delta", (e) => process.stdout.write(e.delta));
await agent.prompt(process.argv.slice(2).join(" "));
examples/cli.mjs 是一个完整的终端聊天:流,工具调用,确认,会话可以恢复,Ctrl+C停止。看到 节点和命令行.
快速入门:一个没有任何UI的代理
import { createAgent, defineTool, openAIProvider } from "@runappsai/agent";
const provider = openAIProvider({ baseURL: "https://api.deepseek.com/v1", apiKey: process.env.DEEPSEEK_KEY });
const addTodo = defineTool({
name: "add_todo",
description: "Add an item to the user's todo list.",
parameters: {
type: "object",
properties: { text: { type: "string" }, due: { type: "string", description: "YYYY-MM-DD" } },
required: ["text"],
additionalProperties: false,
},
execute: async ({ text, due }) => { await db.todos.add({ text, due }); return `Added "${text}".`; },
});
const agent = createAgent(provider, {
model: "deepseek-chat",
instructions: "You manage the user's todo list.",
tools: [addTodo],
sandbox: false, // no run_js
askUser: false, // no questions back to a user
});
agent.on("text_delta", (e) => process.stdout.write(e.delta));
const result = await agent.prompt("Add 'ship v2' for next Friday");
console.log(result.reason, result.usage);
文档
| 指南 | 里面有什么? |
|---|---|
| 供应商 | 连接模型API: openAIProvider, runappsProvider,编写自己的,错误和重试 |
| 代理 | 运行,转向和排队,停止和继续,事件,权限和对话框,会话,压缩,所有选项 |
| 工具 | defineTool、模式、结果、确认、进度、无处可去的调用、MCP服务器、内置工具 |
| 工作区和文件 | 虚拟目录,安装你的应用程序的数据,一个真实的文件夹,内存和项目笔记,提示模板,pdf文件,更改事件 |
| 技能 | 技能文件夹和压缩,应用程序的技能,懒惰技能,用户的技能,写作描述 |
| 聊天界面 | renderChat 选项和句柄,UI做什么,命令,单对话模式,主题化,下拉框,调试 |
| 节点和命令行 | 一个文件夹作为工作空间,存储在磁盘上,终端对话框,pdf, CLI的例子 |
| API参考 | 所有出口都集中在一个地方 |
examples/chat/index.html 完整的页面是否使用了所有内容(服务于包根并打开? /examples/chat/index.html); examples/cli.mjs 终端版本。
开发
npm install
npm run build # dist/*.js (ESM), dist/{index,ui,node}.cjs, dist/agent.umd.js + agent-core.umd.js (browser)
npm test # node:test on the built output, model calls mocked
许可证
麻省理工学院