🤖 Code-Mode Library: First library for tool calls via code execution
](https://www.npmjs.com/package/@utcp/code-mode)
将您的AI代理从笨重的工具调用者转变为高效的代码执行者——只需3行。
为什么这会改变一切
LLM擅长编写代码,但在工具调用方面遇到了困难。与其直接公开数百个工具,不如给他们一个执行TypeScript代码并访问整个工具包的工具。
苹果, 云耀,以及 人类 与传统的转储函数信息相比,代码模式是一种更有效的工具调用方法,然后提取JSON进行函数调用。
基准测试
独立 Python基准测试研究 通过以下方式验证性能声明 每年节省9536美元的成本 每天1000个场景:
| 场景复杂性 | 传统 | 代码模式 | 改进 |
|---|---|---|---|
| 简单(2-3个工具) | 3次迭代 | 1次执行 | 快67% |
| 中等(4-7工具) | 8次迭代 | 1次执行 | 速度提高75% |
| 复杂(8+工具) | 16次迭代 | 1次执行 | 速度提高88% |
为什么代码模式占主导地位:
批量优势 -单个代码块替换多个API调用\ 认知效率 -LLM擅长代码生成与工具编排\ 计算效率 -操作之间没有上下文重新处理
入门指南
从三行开始
import { CodeModeUtcpClient } from '@utcp/code-mode';
const client = await CodeModeUtcpClient.create(); // 1. Initialize
await client.registerManual({ name: 'github', /* MCP config */ }); // 2. Add tools
const { result } = await client.callToolChain(`/* TypeScript */`); // 3. Execute code就是这样。你的AI代理现在可以在一个请求中执行复杂的工作流,而不是几十个。
所得
渐进式工具发现
// Agent discovers tools dynamically, loads only what it needs
const tools = await client.searchTools('github pull request');
// Instead of 500 tool definitions → 3 relevant tools自然代码执行
const { result, logs } = await client.callToolChain(`
// Chain multiple operations in one request
const pr = await github.get_pull_request({ owner: 'microsoft', repo: 'vscode', pull_number: 1234 });
const comments = await github.get_pull_request_comments({ owner: 'microsoft', repo: 'vscode', pull_number: 1234 });
const reviews = await github.get_pull_request_reviews({ owner: 'microsoft', repo: 'vscode', pull_number: 1234 });
// Process data efficiently in-sandbox
return {
title: pr.title,
commentCount: comments.length,
approvals: reviews.filter(r => r.state === 'APPROVED').length
};
`);
// Single API call replaces 15+ traditional tool calls自动生成的TypeScript接口
namespace github {
interface get_pull_requestInput {
/** Repository owner */
owner: string;
/** Repository name */
repo: string;
/** Pull request number */
pull_number: number;
}
}企业就绪
- 安全VM沙盒 Node.js隔离防止未经授权的访问
- 超时保护 –可配置的执行限制可防止代码失控
- 完全可观测性 –完整的控制台输出捕获和错误处理
- 零外部依赖 –工具只能通过注册的UTCP/MCP服务器访问
- 运行时反思 –自适应工作流的动态界面发现
如果你在一家企业工作,需要支持,请预约咨询 这里.
通用协议支持
适用于 任何工具生态系统:
| 协议 | 描述 | 用法 | |
|---|---|---|---|
| 主控程序 | 模型上下文协议服务器 | call_template_type: 'mcp' | |
| 超文本传输协议 | 具有自动发现功能的REST API | call_template_type: 'http' | \ |
| 文件 | 本地JSON/YAML配置 | call_template_type: 'file' | |
| 命令行界面 | 命令行工具执行 | call_template_type: 'cli' |
安装
npm install @utcp/code-mode更简单:即用型MCP服务器
想要无需任何设置的代码模式吗? 将我们的即插即用MCP服务器与Claude Desktop或任何MCP客户端一起使用:
{
"mcpServers": {
"code-mode": {
"command": "npx",
"args": ["@utcp/code-mode-mcp"],
"env": {
"UTCP_CONFIG_FILE": "/path/to/your/.utcp_config.json"
}
}
}
}就是这样! 无需安装,不需要Node.js知识。这 代码模式MCP服务器 自动:
- 通过下载并运行最新版本
npx - 从JSON加载工具配置
- 为Claude Desktop提供代码执行功能
- 给你
call_tool_chain作为执行TypeScript的MCP工具
非常适合非开发人员 谁想要克劳德桌面的代码模式功能!
直接使用TypeScript
1. MCP服务器集成
连接到任何模型上下文协议服务器:
每call_template_type是一个单独的插件包。安装并导入 启动时打包一次,这样它就可以在客户端注册自己;插件 注册为导入的副作用。对于mcp那是@utcp/mcp. 同样的模式也适用于其他运输方式:@utcp/http,@utcp/text等等。 ``bash npm install @utcp/mcp``
import '@utcp/mcp'; // registers the 'mcp' call template
import { CodeModeUtcpClient } from '@utcp/code-mode';
const client = await CodeModeUtcpClient.create();
// Connect to GitHub MCP server
await client.registerManual({
name: 'github',
call_template_type: 'mcp',
config: {
mcpServers: {
github: {
transport: 'stdio', // required by @utcp/mcp
command: 'docker',
args: ['run', '-i', '--rm', '-e', 'GITHUB_PERSONAL_ACCESS_TOKEN', 'mcp/github'],
env: { GITHUB_PERSONAL_ACCESS_TOKEN: process.env.GITHUB_TOKEN }
}
}
}
});2. 执行多步骤工作流
用单个代码执行替换15+个工具调用:
const { result, logs } = await client.callToolChain(`
// Traditional: 4 separate API round trips → Code Mode: 1 execution
const pr = await github.get_pull_request({ owner: 'microsoft', repo: 'vscode', pull_number: 1234 });
const comments = await github.get_pull_request_comments({ owner: 'microsoft', repo: 'vscode', pull_number: 1234 });
const reviews = await github.get_pull_request_reviews({ owner: 'microsoft', repo: 'vscode', pull_number: 1234 });
const files = await github.get_pull_request_files({ owner: 'microsoft', repo: 'vscode', pull_number: 1234 });
// Process data in-sandbox (no token overhead)
const summary = {
title: pr.title,
state: pr.state,
author: pr.user.login,
stats: {
comments: comments.length,
reviews: reviews.length,
filesChanged: files.length,
approvals: reviews.filter(r => r.state === 'APPROVED').length
},
topDiscussion: comments.slice(0, 3).map(c => ({
author: c.user.login,
preview: c.body.substring(0, 100) + '...'
}))
};
console.log(\`PR "\${pr.title}" analysis complete\`);
return summary;
`);
console.log('Analysis Result:', result);
// console output: 'PR "Fix memory leak in hooks" analysis complete'______________________________________________________________________
高级功能
多协议工具链
在一次执行中混合和匹配不同的工具生态系统:
// Register multiple tool sources
await client.registerManual({ name: 'github', call_template_type: 'mcp', /* config */ });
await client.registerManual({ name: 'slack', call_template_type: 'http', /* config */ });
await client.registerManual({ name: 'db', call_template_type: 'file', file_path: './db-tools.json' }); // This loads a UTCP manual from a json file
const result = await client.callToolChain(`
// Fetch PR data from GitHub (MCP)
const pr = await github.get_pull_request({ owner: 'company', repo: 'api', pull_number: 42 });
// Query deployment status from database (File)
const deployment = await db.get_deployment_status({ pr_id: pr.id });
// Send notification to Slack (HTTP)
await slack.post_message({
channel: '#releases',
text: \`PR #42 "\${pr.title}" deployed to \${deployment.environment}\`
});
return { pr: pr.title, environment: deployment.environment };
`);运行时接口反思
工具可以动态发现和适应可用接口:
const result = await client.callToolChain(`
// Discover available tools at runtime
console.log('Available interfaces:', __interfaces);
// Get specific tool interface for validation
const prInterface = __getToolInterface('github.get_pull_request');
console.log('PR tool expects:', prInterface);
// Use interface info for dynamic workflows
const hasSlackTools = __interfaces.includes('namespace slack');
if (hasSlackTools) {
await slack.post_message({ channel: '#dev', text: 'Analysis complete' });
}
return { toolsAvailable: hasSlackTools };
`);上下文高效数据处理
在不增加模型上下文的情况下处理大型数据集:
const result = await client.callToolChain(`
// Fetch large dataset
const allIssues = await github.list_repository_issues({ owner: 'facebook', repo: 'react' });
console.log('Fetched', allIssues.length, 'total issues');
// Process efficiently in-sandbox
const criticalBugs = allIssues
.filter(issue => issue.labels.some(l => l.name === 'bug'))
.filter(issue => issue.labels.some(l => l.name === 'high priority'))
.map(issue => ({
number: issue.number,
title: issue.title,
author: issue.user.login,
daysOld: Math.floor((Date.now() - new Date(issue.created_at)) / (1000 * 60 * 60 * 24))
}))
.sort((a, b) => b.daysOld - a.daysOld);
// Only return processed summary (not 10,000 raw issues)
return {
totalIssues: allIssues.length,
criticalBugs: criticalBugs.slice(0, 10), // Top 10 oldest critical bugs
summary: \`Found \${criticalBugs.length} critical bugs, oldest is \${criticalBugs[0]?.daysOld} days old\`
};
`);错误处理和可观察性
具有完全透明执行的内置错误处理:
const { result, logs } = await client.callToolChain(`
try {
console.log('Starting multi-step workflow...');
const data = await external_api.fetch_data({ id: 'user-123' });
console.log('Data fetched successfully');
const processed = await data_processor.transform(data);
console.warn('Processing completed with', processed.warnings.length, 'warnings');
return processed;
} catch (error) {
console.error('Workflow failed:', error.message);
throw error; // Propagates to outer error handling
}
`, 30000); // 30-second timeout
// Complete observability
console.log('Result:', result);
console.log('Execution logs:', logs);
// ['Starting multi-step workflow...', 'Data fetched successfully', '[WARN] Processing completed with 2 warnings']自定义超时
为不同的工作负载类型配置执行限制:
// Quick operations (5 seconds)
const quickResult = await client.callToolChain(`return await ping.check();`, 5000);
// Heavy data processing (2 minutes)
const heavyResult = await client.callToolChain(`
const bigData = await database.export_full_dataset();
return await analytics.process_dataset(bigData);
`, 120000);______________________________________________________________________
AI代理集成
与任何AI框架即插即用。内置的提示模板处理所有复杂性:
import { CodeModeUtcpClient } from '@utcp/code-mode';
const systemPrompt = `
You are an AI assistant with access to tools via UTCP CodeMode.
${CodeModeUtcpClient.AGENT_PROMPT_TEMPLATE}
Additional instructions...
`;
// Works with any AI library
const response = await openai.chat.completions.create({
model: 'gpt-4',
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: 'Analyze the latest PR in microsoft/vscode' }
]
});该模板提供了以下方面的全面指导:
- 工具发现工作流程(
searchTools→__interfaces→callToolChain) - 分层访问模式(
manual.tool()语法) - 接口自检(
__getToolInterface()) - 错误处理和最佳实践
______________________________________________________________________
API 参考
核心方法
callToolChain(code: string, timeout?: number)
以完全的工具访问和可观察性执行TypeScript代码。
- 退货:
{result: any, logs: string[]}带有执行结果和捕获的控制台输出 - 默认超时:30秒
getAllToolsTypeScriptInterfaces()
为IDE集成生成完整的TypeScript接口。
- 退货:包含所有命名空间接口定义的字符串
searchTools(query: string) *(来自UtcpClient)*
使用自然语言查询发现工具。
- 退货:一系列带有描述和界面的相关工具
静态方法
CodeModeUtcpClient.create(root_dir?, config?)
使用可选配置创建新的客户端实例。
CodeModeUtcpClient.AGENT_PROMPT_TEMPLATE
AI代理的生产就绪提示模板。
______________________________________________________________________
安全与性能
设计安全
- Node.js虚拟机沙盒 –孤立的执行上下文
- 没有文件系统访问权限 –仅通过注册服务器使用工具
- 超时保护 –可配置的执行限制
- 零网络接入 –没有暴露的外部依赖项或API密钥
性能优化
- 最小内存占用 –VM上下文是轻量级的
- 高效的工具缓存 –TypeScript接口自动缓存
- 流媒体控制台输出 –无缓冲的实时日志捕获
- 标识符净化 –优雅地处理无效的TypeScript标识符
______________________________________________________________________
开发经验
IDE集成
生成TypeScript定义以获得完整的IntelliSense支持:
# Generate tool interfaces
const interfaces = await client.getAllToolsTypeScriptInterfaces();
await fs.writeFile('generated-tools.d.ts', interfaces);
# Add to tsconfig.json
{
"compilerOptions": {
"typeRoots": ["./generated-tools.d.ts"]
}
}调试和监控
生产部署的内置可观察性:
const { result, logs } = await client.callToolChain(userCode);
// Ship logs to your monitoring system
logs.forEach(log => {
if (log.startsWith('[ERROR]')) monitoring.error(log);
if (log.startsWith('[WARN]')) monitoring.warn(log);
});______________________________________________________________________
基准方法
这 全面的Python学习 测试过的 16个现实场景 穿过:
- 财务工作流程 (发票、费用跟踪)
- DevOps运营 (部署、监控)
- 数据处理 (分析、报告)
- 业务自动化 (CRM、通知)
测试模型: 克劳德·海库,双子座闪电侠\ 定价依据: 0.25美元/百万输入,1.25美元/百万输出代币\ 规模: 1000个场景/天=代码模式每年节省9536美元
了解更多
- Cloudflare研究 –原始代码模式白皮书
- 人类学研究 –MCP代码执行优势
- Python基准测试研究 –全面的性能分析
- UTCP规范 –TypeScript官方实现
- 报告问题 –Bug报告和功能请求
许可证
MPL-2.0 –具有商业友好条款的开源。
