Build AI tools first. Compose agents when you need them.
Quick Start · Mental Model · Choose a Primitive · Capability Ladder · Providers · Examples · Docs
العربية · বাংলা · Deutsch · Español · Français · हिन्दी · Indonesia · 日本語 · 한국어 · Nederlands · ਪੰਜਾਬੀ · Polski · Português · Русский · Svenska · తెలుగు · ไทย · Türkçe · Українська · 粵語 · 简体中文 · 繁體中文
______________________________________________________________________
openFunctions是一个MIT许可的TypeScript框架,用于构建AI可调用工具并通过以下方式公开它们 主控程序聊天适配器、工作流和代理。它的核心运行时很简单:
ToolDefinition -> ToolRegistry -> AIAdapter
其他一切都在这之上:
workflows是围绕工具的确定性编排agents是经过筛选的注册表上的LLM循环structured output是一种合成工具模式memory和rag是可以封装回工具中的有状态系统
如果您了解工具运行时,框架的其余部分将保持清晰。
defineTool() -> registry.register() -> adapter/server executes tool
-> workflows compose tools
-> agents use filtered tools
-> memory/rag expose more tools快速开始
git clone https://github.com/Tom-R-Main/openFunctions.git
cd openFunctions
bash setup.sh
cp .env.example .env
npm run test-tools首先要构建的是工具,而不是代理。
心理模型
工具是您的业务逻辑加上AI可以读取的模式:
import { defineTool, ok } from "../framework/index.js";
export const rollDice = defineTool({
name: "roll_dice",
description: "Roll a dice with the given number of sides",
inputSchema: {
type: "object",
properties: {
sides: { type: "number", description: "Number of sides (default 6)" },
},
},
handler: async ({ sides }) => {
const rolled = Math.floor(Math.random() * ((sides as number) || 6)) + 1;
return ok({ rolled });
},
});一个定义可以是:
- 直接执行
registry.execute() - 通过MCP暴露于Claude/Desktop
- 在交互式聊天循环中使用
- 组成工作流
- 过滤到特定于代理的注册表中
阅读更多: 建筑
选择正确的图元
| 使用这个 | 当你想要的时候 | 它到底是什么 |
|---|---|---|
defineTool() | 面向人工智能的可调用业务逻辑 | 核心原语 |
createChatAgent() | 一个可组合、可嵌入的AI代理 | 工具+内存+上下文+适配器在一个配置中 |
pipe() | 确定性编排 | 代码驱动工具/LLM管道 |
defineAgent() | 自适应多步工具使用 | 在过滤注册表上的LLM循环 |
createConversationMemory() / createFactMemory() | 线程/事实状态 | 持久性和内存工具 |
createRAG() | 语义文档检索 | pgvector+嵌入+工具 |
connectProvider() | 外部系统上下文 | 来自ExecuFunction、Obsidian等的结构化工具。 |
createStore() / createPgStore() | 持久性 | 存储层,而非检索层 |
经验法则:
- 从工具开始。
- 使用
createChatAgent()当你想要一个具有内存和上下文的完整代理时。 - 当你知道顺序时,使用工作流。
- 使用
defineAgent()当你需要团队中的专业特工时。 - 为您控制的状态添加内存。
- 添加RAG用于按含义检索文档。
- 当您需要外部系统(任务、日历、CRM)时,添加上下文提供程序。
能力阶梯
1.构建一个工具
npm run create-tool expense_tracker编辑 src/my-tools/expense_tracker.ts,然后运行:
npm run test-tools
npm test2.通过MCP或聊天公开
npm start
npm run chat -- gemini同一注册机构为两者提供权力。
3.用工作流编写
工作流是默认的“高级”原语,因为控制流保持显式:
import { pipe, toolStep, llmStep } from "./framework/index.js";
const research = pipe(toolStep(registry, "define_word"))
.then(async (result) => result.data?.meanings?.[0] ?? "")
.then(llmStep(adapter, registry, "Explain this simply: {{input}}"));
await research.run({ word: "ephemeral" });4.构建聊天代理
createChatAgent() 将工具、内存、上下文提供程序和AI适配器组合到一个可嵌入的代理中:
import { createChatAgent } from "./framework/index.js";
const agent = await createChatAgent({
provider: "gemini",
preset: "study-buddy",
memory: true, // conversation + fact memory (on by default)
providers: ["execufunction"], // connect external context
});
// Use it four ways:
await agent.interactive(); // CLI
const result = await agent.chat("Create a task"); // programmatic
for await (const chunk of agent.chat("hello", { stream: true })) { ... } // streaming
await agent.serve({ port: 3000 }); // HTTP server相同的配置适用于代码、CLI标志或YAML文件。默认情况下,内存是打开的——代理会跨会话进行记忆。
5.添加代理的自适应行为
defineAgent() 适用于团队和工作流程中的专业代理——过滤注册表和推理循环:
import { defineAgent } from "./framework/index.js";
const researcher = defineAgent({
name: "researcher",
role: "Research Analyst",
goal: "Find accurate information using available tools",
toolTags: ["search"],
});当多个专业代理需要协作时,使用团队。
6.仅在需要时添加状态
坚持不懈:
const tasks = createStore("tasks");
const tasksPg = await createPgStore("tasks");内存:
const conversations = createConversationMemory();
const facts = createFactMemory();
registry.registerAll(createMemoryTools(conversations, facts));抹布:
const rag = await createRAG({ embeddingProvider: "gemini" });
registry.registerAll(rag.createTools());RAG文件: docs/RAG.md
7.连接外部环境
上下文提供者将外部系统(任务管理器、日历、CRM、知识库)作为工具引入代理运行时:
import { connectProvider, contextPrompt } from "./framework/index.js";
import { createExecuFunctionProvider } from "./providers/execufunction/index.js";
// Connect — registers 17 tools tagged "context" + "context:execufunction"
const exf = await connectProvider(
createExecuFunctionProvider({ token: process.env.EXF_PAT }),
registry,
);
// Inject active tasks + upcoming events into agent system prompts
const context = await contextPrompt([exf]);这 ContextProvider 接口是可插拔的——实现 metadata, connect(),以及 createTools() 将任何后端引入框架。请参阅 建筑 对于完整的界面。
| 提供者 | 状态 | 功能 |
|---|---|---|
| 执行功能 | 内置 | 任务、项目、日历、知识、人员、组织、代码库 |
| 黑曜石 | 模板(计划) | 知识 |
| 概念 | 模板(计划) | 知识、任务、项目 |
命令
npm run test-tools # Interactive CLI — test tools locally
npm run dev # Dev mode — auto-restarts on save
npm test # Run tool-defined automated tests
npm run chat # Chat with AI using your tools
npm run chat -- gemini # Force a specific provider
npm run chat -- --no-memory # Chat without persistent memory
npm run create-tool # Scaffold a new tool
npm run docs # Generate tool reference docs
npm run inspect # MCP Inspector web UI
npm start # Start MCP server for Claude Desktop / Cursor提供商
在中设置一个API密钥 .env 聊天循环将自动检测提供者。
| 提供程序 | 默认模型 | API |
|---|---|---|
| 双子座 | gemini-3-flash-preview | 函数调用 |
| OpenAI | gpt-5.5 | 响应API |
| 人类学 | claude-sonnet-4-6 | 消息+工具_使用 |
| xAI | grok-4.20-0309-reasoning | 响应API |
| OpenRouter | google/gemini-3-flash-preview | OpenAI兼容 |
示例:
npm run chat
npm run chat -- gemini
npm run chat -- openai gpt-5.5
npm run chat -- gemini --prompt study-buddy测试
使用工具定义进行实时测试:
defineTool({
name: "create_task",
// ...
tests: [
{ name: "creates a task", input: { title: "Read ch5", subject: "Bio" }, expect: { success: true } },
{ name: "fails without subject", input: { title: "Read ch5" }, expect: { success: false } },
],
});注册表在处理程序运行之前验证参数,因此模式错误被清晰地显示出来,以便人类和LLM进行恢复。
示例
| 域 | 工具 | 模式 |
|---|---|---|
| 研究跟踪器 | create_task, list_tasks, complete_task | CRUD+存储 |
| 书签管理器 | save_link, search_links, tag_link | 数组+搜索 |
| 食谱管理员 | save_recipe, search_recipes, get_random | 嵌套数据+随机 |
| 费用拆分器 | add_expense, split_bill, get_balances | 数学+计算 |
| 锻炼记录仪 | log_workout, get_stats, suggest_workout | 日期过滤+统计 |
| 词典 | define_word, find_synonyms | 外部API(无密钥) |
| 测验生成器 | create_quiz, answer_question, get_score | 有状态的游戏 |
| AI工具 | summarize_text, generate_flashcards | 工具调用LLM |
| 公用事业 | calculate, convert_units, format_date | 无国籍助手 |
文档
集成
Siftable上下文提供程序
src/providers/execufunction/ 暴露 可筛分 (前身为ExecuFunction)作为openFunctions ContextProvider. 提供者包装已发布的 @siftable/mcp-server SDK;今天公开了10个域中的31个工具(任务、日历、应用程序等), 知识、项目、人员、组织、代码库、工作项、保管库, 数据集、代码存储器)。可以访问完整的SDK表面(~111个方法) 通过 client.raw() 适用于任何尚未包装的工具。
import { connectProvider, registry } from "openfunction/framework";
import { createSiftableProvider } from "openfunction/providers/execufunction";
const sift = await connectProvider(createSiftableProvider(), registry);身份验证解析:显式 { token } 论点→ SIFT_PAT env → EXF_PAT env(遗留回退)。相同的回退链 SIFT_API_URL 和 SIFT_WORKSPACE_ID.
跑 tsx scripts/test-siftable-live.ts (与 SIFT_PAT 设置)到 根据您的帐户验证提供商是否实际往返。
张开爪桥
src/framework/openclaw.ts 出口 toOpenclawTools(registry),其中 转换openFunctions ToolRegistry 变成了openclaw的形状 api.registerTool() 期待。运行时不依赖于 @openclaw/plugin-sdk --桥在局部定义了兼容的形状, 因此,该框架保持独立。
有两个参考插件 plugins/:
openclaw-execufunction/--可筛分开爪。现代化到
包裹 @siftable/mcp-server 直接;解决 SIFT_PAT 首先,然后 遗产 EXF_PAT插件id为 execufunction 背部与 现有的openclaw配置。
openclaw-openfunctions/--显示以下内容的参考插件
toOpenclawTools 这座桥上有一个手工制作的小登记处。标记 private:true;使用对托管框架的相对导入 (在发布之前,请阅读其README以了解需要更改的内容)。
在openclaw中安装Siftable插件:
openclaw plugins install @openfunctions/openclaw-execufunction集 SIFT_PAT (或遗产 EXF_PAT)在环境中或通过openclaw 插件设置。
项目结构
openFunctions/
├── src/
│ ├── framework/ # Core runtime + composition layers
│ │ ├── chat-agent.ts # createChatAgent() — composable chat agent factory
│ │ ├── chat-agent-types.ts # ChatAgent, ChatAgentConfig, ChatResult types
│ │ ├── chat-agent-resolve.ts # Config resolution, provider auto-detection
│ │ ├── chat-agent-http.ts # HTTP server for agent.serve()
│ │ ├── context.ts # Context provider interface
│ │ └── ... # tool, registry, agents, memory, rag, workflows
│ ├── providers/
│ │ └── execufunction/ # Siftable context provider (wraps @siftable/mcp-server)
│ ├── examples/ # Reference tool patterns
│ ├── my-tools/ # Your tools
│ └── index.ts # MCP entrypoint
├── plugins/
│ ├── openclaw-execufunction/ # Siftable plugin for openclaw (publishable)
│ └── openclaw-openfunctions/ # Reference: toOpenclawTools bridge demo (private)
├── docs/ # Architecture docs
├── scripts/ # chat, create-tool, docs
├── test-client/ # CLI tester + test runner
├── system-prompts/ # Prompt presets
└── package.json许可证
麻省理工学院——见 许可证
