@ compiller- dev/ 代理服务器
\|/
╭══════════╮ ___ ___ _ __ ___ _ __ (_) |_ __
║' ▐▌ ▐▌ │ / __|/ _ \| '_ ` _ \| '_ \| | | '__|
║ │ | (__| (_) | | | | | | |_) | | | |
╰─═──────═─╯ \___|\___/|_| |_| |_| .__/|_|_|_|
\________\ | | .dev
|_| agents
用于构建 CLI AI 助手的轻量级多LLM 代理库
[尖叫声] 这个包在β. API在小版本之间可能会有变化.
特征
- 多种LLM 支助:9个供应商 -- -- Claude、OpenAI、双子座、Olama(当地)、共同AI、Groq、烟花、迷惑、OpenRouter
- 17 内建工具: 文件操作、 shash、 grep、 glob、 编辑、 网页获取、 子代理、 待办事宜、 积压等
- 副代理人: 负责复杂任务的Spawn专业代理(9个内置代理类型)
- 11 技能: 用于共同工作流程的可重复使用的快速模板
- 内容管理: 托肯预算编制、收缩、汇总
- 事件串流: 实时执行监测,并输入事件和中止支持
- 锁定: 在环境收缩后幸存的关键信息
- 护栏:15个安全检查内置模式(警报/确认/区块)
- 权限: 带有通配卡的工具级访问控制(始终/会话/接通/拒绝)
- 项目内存自动装入CLAUDE.md、GEMINI.md、CURSOR.md等
- 钩子系统:用于Chat前,Chat后,ToolCall前,ToolCall后的生命周期钩
- 限制费率: 自动重试, 以指数回放
- 类型脚本第一: 严格模式的完整类型安全
安装
npm install @compilr-dev/agents
克劳德的支持:
npm install @compilr-dev/agents @anthropic-ai/sdk
快速启动
import { Agent, MockProvider } from '@compilr-dev/agents';
// Create an agent with a provider
const provider = new MockProvider();
provider.addResponse('Hello! How can I help you today?');
const agent = new Agent({
provider,
systemPrompt: 'You are a helpful assistant.',
});
// Run the agent
const result = await agent.run('Hello!');
console.log(result.response); // "Hello! How can I help you today?"
console.log(result.iterations); // 1
和克劳德
import { Agent, ClaudeProvider } from '@compilr-dev/agents';
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
systemPrompt: 'You are a helpful coding assistant.',
maxIterations: 10,
});
const result = await agent.run('Explain async/await in JavaScript');
console.log(result.response);
核心概念
探员
这个 Agent 类管弦乐 LLM 交互和工具执行 :
import { Agent, ClaudeProvider } from '@compilr-dev/agents';
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: 'your-key' }),
systemPrompt: 'You are a helpful assistant.',
maxIterations: 10, // Default: 10
onEvent: (event) => {
// Real-time execution monitoring
console.log(event.type);
},
});
信件
图书馆提供与对话信息有关的设施:
import {
createUserMessage,
createAssistantMessage,
createToolResultMessage,
getTextContent
} from '@compilr-dev/agents';
// Create messages
const userMsg = createUserMessage('Hello!');
const assistantMsg = createAssistantMessage('Hi there!');
// Extract text from message with multiple content blocks
const text = getTextContent(assistantMsg);
工具
定义代理人可以使用的工具:
import { defineTool, createSuccessResult, createErrorResult } from '@compilr-dev/agents';
const calculatorTool = defineTool({
name: 'calculator',
description: 'Perform basic math operations',
inputSchema: {
type: 'object',
properties: {
operation: { type: 'string', description: 'add, subtract, multiply, divide' },
a: { type: 'number' },
b: { type: 'number' },
},
required: ['operation', 'a', 'b'],
},
execute: async ({ operation, a, b }) => {
switch (operation) {
case 'add': return createSuccessResult(a + b);
case 'subtract': return createSuccessResult(a - b);
case 'multiply': return createSuccessResult(a * b);
case 'divide':
if (b === 0) return createErrorResult('Division by zero');
return createSuccessResult(a / b);
default:
return createErrorResult(`Unknown operation: ${operation}`);
}
},
});
// Register with agent
agent.registerTool(calculatorTool);
工具登记
与登记册管理工具:
import { DefaultToolRegistry, defineTool } from '@compilr-dev/agents';
const registry = new DefaultToolRegistry();
// Register tools
registry.register(myTool);
// Get tool definitions for LLM
const definitions = registry.getDefinitions();
// Execute a tool
const result = await registry.execute('tool_name', { arg: 'value' });
内建工具
文件操作
import { readFileTool, writeFileTool } from '@compilr-dev/agents';
agent.registerTool(readFileTool);
agent.registerTool(writeFileTool);
巴什处决
import { createBashTool } from '@compilr-dev/agents';
const bashTool = createBashTool({
workingDir: '/path/to/project',
timeout: 30000, // 30 seconds
allowedCommands: ['git', 'npm', 'ls'], // Optional whitelist
});
agent.registerTool(bashTool);
事件系统
实时监视代理执行 :
import type { AgentEvent } from '@compilr-dev/agents';
const agent = new Agent({
provider,
onEvent: (event: AgentEvent) => {
switch (event.type) {
case 'iteration_start':
console.log(`Starting iteration ${event.iteration}`);
break;
case 'llm_start':
console.log('LLM thinking...');
break;
case 'llm_end':
console.log(`LLM done, tool uses: ${event.hasToolUses}`);
break;
case 'tool_start':
console.log(`Calling tool: ${event.name}`);
break;
case 'tool_end':
console.log(`Tool result: ${event.result.success}`);
break;
case 'done':
console.log(`Final: ${event.response}`);
break;
}
},
});
流动事件
对于 CLI 应用, 流事件发生时:
for await (const event of agent.stream('Hello!')) {
if (event.type === 'llm_chunk') {
process.stdout.write(event.chunk.text || '');
}
}
中止支持
取消运行的代理 :
const controller = new AbortController();
// Cancel after 5 seconds
setTimeout(() => controller.abort(), 5000);
try {
const result = await agent.run('Complex task...', {
signal: controller.signal,
});
} catch (error) {
if (error instanceof AbortError) {
console.log('Agent was cancelled');
}
}
处理错误
库提供特定错误类型 :
import {
AgentError,
ProviderError,
ToolError,
ValidationError,
MaxIterationsError,
AbortError,
isAgentError,
isProviderError,
isToolError,
wrapError,
} from '@compilr-dev/agents';
try {
await agent.run('...');
} catch (error) {
if (isProviderError(error)) {
console.log(`Provider ${error.provider} failed: ${error.message}`);
} else if (isToolError(error)) {
console.log(`Tool ${error.toolName} failed: ${error.message}`);
} else if (error instanceof MaxIterationsError) {
console.log(`Reached max iterations: ${error.maxIterations}`);
}
}
供应商
内建供应商
import {
ClaudeProvider, // Anthropic Claude
OpenAIProvider, // OpenAI GPT
GeminiProvider, // Google Gemini
OllamaProvider, // Local models (no API key)
TogetherProvider, // Together AI
GroqProvider, // Groq (fast inference)
FireworksProvider, // Fireworks AI
PerplexityProvider, // Perplexity (search-augmented)
OpenRouterProvider, // OpenRouter (multi-provider)
} from '@compilr-dev/agents';
// Claude (recommended)
const claude = new ClaudeProvider({
apiKey: process.env.ANTHROPIC_API_KEY,
model: 'claude-sonnet-4-20250514',
});
// OpenAI
const openai = new OpenAIProvider({
apiKey: process.env.OPENAI_API_KEY,
model: 'gpt-4o',
});
// Gemini
const gemini = new GeminiProvider({
apiKey: process.env.GOOGLE_AI_API_KEY,
model: 'gemini-2.0-flash',
});
// Ollama (local, no API key)
const ollama = new OllamaProvider({
model: 'llama3.1:8b',
baseUrl: 'http://localhost:11434',
});
模拟器(用于测试)
import { MockProvider } from '@compilr-dev/agents';
const provider = new MockProvider();
// Queue responses
provider.addResponse('Simple text response');
provider.addResponse({
text: 'Using a tool...',
toolCalls: [{ id: 'call_1', name: 'my_tool', input: { arg: 'value' } }],
});
// Queue an error
provider.addError(new Error('API failed'));
// Add delay
provider.addResponse('Delayed response', 1000);
// Access history
console.log(provider.history); // All chat() calls
自定义提供者
执行 LLMProvider 接口 :
import type { LLMProvider, Message, ChatOptions, StreamChunk } from '@compilr-dev/agents';
class MyProvider implements LLMProvider {
readonly name = 'my-provider';
async *chat(
messages: Message[],
options?: ChatOptions
): AsyncIterable<StreamChunk> {
// Your implementation
yield { type: 'text', text: 'Response text' };
yield { type: 'end', stopReason: 'end_turn' };
}
async countTokens(messages: Message[]): Promise<number> {
// Optional token counting
return messages.length * 100;
}
}
API 参考
探员
class Agent {
constructor(options: AgentOptions);
// Run agent and return final result
run(userMessage: string, options?: RunOptions): Promise<AgentResult>;
// Stream events during execution
stream(userMessage: string, options?: RunOptions): AsyncIterable<AgentEvent>;
// Tool management
registerTool(tool: Tool): void;
registerTools(tools: Tool[]): void;
getToolDefinitions(): ToolDefinition[];
}
类型
interface AgentOptions {
provider: LLMProvider;
systemPrompt?: string;
maxIterations?: number;
onEvent?: (event: AgentEvent) => void;
}
interface RunOptions {
signal?: AbortSignal;
}
interface AgentResult {
response: string;
iterations: number;
toolCalls: ToolCallInfo[];
}
type AgentEvent =
| { type: 'iteration_start'; iteration: number }
| { type: 'llm_start' }
| { type: 'llm_chunk'; chunk: StreamChunk }
| { type: 'llm_end'; text: string; hasToolUses: boolean }
| { type: 'tool_start'; name: string; input: Record<string, unknown> }
| { type: 'tool_end'; name: string; result: ToolExecutionResult }
| { type: 'iteration_end'; iteration: number }
| { type: 'done'; response: string };
内容管理
在长期代理会话中管理上下文窗口 :
import { ContextManager, DEFAULT_CONTEXT_CONFIG } from '@compilr-dev/agents';
const contextManager = new ContextManager({
provider,
config: {
maxContextTokens: 200000, // Claude's limit
compaction: {
triggerThreshold: 0.5, // Compact at 50% utilization
preserveRecentTurns: 10, // Keep last 10 turns
},
summarization: {
triggerThreshold: 0.9, // Summarize at 90%
preserveRecentMessages: 6,
},
},
onEvent: (event) => {
if (event.type === 'context_warning') {
console.log(`Context at ${event.utilization * 100}%`);
}
},
});
// Track token usage
await contextManager.updateTokenCount(messages);
console.log(`Utilization: ${contextManager.getUtilization() * 100}%`);
// Check if action needed
if (contextManager.needsSummarization()) {
const { messages: summarized } = await contextManager.summarize(
messages,
async (msgs) => 'Summary of conversation...' // Your LLM call
);
}
// Filter large content before adding
const { content, filtered } = contextManager.filterContent(
largeToolResult,
'tool_result'
);
背景战略
| 战略 | 触发 | 可逆转 | 说明 |
|---|---|---|---|
| 过滤 | 添加前 | 不详 | 截断大块内容( > 80K 令牌) |
| 压缩 | 50%或20个转弯 | 对 | 保存旧结果到文件 |
| 总结 | 90% | 没有 | 压缩整个历史 |
锁定器(关键信息持久性)
锁定器是能活过上下文收缩的关键信息. 每一次LLM通话都会自动重新输入:
import { Agent, AnchorManager, ClaudeProvider } from '@compilr-dev/agents';
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
systemPrompt: 'You are a helpful assistant.',
anchors: {
maxAnchors: 20, // Maximum number of anchors
maxTokens: 2000, // Token budget for anchors
includeDefaults: true, // Include safety anchors (git, file operations)
},
});
// Add a session anchor (survives until session ends)
agent.addAnchor({
content: 'User prefers TypeScript with strict mode',
priority: 'critical',
scope: 'session',
});
// Add a persistent anchor (saved to disk)
agent.addAnchor({
content: 'Never modify files in /etc',
priority: 'safety',
scope: 'persistent',
tags: ['filesystem'],
});
// Add a temporary anchor (expires after a time)
agent.addAnchor({
content: 'Currently debugging the auth module',
priority: 'info',
scope: 'temporary',
expiresAt: new Date(Date.now() + 3600000), // 1 hour
});
锁定优先事项
| 优先权 | 说明 | LLM 格式 |
|---|---|---|
critical | 一定要记住 | ### CRITICAL (Must Remember) |
safety | 动作前检查 | ### SAFETY (Check Before Acting) |
info | 背景资料 | ### INFO |
独立的锁定管理器
import { AnchorManager } from '@compilr-dev/agents';
const anchors = new AnchorManager({
maxAnchors: 20,
maxTokens: 2000,
persistPath: '~/.myapp/anchors.json', // Optional persistence
includeDefaults: true,
});
// Add anchors
anchors.add({ content: 'Important info', priority: 'critical', scope: 'session' });
// Query anchors
const critical = anchors.getAll({ priority: 'critical' });
const tagged = anchors.getAll({ tags: ['git'] });
// Format for LLM injection
const formatted = anchors.format();
// Returns:
// ### CRITICAL (Must Remember)
// - Important info
// Monitor token usage
console.log(`Utilization: ${anchors.getUtilization() * 100}%`);
护栏(安全检查)
护卫车是基于模式的安全检查,在工具执行前运行. 他们可以警告、要求确认或阻止危险行动:
import { Agent, ClaudeProvider } from '@compilr-dev/agents';
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
systemPrompt: 'You are a helpful assistant.',
guardrails: {
enabled: true,
includeDefaults: true, // 15 built-in patterns for git, rm, DROP TABLE, etc.
custom: [
{
id: 'no-prod-db',
name: 'Production Database Protection',
description: 'Prevent operations on production database',
patterns: [/prod.*db/i, /production.*database/i],
action: 'block', // 'warn' | 'confirm' | 'block'
message: 'Operations on production database are blocked',
scope: ['bash'], // Optional: limit to specific tools
tags: ['database', 'production'],
},
],
onTriggered: async (result, context) => {
// Handle 'confirm' actions
if (result.action === 'confirm') {
return await askUserConfirmation(result.guardrail.message);
}
return result.action !== 'block';
},
},
});
已建成的护卫铁路
| 身份证 | 行动 | 图案 | 说明 |
|---|---|---|---|
git-reset-hard | 确认 | git reset --hard | 防止意外丢失未承诺的更改 |
git-push-force | 确认 | git push --force | 防止武力向树枝推进 |
rm-rf | 确认 | rm -rf | 防止递归删除 |
rm-root | 块 | rm -rf / | 块删除根文件系统 |
drop-table | 确认 | DROP TABLE | 防止意外删除表格 |
truncate-table | 确认 | TRUNCATE | 防止数据损失 |
delete-where-all | 警告( e) | DELETE FROM 在哪里没有 | 关于删除所有行的警告 |
secrets-env | 警告( e) | API 密钥、密码 | 揭发秘密的警告 |
chmod-777 | 警告( e) | chmod 777 | 对不安全权限的警告 |
curl-pipe-bash | 块 | 库尔 | 击打 |
eval-code | 警告( e) | eval() 模式 | 关于代码注射风险的警告 |
sudo-rm | 确认 | sudo rm | 确认权限删除 |
git-clean | 确认 | git clean -fd | 确认删除未跟踪的文件 |
format-disk | 块 | mkfs, (中文(简体) ), dd | 块磁盘格式化 |
kill-all | 确认 | killall, (中文(简体) ), pkill | 确认杀害过程 |
独立的护栏管理员
import { GuardrailManager, getGuardrailsByTag } from '@compilr-dev/agents';
const guardrails = new GuardrailManager({
enabled: true,
includeDefaults: true,
});
// Check before tool execution
const result = guardrails.check('bash', { command: 'rm -rf /tmp/test' });
if (result.triggered) {
console.log(`Guardrail triggered: ${result.guardrail.name}`);
console.log(`Action: ${result.action}`); // 'warn' | 'confirm' | 'block'
console.log(`Message: ${result.guardrail.message}`);
}
// Check and handle (with confirmation callback)
const { proceed, result } = await guardrails.checkAndHandle('bash', input);
if (!proceed) {
console.log('Operation blocked by guardrail');
}
// Get guardrails by tag
const gitGuardrails = getGuardrailsByTag('git');
const destructiveGuardrails = getGuardrailsByTag('destructive');
// Enable/disable individual guardrails
guardrails.disable('rm-rf');
guardrails.enable('rm-rf');
护卫事件
监测护栏活动:
guardrails.onEvent((event) => {
switch (event.type) {
case 'guardrail:triggered':
console.log(`Guardrail ${event.result.guardrail.name} triggered`);
break;
case 'guardrail:blocked':
console.log('Operation blocked');
break;
case 'guardrail:warning':
console.log('Warning issued');
break;
case 'guardrail:confirmed':
console.log('User confirmed dangerous operation');
break;
case 'guardrail:cancelled':
console.log('User cancelled operation');
break;
}
});
权限( 工具级访问控制)
权限对哪些工具可以执行以及何时需要用户批准提供了精细的控制:
import { Agent, ClaudeProvider } from '@compilr-dev/agents';
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
systemPrompt: 'You are a helpful assistant.',
permissions: {
enabled: true,
defaultLevel: 'always', // Default for tools without rules
includeDefaults: true, // Include default rules for bash, write_file, edit
rules: [
{ toolName: 'bash', level: 'once', description: 'Shell commands' },
{ toolName: 'write_file', level: 'session', description: 'File writes' },
{ toolName: 'delete_*', level: 'deny', description: 'Delete operations' },
],
onPermissionRequest: async (request) => {
// Handle permission requests (e.g., prompt user)
console.log(`Tool: ${request.toolName}`);
console.log(`Preview: ${request.preview}`);
return await askUser(`Allow ${request.toolName}?`);
},
},
});
权限级别
| 职等 | 说明 | 行为 |
|---|---|---|
always | 无需核准 | 工具立即执行 |
session | 每个会话询问一次 | 批准后,工具可以自由运行 |
once | 每次问一次 | 用户必须批准每次执行 |
deny | 总是被封锁 | 无法执行工具 |
通配符图案
权限规则支持可灵活匹配的通配符 :
// Match all tools starting with "delete_"
{ toolName: 'delete_*', level: 'deny' }
// Match all tools ending with "_file"
{ toolName: '*_file', level: 'session' }
// Match tools containing "dangerous"
{ toolName: '*dangerous*', level: 'once' }
独立权限管理器
import { PermissionManager } from '@compilr-dev/agents';
const permissions = new PermissionManager({
enabled: true,
defaultLevel: 'always',
onPermissionRequest: async (request) => {
return await promptUser(request.preview);
},
});
// Add rules dynamically
permissions.addRule({
toolName: 'bash',
level: 'once',
description: 'Shell commands',
tags: ['shell', 'dangerous'],
});
// Check permission before execution
const result = await permissions.check('bash', { command: 'rm -rf /tmp/test' });
if (result.allowed) {
// Proceed with execution
} else {
console.log(`Denied: ${result.reason}`);
}
// Grant session-level permission programmatically
permissions.grantSession('write_file');
// Check if tool has session grant
if (permissions.hasSessionGrant('write_file')) {
console.log('write_file approved for this session');
}
权限事件
监视权限活动 :
permissions.onEvent((event) => {
switch (event.type) {
case 'permission:granted':
console.log(`${event.toolName} allowed`);
break;
case 'permission:denied':
console.log(`${event.toolName} denied`);
break;
case 'permission:asked':
console.log(`Asking about ${event.toolName}`);
break;
case 'permission:session_granted':
console.log(`${event.toolName} approved for session`);
break;
}
});
权限对守护栏
这两个系统都提供安全,但服务于不同的目的:
| 侧面 | 权限 | 护栏 |
|---|---|---|
| 目的 | 访问控制 | 内容安全 |
| 范围 | 工具级别 | 输入模式 |
| 时间安排 | 工具调用前 | 执行前 |
| 典型使用 | "这个工具能运行吗?" | "这个输入安全吗?" |
| 用户交互 | 会议/一经核准 | 确认危险行动 |
将它们一起用于全面安全:
- 权限控制 哪个 可使用工具
- 护卫检查 什麽 输入是安全的
项目记忆(CLAUDE.md,GEMINI.md等)
项目内存会自动从markdown文件中发现并加载项目特定指令. 它支持各种LLM特定命名公约:
| 提供者 | 已搜索文件 |
|---|---|
| 克劳德 | CLAUDE.md, (中文(简体) ), .claude.md, (中文(简体) ), .claude/instructions.md |
| 双子座 | GEMINI.md, (中文(简体) ), .gemini.md, (中文(简体) ), .gemini/instructions.md |
| 开放AI/GPT | OPENAI.md, (中文(简体) ), GPT.md, (中文(简体) ), CHATGPT.md |
| 副驾驶 | COPILOT.md, (中文(简体) ), .github/copilot-instructions.md |
| 光标 | CURSOR.md, (中文(简体) ), .cursorrules, (中文(简体) ), .cursor/rules |
| 常规 | PROJECT.md, (中文(简体) ), INSTRUCTIONS.md, (中文(简体) ), AI.md, (中文(简体) ), CONTEXT.md |
与代理使用
import { Agent, ClaudeProvider } from '@compilr-dev/agents';
// Option 1: Factory method (recommended)
const agent = await Agent.createWithMemory(
{
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
systemPrompt: 'You are a helpful assistant.',
},
{ providers: 'claude', includeGeneric: true },
'/path/to/project' // defaults to cwd
);
// Access loaded memory
const memory = agent.getProjectMemory();
console.log(`Loaded ${memory?.files.length} instruction files`);
// Option 2: Pre-load memory manually
import { ProjectMemoryLoader } from '@compilr-dev/agents';
const loader = new ProjectMemoryLoader({
providers: ['claude', 'gemini'],
includeGeneric: true,
});
const memory = await loader.load('/path/to/project');
const agent = new Agent({
provider,
systemPrompt: 'You are a helpful assistant.',
projectMemory: memory,
});
多供应商
搜索多个 LLM 提供者的指令 :
const agent = await Agent.createWithMemory(
{ provider },
{
providers: ['claude', 'gemini', 'openai'],
includeGeneric: true, // Also search PROJECT.md, AI.md, etc.
combineStrategy: 'concat', // Combine all found files
}
);
项目记忆记录选项
const loader = new ProjectMemoryLoader({
// Provider(s) to search for
providers: 'claude', // or ['claude', 'gemini']
// Include generic patterns (PROJECT.md, AI.md, etc.)
includeGeneric: true,
// Search parent directories up to git root
searchParents: true,
stopAtGitRoot: true,
maxParentDepth: 10,
// How to combine multiple files
combineStrategy: 'concat', // 'concat' | 'priority' | 'dedupe'
// Content limits
maxContentSize: 100000, // 100KB max
// Headers in combined output
includeHeaders: true,
headerFormat: '# From: {relativePath}\n\n',
});
组合策略
| 战略 | 说明 |
|---|---|
concat | 将所有文件与分隔符合并( 默认) |
priority | 只使用最高优先级文件 |
dedupe | 合并但去除重复内容 |
自定义图案
添加您命名常规的自定义文件模式 :
const loader = new ProjectMemoryLoader({
providers: 'claude',
customPatterns: [
{ pattern: 'TEAM-RULES.md', priority: 0, description: 'Team rules' },
{ pattern: '.ai-config.md', priority: 1, description: 'AI config' },
],
});
独立使用
使用没有代理的加载器 :
import {
loadProjectMemory,
hasProjectMemory,
getSupportedProviders,
getProviderPatterns,
} from '@compilr-dev/agents';
// Quick check if memory files exist
if (await hasProjectMemory('/path/to/project', { providers: 'claude' })) {
console.log('Found project instructions!');
}
// Load memory directly
const memory = await loadProjectMemory('/path/to/project', {
providers: ['claude', 'gemini'],
});
console.log(`Loaded ${memory.files.length} files`);
console.log(`Estimated tokens: ${memory.estimatedTokens}`);
// Get patterns for a provider
const patterns = getProviderPatterns('cursor');
// Returns: [{ pattern: 'CURSOR.md', ... }, { pattern: '.cursorrules', ... }]
// List all supported providers
const providers = getSupportedProviders();
// Returns: ['claude', 'anthropic', 'gemini', 'openai', 'gpt', 'copilot', 'cursor', 'codeium']
限制费率
使用自动重试和倒置来防止 API 费率限制 :
import { Agent, ClaudeProvider, createRateLimitedProvider } from '@compilr-dev/agents';
// Wrap any provider with rate limiting
const provider = createRateLimitedProvider(
new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
{
maxRequestsPerMinute: 50,
maxTokensPerMinute: 100000,
maxRetries: 3,
initialBackoffMs: 1000,
maxBackoffMs: 60000,
backoffMultiplier: 2,
onRateLimited: (info) => {
console.log(`Rate limited, waiting ${info.waitMs}ms`);
},
}
);
const agent = new Agent({ provider });
独立限速器
import { RateLimiter } from '@compilr-dev/agents';
const limiter = new RateLimiter({
maxRequestsPerMinute: 60,
maxTokensPerMinute: 100000,
});
// Check before making requests
await limiter.waitForCapacity();
// Record usage after requests
limiter.recordRequest(1500); // tokens used
// Check current state
console.log(`Requests remaining: ${limiter.getAvailableRequests()}`);
console.log(`Tokens remaining: ${limiter.getAvailableTokens()}`);
用法跟踪
代理会话的音轨符号使用情况 :
import { Agent, ClaudeProvider } from '@compilr-dev/agents';
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
usage: {
enabled: true,
warnThresholds: {
inputTokens: 100000,
outputTokens: 50000,
},
onWarning: (warning) => {
console.log(`Usage warning: ${warning.metric} at ${warning.currentValue}`);
},
},
});
// After running the agent
const result = await agent.run('Hello!');
// Get usage stats
const usage = agent.getUsage();
console.log(`Input tokens: ${usage.inputTokens}`);
console.log(`Output tokens: ${usage.outputTokens}`);
console.log(`Total tokens: ${usage.totalTokens}`);
console.log(`Requests: ${usage.requests}`);
排练系统(影响分析)
排练分析执行前潜在的破坏性操作
import { Agent, ClaudeProvider } from '@compilr-dev/agents';
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
rehearsal: {
enabled: true,
gitAnalysis: true, // Analyze git impact
fileAnalysis: true, // Analyze file impact
autoConfirm: false, // Require user confirmation
workingDirectory: '/path/to/project',
onRehearsalComplete: async (result) => {
console.log('=== Rehearsal Report ===');
console.log(`Files affected: ${result.files?.filesAffected || 0}`);
console.log(`Git impact: ${result.git?.summary || 'None'}`);
// Return true to proceed, false to cancel
return await askUserConfirmation('Proceed with these changes?');
},
},
});
// Destructive operations trigger rehearsal automatically
await agent.run('Delete all .log files and reset the git branch');
排练报告
排练系统提供详细的影响分析:
interface RehearsalResult {
files?: {
filesAffected: number;
deletions: string[];
modifications: string[];
creations: string[];
totalSizeImpact: number;
};
git?: {
hasUncommittedChanges: boolean;
uncommittedFiles: string[];
branchesAffected: string[];
commitsAffected: number;
summary: string;
};
riskLevel: 'low' | 'medium' | 'high' | 'critical';
warnings: string[];
}
任务工具( 子代理)
用于复杂任务的外接专门子剂:
import { Agent, ClaudeProvider, createTaskTool } from '@compilr-dev/agents';
const taskTool = createTaskTool({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
agentTypes: {
explore: {
systemPrompt: 'You are a code exploration expert.',
tools: ['read_file', 'glob', 'grep'],
contextMode: 'full', // Inherit full conversation context
},
'code-review': {
systemPrompt: 'You are a code reviewer.',
tools: ['read_file', 'grep'],
contextMode: 'summary', // Get summarized context
},
refactor: {
systemPrompt: 'You are a refactoring expert.',
tools: ['read_file', 'write_file', 'edit'],
contextMode: 'none', // No inherited context
},
},
defaultThoroughness: 'medium', // 'quick' | 'medium' | 'thorough'
maxConcurrentTasks: 3,
});
agent.registerTool(taskTool);
// The LLM can now spawn sub-agents:
// task({ agentType: 'explore', prompt: 'Find all React components' })
内建代理类型
| 类型 | 目的 | 默认工具 |
|---|---|---|
explore | 密码库勘探 | grep, 读取文件 |
code-review | 守则质量审查 | 读取文件, grep |
refactor | 代码重构 | 读取文件、 写入文件、 编辑 |
test-runner | 正在测试 | 点击、 读取文件 |
doc-lookup | 文件搜索 | 读取文件、 grep、 web fatch |
debug | 调试援助 | 读取文件、 grep、 bash |
security-audit | 安全分析 | 读取文件, grep |
plan | 任务规划 | 已读文件, glob |
general | 一般用途 | 所有工具 |
钩子系统
用生命周期钩子扩展代理行为 :
import { Agent, ClaudeProvider, HooksManager } from '@compilr-dev/agents';
const hooks = new HooksManager();
// Before each LLM call
hooks.register('beforeChat', async (context) => {
console.log(`Sending ${context.messages.length} messages`);
// Modify messages if needed
return { messages: context.messages };
});
// After each LLM response
hooks.register('afterChat', async (context) => {
console.log(`Received: ${context.response.text?.slice(0, 50)}...`);
});
// Before tool execution
hooks.register('beforeToolCall', async (context) => {
console.log(`Calling ${context.toolName} with`, context.input);
// Return { skip: true } to skip execution
});
// After tool execution
hooks.register('afterToolCall', async (context) => {
console.log(`${context.toolName} returned:`, context.result);
// Modify result if needed
return { result: context.result };
});
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
hooks,
});
技能
技能是可重复使用的可增强代理能力的即时模板:
import { Agent, ClaudeProvider, SkillsManager, BUILTIN_SKILLS } from '@compilr-dev/agents';
// Use built-in skills
const skills = new SkillsManager({
skills: BUILTIN_SKILLS, // code-review, debug, explain, refactor, planning, security-review
});
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
skills,
});
// Invoke a skill
const result = await agent.run('/skill code-review src/auth.ts');
自定义技能
const customSkills = new SkillsManager({
skills: [
{
name: 'optimize',
description: 'Optimize code for performance',
prompt: `Analyze the following code and suggest performance optimizations:
- Identify bottlenecks
- Suggest algorithmic improvements
- Recommend caching strategies
- Consider memory usage`,
tags: ['performance', 'optimization'],
},
],
});
内建技能
| 技能 | 说明 |
|---|---|
code-review | 附有质量、安全和风格反馈的综合守则审查 |
debug | 分步调试援助 |
explain | 代码功能的明确解释 |
refactor | 以清洁守则原则重构建议 |
planning | 任务分类和执行计划 |
security-review | 安全脆弱性分析 |
追踪日志( L)
以结构化记录监视代理执行 :
import { Agent, ClaudeProvider, TracingManager } from '@compilr-dev/agents';
const tracing = new TracingManager({
enabled: true,
logLevel: 'info', // 'debug' | 'info' | 'warn' | 'error'
destination: 'console', // or 'file' or custom function
filePath: './agent-logs.jsonl',
includeTimestamps: true,
redactPatterns: [/api[_-]?key/i, /password/i], // Redact sensitive data
});
const agent = new Agent({
provider: new ClaudeProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
tracing,
});
// Logs include:
// - LLM requests/responses
// - Tool calls and results
// - Errors and warnings
// - Timing information
打开远程集成
import { createOtelTracing } from '@compilr-dev/agents';
// Export traces to your observability platform
const tracing = createOtelTracing({
serviceName: 'my-agent',
endpoint: 'http://localhost:4318/v1/traces',
});
const agent = new Agent({ provider, tracing });
所需资源
- 节点.js 18岁或以上
- API 密钥 为您选择的提供者( Ollama 除外)
同伴依赖关系
@anthropic-ai/sdk(可选,克劳德)@modelcontextprotocol/sdk(可选,用于MCP)
设计哲学
- 最小依赖性编号:
@anthropic-ai/sdk财务报告和审定财务报表@modelcontextprotocol/sdk作为可选的同位素 - 类型安全: 严格模式的完整类型脚本支持
- 扩展性: 方便添加新的提供者和工具
- 可检验性: 方便单元测试的模拟器
- 实时反馈: CLI 应用程序的事件系统
相关软件包
- @ compiller- dev/ cli (帮助) - AI-动力CLI助理
- @ compiller- dev/ 代理编码 - 特定编码工具(git、runs、代码搜索)
链接
许可证
FSL-1.1-MIT 导弹 - 看到没 自由主义 详细情况。 每版本2年后转换为麻省理工学院.
建造时小心 编译器.dev