@bowenqt/qiniu-ai-sdk 0.10.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +225 -0
- package/dist/ai/agent-graph.d.ts +99 -0
- package/dist/ai/agent-graph.d.ts.map +1 -0
- package/dist/ai/agent-graph.js +321 -0
- package/dist/ai/agent-graph.js.map +1 -0
- package/dist/ai/agent-graph.mjs +317 -0
- package/dist/ai/generate-text.d.ts +51 -0
- package/dist/ai/generate-text.d.ts.map +1 -1
- package/dist/ai/generate-text.js +132 -0
- package/dist/ai/generate-text.js.map +1 -1
- package/dist/ai/generate-text.mjs +131 -0
- package/dist/ai/graph/checkpointer.d.ts +112 -0
- package/dist/ai/graph/checkpointer.d.ts.map +1 -0
- package/dist/ai/graph/checkpointer.js +131 -0
- package/dist/ai/graph/checkpointer.js.map +1 -0
- package/dist/ai/graph/checkpointer.mjs +126 -0
- package/dist/ai/graph/index.d.ts +13 -0
- package/dist/ai/graph/index.d.ts.map +1 -0
- package/dist/ai/graph/index.js +22 -0
- package/dist/ai/graph/index.js.map +1 -0
- package/dist/ai/graph/index.mjs +12 -0
- package/dist/ai/graph/postgres-checkpointer.d.ts +54 -0
- package/dist/ai/graph/postgres-checkpointer.d.ts.map +1 -0
- package/dist/ai/graph/postgres-checkpointer.js +134 -0
- package/dist/ai/graph/postgres-checkpointer.js.map +1 -0
- package/dist/ai/graph/postgres-checkpointer.mjs +130 -0
- package/dist/ai/graph/redis-checkpointer.d.ts +51 -0
- package/dist/ai/graph/redis-checkpointer.d.ts.map +1 -0
- package/dist/ai/graph/redis-checkpointer.js +124 -0
- package/dist/ai/graph/redis-checkpointer.js.map +1 -0
- package/dist/ai/graph/redis-checkpointer.mjs +120 -0
- package/dist/ai/graph/state-graph.d.ts +41 -0
- package/dist/ai/graph/state-graph.d.ts.map +1 -0
- package/dist/ai/graph/state-graph.js +149 -0
- package/dist/ai/graph/state-graph.js.map +1 -0
- package/dist/ai/graph/state-graph.mjs +144 -0
- package/dist/ai/graph/types.d.ts +41 -0
- package/dist/ai/graph/types.d.ts.map +1 -0
- package/dist/ai/graph/types.js +10 -0
- package/dist/ai/graph/types.js.map +1 -0
- package/dist/ai/graph/types.mjs +7 -0
- package/dist/ai/internal-types.d.ts +109 -0
- package/dist/ai/internal-types.d.ts.map +1 -0
- package/dist/ai/internal-types.js +28 -0
- package/dist/ai/internal-types.js.map +1 -0
- package/dist/ai/internal-types.mjs +23 -0
- package/dist/ai/nodes/execute-node.d.ts +27 -0
- package/dist/ai/nodes/execute-node.d.ts.map +1 -0
- package/dist/ai/nodes/execute-node.js +118 -0
- package/dist/ai/nodes/execute-node.js.map +1 -0
- package/dist/ai/nodes/execute-node.mjs +114 -0
- package/dist/ai/nodes/index.d.ts +8 -0
- package/dist/ai/nodes/index.d.ts.map +1 -0
- package/dist/ai/nodes/index.js +16 -0
- package/dist/ai/nodes/index.js.map +1 -0
- package/dist/ai/nodes/index.mjs +7 -0
- package/dist/ai/nodes/memory-node.d.ts +34 -0
- package/dist/ai/nodes/memory-node.d.ts.map +1 -0
- package/dist/ai/nodes/memory-node.js +164 -0
- package/dist/ai/nodes/memory-node.js.map +1 -0
- package/dist/ai/nodes/memory-node.mjs +158 -0
- package/dist/ai/nodes/predict-node.d.ts +42 -0
- package/dist/ai/nodes/predict-node.d.ts.map +1 -0
- package/dist/ai/nodes/predict-node.js +89 -0
- package/dist/ai/nodes/predict-node.js.map +1 -0
- package/dist/ai/nodes/predict-node.mjs +86 -0
- package/dist/ai/nodes/types.d.ts +44 -0
- package/dist/ai/nodes/types.d.ts.map +1 -0
- package/dist/ai/nodes/types.js +6 -0
- package/dist/ai/nodes/types.js.map +1 -0
- package/dist/ai/nodes/types.mjs +5 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +80 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +34 -0
- package/dist/lib/otel-tracer.d.ts +47 -0
- package/dist/lib/otel-tracer.d.ts.map +1 -0
- package/dist/lib/otel-tracer.js +79 -0
- package/dist/lib/otel-tracer.js.map +1 -0
- package/dist/lib/otel-tracer.mjs +75 -0
- package/dist/lib/token-estimator.d.ts +62 -0
- package/dist/lib/token-estimator.d.ts.map +1 -0
- package/dist/lib/token-estimator.js +106 -0
- package/dist/lib/token-estimator.js.map +1 -0
- package/dist/lib/token-estimator.mjs +100 -0
- package/dist/lib/tool-registry.d.ts +103 -0
- package/dist/lib/tool-registry.d.ts.map +1 -0
- package/dist/lib/tool-registry.js +159 -0
- package/dist/lib/tool-registry.js.map +1 -0
- package/dist/lib/tool-registry.mjs +154 -0
- package/dist/lib/tracer.d.ts +85 -0
- package/dist/lib/tracer.d.ts.map +1 -0
- package/dist/lib/tracer.js +170 -0
- package/dist/lib/tracer.js.map +1 -0
- package/dist/lib/tracer.mjs +161 -0
- package/dist/lib/types.d.ts +11 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/modules/mcp/adapter.d.ts +23 -0
- package/dist/modules/mcp/adapter.d.ts.map +1 -0
- package/dist/modules/mcp/adapter.js +63 -0
- package/dist/modules/mcp/adapter.js.map +1 -0
- package/dist/modules/mcp/adapter.mjs +58 -0
- package/dist/modules/mcp/client.d.ts +75 -0
- package/dist/modules/mcp/client.d.ts.map +1 -0
- package/dist/modules/mcp/client.js +300 -0
- package/dist/modules/mcp/client.js.map +1 -0
- package/dist/modules/mcp/client.mjs +295 -0
- package/dist/modules/mcp/http-transport.d.ts +51 -0
- package/dist/modules/mcp/http-transport.d.ts.map +1 -0
- package/dist/modules/mcp/http-transport.js +146 -0
- package/dist/modules/mcp/http-transport.js.map +1 -0
- package/dist/modules/mcp/http-transport.mjs +141 -0
- package/dist/modules/mcp/index.d.ts +11 -0
- package/dist/modules/mcp/index.d.ts.map +1 -0
- package/dist/modules/mcp/index.js +34 -0
- package/dist/modules/mcp/index.js.map +1 -0
- package/dist/modules/mcp/index.mjs +14 -0
- package/dist/modules/mcp/oauth.d.ts +101 -0
- package/dist/modules/mcp/oauth.d.ts.map +1 -0
- package/dist/modules/mcp/oauth.js +347 -0
- package/dist/modules/mcp/oauth.js.map +1 -0
- package/dist/modules/mcp/oauth.mjs +304 -0
- package/dist/modules/mcp/token-store.d.ts +69 -0
- package/dist/modules/mcp/token-store.d.ts.map +1 -0
- package/dist/modules/mcp/token-store.js +174 -0
- package/dist/modules/mcp/token-store.js.map +1 -0
- package/dist/modules/mcp/token-store.mjs +135 -0
- package/dist/modules/mcp/types.d.ts +91 -0
- package/dist/modules/mcp/types.d.ts.map +1 -0
- package/dist/modules/mcp/types.js +14 -0
- package/dist/modules/mcp/types.js.map +1 -0
- package/dist/modules/mcp/types.mjs +11 -0
- package/dist/modules/skills/index.d.ts +7 -0
- package/dist/modules/skills/index.d.ts.map +1 -0
- package/dist/modules/skills/index.js +14 -0
- package/dist/modules/skills/index.js.map +1 -0
- package/dist/modules/skills/index.mjs +6 -0
- package/dist/modules/skills/loader.d.ts +51 -0
- package/dist/modules/skills/loader.d.ts.map +1 -0
- package/dist/modules/skills/loader.js +237 -0
- package/dist/modules/skills/loader.js.map +1 -0
- package/dist/modules/skills/loader.mjs +198 -0
- package/dist/modules/skills/types.d.ts +60 -0
- package/dist/modules/skills/types.d.ts.map +1 -0
- package/dist/modules/skills/types.js +20 -0
- package/dist/modules/skills/types.js.map +1 -0
- package/dist/modules/skills/types.mjs +17 -0
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -13,6 +13,11 @@ TypeScript SDK for Qiniu Cloud AI Token API.
|
|
|
13
13
|
- 📋 **JSON Mode** - Structured output with `response_format`
|
|
14
14
|
- 🔌 **Vercel AI SDK Adapter** - Drop-in replacement for Vercel AI SDK
|
|
15
15
|
- 📦 **TypeScript First** - Full type definitions included
|
|
16
|
+
- 🧠 **Skills** - Markdown-based agent knowledge injection
|
|
17
|
+
- 🔗 **MCP Client** - Model Context Protocol stdio + HTTP transport
|
|
18
|
+
- 🔐 **OAuth 2.0** - PKCE and Device Code flows for MCP HTTP
|
|
19
|
+
- 💾 **Checkpointer** - Save/restore state: Memory, Redis, PostgreSQL
|
|
20
|
+
- 📊 **Tracing** - OpenTelemetry integration with per-node spans
|
|
16
21
|
|
|
17
22
|
## Requirements
|
|
18
23
|
|
|
@@ -237,6 +242,226 @@ try {
|
|
|
237
242
|
}
|
|
238
243
|
```
|
|
239
244
|
|
|
245
|
+
## Agent SDK (Agentic Layer)
|
|
246
|
+
|
|
247
|
+
Phase 2 introduces advanced agentic capabilities with Skills injection, MCP integration, and Graph-based execution.
|
|
248
|
+
|
|
249
|
+
### generateTextWithGraph
|
|
250
|
+
|
|
251
|
+
Extended version of `generateText` with Skills, context compaction, and Graph events:
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
import { QiniuAI, generateTextWithGraph, SkillLoader } from '@bowenqt/qiniu-ai-sdk';
|
|
255
|
+
|
|
256
|
+
const client = new QiniuAI({ apiKey: process.env.QINIU_API_KEY });
|
|
257
|
+
|
|
258
|
+
// Load skills
|
|
259
|
+
const loader = new SkillLoader({ skillsDir: './skills' });
|
|
260
|
+
const skills = await loader.loadAll();
|
|
261
|
+
|
|
262
|
+
const result = await generateTextWithGraph({
|
|
263
|
+
client,
|
|
264
|
+
model: 'deepseek-v3',
|
|
265
|
+
messages: [{ role: 'user', content: 'Help me with Git' }],
|
|
266
|
+
skills, // Injected into system prompt
|
|
267
|
+
maxContextTokens: 32000, // Automatic context compaction
|
|
268
|
+
onStepFinish: (step) => console.log(step.type, step.content),
|
|
269
|
+
onNodeEnter: (node) => console.log(`Entering: ${node}`),
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
console.log(result.text);
|
|
273
|
+
console.log(result.graphInfo?.skillsInjected); // ['git-workflow', ...]
|
|
274
|
+
|
|
275
|
+
// Check if compaction occurred
|
|
276
|
+
if (result.graphInfo?.compaction?.occurred) {
|
|
277
|
+
console.log('Dropped skills:', result.graphInfo.compaction.droppedSkills);
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Context Compaction**: When `maxContextTokens` is set, the SDK automatically:
|
|
282
|
+
- Estimates tokens using CJK-aware algorithm (1.5x weight for Chinese/Japanese/Korean)
|
|
283
|
+
- Drops low-priority skills first when context exceeds budget
|
|
284
|
+
- Preserves tool call/result pairs (never orphaned)
|
|
285
|
+
- Reports dropped content in `graphInfo.compaction`
|
|
286
|
+
|
|
287
|
+
### Skills
|
|
288
|
+
|
|
289
|
+
Load and inject agent skills (Markdown-based knowledge):
|
|
290
|
+
|
|
291
|
+
```typescript
|
|
292
|
+
import { SkillLoader } from '@bowenqt/qiniu-ai-sdk';
|
|
293
|
+
|
|
294
|
+
const loader = new SkillLoader({
|
|
295
|
+
skillsDir: './skills',
|
|
296
|
+
maxFileSize: 64 * 1024, // 64KB limit
|
|
297
|
+
allowedExtensions: ['.md', '.txt'],
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// Load single skill
|
|
301
|
+
const skill = await loader.load('git-workflow');
|
|
302
|
+
console.log(skill.name, skill.tokenCount);
|
|
303
|
+
|
|
304
|
+
// Load all skills (sorted by name)
|
|
305
|
+
const allSkills = await loader.loadAll();
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Skill format (SKILL.md):
|
|
309
|
+
```markdown
|
|
310
|
+
---
|
|
311
|
+
name: git-workflow
|
|
312
|
+
description: Git best practices
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
# Git Workflow
|
|
316
|
+
|
|
317
|
+
Always use conventional commits...
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### MCP Client (stdio)
|
|
321
|
+
|
|
322
|
+
Connect to Model Context Protocol servers:
|
|
323
|
+
|
|
324
|
+
```typescript
|
|
325
|
+
import { MCPClient } from '@bowenqt/qiniu-ai-sdk';
|
|
326
|
+
|
|
327
|
+
const mcpClient = new MCPClient({
|
|
328
|
+
servers: [
|
|
329
|
+
{
|
|
330
|
+
name: 'github',
|
|
331
|
+
transport: 'stdio',
|
|
332
|
+
command: 'npx',
|
|
333
|
+
args: ['-y', '@modelcontextprotocol/server-github'],
|
|
334
|
+
token: process.env.GITHUB_TOKEN, // → MCP_BEARER_TOKEN env
|
|
335
|
+
},
|
|
336
|
+
],
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
await mcpClient.connect();
|
|
340
|
+
const tools = mcpClient.getAllTools();
|
|
341
|
+
console.log(tools.map(t => t.name));
|
|
342
|
+
|
|
343
|
+
// Use tools with generateText
|
|
344
|
+
const registeredTools = adaptMCPToolsToRegistry(tools, 'github', mcpClient);
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
> **Note**: Bearer token is injected via `MCP_BEARER_TOKEN` environment variable for stdio transport.
|
|
348
|
+
|
|
349
|
+
### MCP Client (HTTP + OAuth 2.0)
|
|
350
|
+
|
|
351
|
+
Connect to remote MCP servers with OAuth authentication:
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
import {
|
|
355
|
+
MCPClient,
|
|
356
|
+
PKCEFlow,
|
|
357
|
+
TokenManager,
|
|
358
|
+
MemoryTokenStore
|
|
359
|
+
} from '@bowenqt/qiniu-ai-sdk';
|
|
360
|
+
|
|
361
|
+
// Step 1: Obtain tokens via PKCE flow
|
|
362
|
+
const oauthConfig = {
|
|
363
|
+
clientId: 'my-app',
|
|
364
|
+
scopes: ['mcp:read', 'mcp:write'],
|
|
365
|
+
authorizationUrl: 'https://auth.example.com/authorize',
|
|
366
|
+
tokenUrl: 'https://auth.example.com/token',
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
const pkceFlow = new PKCEFlow(oauthConfig);
|
|
370
|
+
const state = generateState();
|
|
371
|
+
const authUrl = pkceFlow.buildAuthorizationUrl('http://localhost:3000/callback', state);
|
|
372
|
+
// Redirect user to authUrl...
|
|
373
|
+
|
|
374
|
+
// After callback:
|
|
375
|
+
const { code } = await pkceFlow.waitForCallback({ expectedState: state, timeoutMs: 300000 });
|
|
376
|
+
const tokens = await pkceFlow.exchangeCode(code, 'http://localhost:3000/callback');
|
|
377
|
+
|
|
378
|
+
// Step 2: Set up TokenManager
|
|
379
|
+
const tokenManager = new TokenManager(new MemoryTokenStore(), oauthConfig);
|
|
380
|
+
await tokenManager.setTokens(tokens);
|
|
381
|
+
|
|
382
|
+
// Step 3: Connect with tokenProvider
|
|
383
|
+
const mcpClient = new MCPClient({
|
|
384
|
+
servers: [
|
|
385
|
+
{
|
|
386
|
+
name: 'remote-server',
|
|
387
|
+
transport: 'http',
|
|
388
|
+
url: 'https://mcp.example.com/mcp',
|
|
389
|
+
tokenProvider: () => tokenManager.getAccessToken(),
|
|
390
|
+
oauth: oauthConfig, // Required: validates auth is configured
|
|
391
|
+
},
|
|
392
|
+
],
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
await mcpClient.connect();
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
> **Note**: If `oauth` is configured without `token` or `tokenProvider`, MCPClient throws an error to prevent unauthenticated connections.
|
|
399
|
+
|
|
400
|
+
### Checkpointer
|
|
401
|
+
|
|
402
|
+
Save and restore conversation state:
|
|
403
|
+
|
|
404
|
+
```typescript
|
|
405
|
+
import { MemoryCheckpointer, deserializeCheckpoint } from '@bowenqt/qiniu-ai-sdk';
|
|
406
|
+
|
|
407
|
+
const checkpointer = new MemoryCheckpointer({ maxItems: 100 });
|
|
408
|
+
|
|
409
|
+
// Save checkpoint
|
|
410
|
+
const metadata = await checkpointer.save('thread-123', agentState);
|
|
411
|
+
|
|
412
|
+
// Load latest checkpoint
|
|
413
|
+
const checkpoint = await checkpointer.load('thread-123');
|
|
414
|
+
if (checkpoint) {
|
|
415
|
+
const restored = deserializeCheckpoint(checkpoint, toolsMap);
|
|
416
|
+
// Resume from restored state
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// List all checkpoints
|
|
420
|
+
const list = await checkpointer.list('thread-123');
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Redis/PostgreSQL Checkpointer
|
|
424
|
+
|
|
425
|
+
For production persistence:
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
import { RedisCheckpointer, PostgresCheckpointer } from '@bowenqt/qiniu-ai-sdk';
|
|
429
|
+
|
|
430
|
+
// Redis (requires ioredis peer dependency)
|
|
431
|
+
const redisCheckpointer = new RedisCheckpointer(redisClient, {
|
|
432
|
+
keyPrefix: 'chat:',
|
|
433
|
+
ttlSeconds: 86400, // 24 hours
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// PostgreSQL (requires pg peer dependency)
|
|
437
|
+
const pgCheckpointer = new PostgresCheckpointer(pgPool, {
|
|
438
|
+
tableName: 'checkpoints',
|
|
439
|
+
autoCreateTable: true,
|
|
440
|
+
});
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### Tracing (OpenTelemetry)
|
|
444
|
+
|
|
445
|
+
Integrate with OpenTelemetry for distributed tracing:
|
|
446
|
+
|
|
447
|
+
```typescript
|
|
448
|
+
import { setGlobalTracer, OTelTracer, ConsoleTracer } from '@bowenqt/qiniu-ai-sdk';
|
|
449
|
+
|
|
450
|
+
// Console tracer for development
|
|
451
|
+
setGlobalTracer(new ConsoleTracer({ redactPII: true }));
|
|
452
|
+
|
|
453
|
+
// OpenTelemetry tracer for production
|
|
454
|
+
import { trace } from '@opentelemetry/api';
|
|
455
|
+
const otelTracer = new OTelTracer(trace.getTracerProvider());
|
|
456
|
+
setGlobalTracer(otelTracer);
|
|
457
|
+
|
|
458
|
+
// AgentGraph automatically creates spans:
|
|
459
|
+
// - agent_graph.invoke (top-level)
|
|
460
|
+
// - agent_graph.predict (per LLM call)
|
|
461
|
+
// - agent_graph.execute (per tool execution round)
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
|
|
240
465
|
## Vercel AI SDK Adapter
|
|
241
466
|
|
|
242
467
|
Use the adapter to integrate with the Vercel AI SDK (`streamText`, `generateText`).
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentGraph - High-level agent execution wrapper.
|
|
3
|
+
* Encapsulates predict→execute→memory loop with event bridging.
|
|
4
|
+
*
|
|
5
|
+
* IMPORTANT: All compaction uses estimateMessageTokens from token-estimator.ts
|
|
6
|
+
*/
|
|
7
|
+
import type { QiniuAI } from '../client';
|
|
8
|
+
import type { ResponseFormat } from '../lib/types';
|
|
9
|
+
import type { RegisteredTool } from '../lib/tool-registry';
|
|
10
|
+
import type { Skill } from '../modules/skills';
|
|
11
|
+
import { type TokenEstimatorConfig } from '../lib/token-estimator';
|
|
12
|
+
import type { AgentState, InternalMessage, StepResult, AgentGraphEvents } from './internal-types';
|
|
13
|
+
/** AgentGraph options */
|
|
14
|
+
export interface AgentGraphOptions {
|
|
15
|
+
client: QiniuAI;
|
|
16
|
+
model: string;
|
|
17
|
+
tools?: Record<string, RegisteredTool>;
|
|
18
|
+
skills?: Skill[];
|
|
19
|
+
maxSteps?: number;
|
|
20
|
+
temperature?: number;
|
|
21
|
+
topP?: number;
|
|
22
|
+
/** Output token limit (sent to LLM) */
|
|
23
|
+
maxTokens?: number;
|
|
24
|
+
/** Context token budget for compaction (default: no compaction) */
|
|
25
|
+
maxContextTokens?: number;
|
|
26
|
+
/** Token estimator configuration */
|
|
27
|
+
tokenEstimatorConfig?: TokenEstimatorConfig;
|
|
28
|
+
responseFormat?: ResponseFormat;
|
|
29
|
+
toolChoice?: 'none' | 'auto' | {
|
|
30
|
+
type: 'function';
|
|
31
|
+
function: {
|
|
32
|
+
name: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
abortSignal?: AbortSignal;
|
|
36
|
+
events?: AgentGraphEvents;
|
|
37
|
+
}
|
|
38
|
+
/** AgentGraph result */
|
|
39
|
+
export interface AgentGraphResult {
|
|
40
|
+
text: string;
|
|
41
|
+
reasoning?: string;
|
|
42
|
+
steps: StepResult[];
|
|
43
|
+
usage?: AgentState['usage'];
|
|
44
|
+
finishReason: string | null;
|
|
45
|
+
/** Compaction information */
|
|
46
|
+
compaction?: {
|
|
47
|
+
/** Whether compaction occurred */
|
|
48
|
+
occurred: boolean;
|
|
49
|
+
/** Skills dropped during compaction */
|
|
50
|
+
droppedSkills: string[];
|
|
51
|
+
/** Number of messages dropped */
|
|
52
|
+
droppedMessages: number;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* AgentGraph class for agent execution.
|
|
57
|
+
*/
|
|
58
|
+
export declare class AgentGraph {
|
|
59
|
+
private readonly options;
|
|
60
|
+
private readonly graph;
|
|
61
|
+
private steps;
|
|
62
|
+
/** Compaction tracking */
|
|
63
|
+
private compactionOccurred;
|
|
64
|
+
private droppedSkills;
|
|
65
|
+
private droppedMessages;
|
|
66
|
+
constructor(options: AgentGraphOptions);
|
|
67
|
+
/**
|
|
68
|
+
* Compact messages if needed based on maxContextTokens.
|
|
69
|
+
* Uses estimateMessageTokens from token-estimator.ts for all estimation.
|
|
70
|
+
*/
|
|
71
|
+
private compactIfNeeded;
|
|
72
|
+
/**
|
|
73
|
+
* Get injected skills from message _meta.
|
|
74
|
+
* Priority is derived from skill name ASCII order, not message order.
|
|
75
|
+
*/
|
|
76
|
+
private getInjectedSkillsFromMessages;
|
|
77
|
+
/**
|
|
78
|
+
* Execute the agent graph.
|
|
79
|
+
*/
|
|
80
|
+
invoke(messages: InternalMessage[]): Promise<AgentGraphResult>;
|
|
81
|
+
/**
|
|
82
|
+
* Build the internal state graph.
|
|
83
|
+
*/
|
|
84
|
+
private buildGraph;
|
|
85
|
+
/**
|
|
86
|
+
* Predict node - calls LLM.
|
|
87
|
+
*/
|
|
88
|
+
private predictNode;
|
|
89
|
+
/**
|
|
90
|
+
* Execute node - runs tools.
|
|
91
|
+
*/
|
|
92
|
+
private executeNode;
|
|
93
|
+
/**
|
|
94
|
+
* Inject skills into messages.
|
|
95
|
+
* Each skill becomes a separate system message with _meta.
|
|
96
|
+
*/
|
|
97
|
+
private injectSkills;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=agent-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-graph.d.ts","sourceRoot":"","sources":["../../src/ai/agent-graph.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAM/C,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,KAAK,EACR,UAAU,EACV,eAAe,EAEf,UAAU,EACV,gBAAgB,EACnB,MAAM,kBAAkB,CAAC;AAI1B,yBAAyB;AACzB,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAChF,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6BAA6B;IAC7B,UAAU,CAAC,EAAE;QACT,kCAAkC;QAClC,QAAQ,EAAE,OAAO,CAAC;QAClB,uCAAuC;QACvC,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,iCAAiC;QACjC,eAAe,EAAE,MAAM,CAAC;KAC3B,CAAC;CACL;AAED;;GAEG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,KAAK,CAAoB;IACjC,0BAA0B;IAC1B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAK;gBAEhB,OAAO,EAAE,iBAAiB;IAKtC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAuCvB;;;OAGG;IACH,OAAO,CAAC,6BAA6B;IAgBrC;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwEpE;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;YACW,WAAW;IAyEzB;;OAEG;YACW,WAAW;IAkEzB;;;OAGG;IACH,OAAO,CAAC,YAAY;CA2CvB"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AgentGraph - High-level agent execution wrapper.
|
|
4
|
+
* Encapsulates predict→execute→memory loop with event bridging.
|
|
5
|
+
*
|
|
6
|
+
* IMPORTANT: All compaction uses estimateMessageTokens from token-estimator.ts
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.AgentGraph = void 0;
|
|
10
|
+
const graph_1 = require("./graph");
|
|
11
|
+
const predict_node_1 = require("./nodes/predict-node");
|
|
12
|
+
const execute_node_1 = require("./nodes/execute-node");
|
|
13
|
+
const memory_node_1 = require("./nodes/memory-node");
|
|
14
|
+
const token_estimator_1 = require("../lib/token-estimator");
|
|
15
|
+
const internal_types_1 = require("./internal-types");
|
|
16
|
+
const tracer_1 = require("../lib/tracer");
|
|
17
|
+
/**
|
|
18
|
+
* AgentGraph class for agent execution.
|
|
19
|
+
*/
|
|
20
|
+
class AgentGraph {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.steps = [];
|
|
23
|
+
/** Compaction tracking */
|
|
24
|
+
this.compactionOccurred = false;
|
|
25
|
+
this.droppedSkills = [];
|
|
26
|
+
this.droppedMessages = 0;
|
|
27
|
+
this.options = options;
|
|
28
|
+
this.graph = this.buildGraph();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Compact messages if needed based on maxContextTokens.
|
|
32
|
+
* Uses estimateMessageTokens from token-estimator.ts for all estimation.
|
|
33
|
+
*/
|
|
34
|
+
compactIfNeeded(state) {
|
|
35
|
+
const { maxContextTokens, tokenEstimatorConfig } = this.options;
|
|
36
|
+
// Skip if no budget specified
|
|
37
|
+
if (!maxContextTokens) {
|
|
38
|
+
return state;
|
|
39
|
+
}
|
|
40
|
+
// Build compaction config using estimateMessageTokens
|
|
41
|
+
const config = {
|
|
42
|
+
maxTokens: maxContextTokens,
|
|
43
|
+
estimateTokens: (msgs) => {
|
|
44
|
+
return msgs.reduce((sum, msg) => sum + (0, token_estimator_1.estimateMessageTokens)(msg, tokenEstimatorConfig), 0);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
// Get current skills from _meta
|
|
48
|
+
const currentSkills = this.getInjectedSkillsFromMessages(state.messages);
|
|
49
|
+
// Perform compaction
|
|
50
|
+
const result = (0, memory_node_1.compactMessages)(state.messages, config, currentSkills);
|
|
51
|
+
// Track compaction results
|
|
52
|
+
if (result.occurred) {
|
|
53
|
+
this.compactionOccurred = true;
|
|
54
|
+
this.droppedSkills.push(...result.droppedSkills);
|
|
55
|
+
this.droppedMessages += result.droppedMessages;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
...state,
|
|
59
|
+
messages: result.messages,
|
|
60
|
+
skills: this.getInjectedSkillsFromMessages(result.messages),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get injected skills from message _meta.
|
|
65
|
+
* Priority is derived from skill name ASCII order, not message order.
|
|
66
|
+
*/
|
|
67
|
+
getInjectedSkillsFromMessages(messages) {
|
|
68
|
+
const skills = messages
|
|
69
|
+
.map((msg, idx) => ({ msg, idx }))
|
|
70
|
+
.filter(({ msg }) => msg._meta?.skillId && msg._meta?.droppable)
|
|
71
|
+
.map(({ msg, idx }) => ({
|
|
72
|
+
name: msg._meta.skillId,
|
|
73
|
+
priority: msg._meta.priority ?? 0,
|
|
74
|
+
messageIndex: idx,
|
|
75
|
+
tokenCount: (0, token_estimator_1.estimateMessageTokens)(msg, this.options.tokenEstimatorConfig),
|
|
76
|
+
}));
|
|
77
|
+
// Sort by name for stable priority
|
|
78
|
+
return skills.sort((a, b) => a.name.localeCompare(b.name))
|
|
79
|
+
.map((s, idx) => ({ ...s, priority: idx }));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Execute the agent graph.
|
|
83
|
+
*/
|
|
84
|
+
async invoke(messages) {
|
|
85
|
+
const tracer = (0, tracer_1.getGlobalTracer)();
|
|
86
|
+
return tracer.withSpan('agent_graph.invoke', async (span) => {
|
|
87
|
+
span.setAttribute('model', this.options.model);
|
|
88
|
+
span.setAttribute('max_steps', this.options.maxSteps ?? 10);
|
|
89
|
+
span.setAttribute('message_count', messages.length);
|
|
90
|
+
// Reset steps and compaction tracking
|
|
91
|
+
this.steps = [];
|
|
92
|
+
this.compactionOccurred = false;
|
|
93
|
+
this.droppedSkills = [];
|
|
94
|
+
this.droppedMessages = 0;
|
|
95
|
+
// Build tools map
|
|
96
|
+
const toolsMap = new Map();
|
|
97
|
+
if (this.options.tools) {
|
|
98
|
+
for (const [name, tool] of Object.entries(this.options.tools)) {
|
|
99
|
+
toolsMap.set(name, { ...tool, name });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Initialize state
|
|
103
|
+
const initialState = {
|
|
104
|
+
messages: [...messages],
|
|
105
|
+
skills: [],
|
|
106
|
+
tools: toolsMap,
|
|
107
|
+
stepCount: 0,
|
|
108
|
+
maxSteps: this.options.maxSteps ?? 10,
|
|
109
|
+
done: false,
|
|
110
|
+
output: '',
|
|
111
|
+
reasoning: '',
|
|
112
|
+
finishReason: null,
|
|
113
|
+
abortSignal: this.options.abortSignal,
|
|
114
|
+
};
|
|
115
|
+
// Inject skills if provided
|
|
116
|
+
if (this.options.skills?.length) {
|
|
117
|
+
const injected = this.injectSkills(initialState.messages, this.options.skills);
|
|
118
|
+
initialState.messages = injected.messages;
|
|
119
|
+
initialState.skills = injected.skills;
|
|
120
|
+
span.setAttribute('skills_injected', this.options.skills.length);
|
|
121
|
+
}
|
|
122
|
+
// Execute graph
|
|
123
|
+
const finalState = await this.graph.invoke(initialState, {
|
|
124
|
+
maxSteps: this.options.maxSteps ? this.options.maxSteps * 3 : 30,
|
|
125
|
+
});
|
|
126
|
+
span.setAttribute('final_step_count', finalState.stepCount);
|
|
127
|
+
span.setAttribute('finish_reason', finalState.finishReason ?? 'unknown');
|
|
128
|
+
if (this.compactionOccurred) {
|
|
129
|
+
span.setAttribute('compaction_occurred', true);
|
|
130
|
+
span.setAttribute('dropped_skills', this.droppedSkills.length);
|
|
131
|
+
span.setAttribute('dropped_messages', this.droppedMessages);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
text: finalState.output,
|
|
135
|
+
reasoning: finalState.reasoning || undefined,
|
|
136
|
+
steps: this.steps,
|
|
137
|
+
usage: finalState.usage,
|
|
138
|
+
finishReason: finalState.finishReason,
|
|
139
|
+
compaction: this.compactionOccurred ? {
|
|
140
|
+
occurred: true,
|
|
141
|
+
droppedSkills: this.droppedSkills,
|
|
142
|
+
droppedMessages: this.droppedMessages,
|
|
143
|
+
} : undefined,
|
|
144
|
+
};
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build the internal state graph.
|
|
149
|
+
*/
|
|
150
|
+
buildGraph() {
|
|
151
|
+
const graph = new graph_1.StateGraph()
|
|
152
|
+
.addNode('predict', async (state) => this.predictNode(state))
|
|
153
|
+
.addNode('execute', async (state) => this.executeNode(state))
|
|
154
|
+
.addConditionalEdge('predict', (state) => {
|
|
155
|
+
if (state.done)
|
|
156
|
+
return graph_1.END;
|
|
157
|
+
return 'execute';
|
|
158
|
+
})
|
|
159
|
+
.addEdge('execute', 'predict')
|
|
160
|
+
.setEntryPoint('predict');
|
|
161
|
+
return graph.compile();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Predict node - calls LLM.
|
|
165
|
+
*/
|
|
166
|
+
async predictNode(state) {
|
|
167
|
+
const tracer = (0, tracer_1.getGlobalTracer)();
|
|
168
|
+
const { events } = this.options;
|
|
169
|
+
return tracer.withSpan('agent_graph.predict', async (span) => {
|
|
170
|
+
span.setAttribute('step_count', state.stepCount);
|
|
171
|
+
span.setAttribute('message_count', state.messages.length);
|
|
172
|
+
// Notify node entry
|
|
173
|
+
events?.onNodeEnter?.('predict');
|
|
174
|
+
// Check step limit
|
|
175
|
+
if (state.stepCount >= state.maxSteps) {
|
|
176
|
+
events?.onNodeExit?.('predict');
|
|
177
|
+
return { done: true };
|
|
178
|
+
}
|
|
179
|
+
// Compact messages before prediction (if needed)
|
|
180
|
+
const compactedState = this.compactIfNeeded(state);
|
|
181
|
+
// Strip metadata before API call
|
|
182
|
+
const apiMessages = (0, internal_types_1.stripMeta)(compactedState.messages);
|
|
183
|
+
// Execute prediction
|
|
184
|
+
const result = await (0, predict_node_1.predict)({
|
|
185
|
+
client: this.options.client,
|
|
186
|
+
model: this.options.model,
|
|
187
|
+
messages: apiMessages,
|
|
188
|
+
tools: Array.from(state.tools.values()),
|
|
189
|
+
temperature: this.options.temperature,
|
|
190
|
+
topP: this.options.topP,
|
|
191
|
+
maxTokens: this.options.maxTokens,
|
|
192
|
+
responseFormat: this.options.responseFormat,
|
|
193
|
+
toolChoice: this.options.toolChoice,
|
|
194
|
+
abortSignal: state.abortSignal,
|
|
195
|
+
});
|
|
196
|
+
// Build step result
|
|
197
|
+
const textStep = {
|
|
198
|
+
type: 'text',
|
|
199
|
+
content: result.message.content || '',
|
|
200
|
+
reasoning: result.reasoning,
|
|
201
|
+
toolCalls: result.message.tool_calls,
|
|
202
|
+
};
|
|
203
|
+
this.steps.push(textStep);
|
|
204
|
+
events?.onStepFinish?.(textStep);
|
|
205
|
+
// Check if done - use hasToolCalls as primary gate
|
|
206
|
+
// High fix: finishReason can be null/missing, but tool_calls presence is reliable
|
|
207
|
+
const hasToolCalls = (result.message.tool_calls?.length ?? 0) > 0;
|
|
208
|
+
const isDone = !hasToolCalls;
|
|
209
|
+
// Update state with compacted messages
|
|
210
|
+
const newMessages = [
|
|
211
|
+
...compactedState.messages,
|
|
212
|
+
{ ...result.message },
|
|
213
|
+
];
|
|
214
|
+
events?.onNodeExit?.('predict');
|
|
215
|
+
return {
|
|
216
|
+
messages: newMessages,
|
|
217
|
+
skills: compactedState.skills, // Preserve updated skill list
|
|
218
|
+
stepCount: state.stepCount + 1,
|
|
219
|
+
output: isDone ? (result.message.content || state.output) : state.output,
|
|
220
|
+
reasoning: (state.reasoning || '') + (result.reasoning || ''),
|
|
221
|
+
finishReason: result.finishReason,
|
|
222
|
+
usage: result.usage,
|
|
223
|
+
done: isDone,
|
|
224
|
+
};
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Execute node - runs tools.
|
|
229
|
+
*/
|
|
230
|
+
async executeNode(state) {
|
|
231
|
+
const tracer = (0, tracer_1.getGlobalTracer)();
|
|
232
|
+
const { events } = this.options;
|
|
233
|
+
return tracer.withSpan('agent_graph.execute', async (span) => {
|
|
234
|
+
// Notify node entry
|
|
235
|
+
events?.onNodeEnter?.('execute');
|
|
236
|
+
// Get last message with tool calls
|
|
237
|
+
const lastMessage = state.messages[state.messages.length - 1];
|
|
238
|
+
const toolCalls = lastMessage.tool_calls;
|
|
239
|
+
if (!toolCalls?.length) {
|
|
240
|
+
events?.onNodeExit?.('execute');
|
|
241
|
+
return {};
|
|
242
|
+
}
|
|
243
|
+
// Create tool call steps
|
|
244
|
+
for (const tc of toolCalls) {
|
|
245
|
+
const callStep = {
|
|
246
|
+
type: 'tool_call',
|
|
247
|
+
content: tc.function.arguments,
|
|
248
|
+
toolCalls: [tc],
|
|
249
|
+
};
|
|
250
|
+
this.steps.push(callStep);
|
|
251
|
+
events?.onStepFinish?.(callStep);
|
|
252
|
+
}
|
|
253
|
+
// Execute tools
|
|
254
|
+
const results = await (0, execute_node_1.executeTools)(toolCalls, state.tools, {
|
|
255
|
+
messages: (0, internal_types_1.stripMeta)(state.messages),
|
|
256
|
+
abortSignal: state.abortSignal,
|
|
257
|
+
});
|
|
258
|
+
// Create tool result steps and messages
|
|
259
|
+
const toolMessages = (0, execute_node_1.toolResultsToMessages)(results);
|
|
260
|
+
for (const result of results) {
|
|
261
|
+
const resultStep = {
|
|
262
|
+
type: 'tool_result',
|
|
263
|
+
content: result.result,
|
|
264
|
+
toolResults: [{ toolCallId: result.toolCallId, result: result.result }],
|
|
265
|
+
};
|
|
266
|
+
this.steps.push(resultStep);
|
|
267
|
+
events?.onStepFinish?.(resultStep);
|
|
268
|
+
}
|
|
269
|
+
events?.onNodeExit?.('execute');
|
|
270
|
+
// Build new messages with tool results
|
|
271
|
+
const newMessages = [...state.messages, ...toolMessages.map(m => m)];
|
|
272
|
+
// Compact after execute if needed (tool results can be large)
|
|
273
|
+
const postExecuteState = this.compactIfNeeded({ ...state, messages: newMessages });
|
|
274
|
+
return {
|
|
275
|
+
messages: postExecuteState.messages,
|
|
276
|
+
skills: postExecuteState.skills,
|
|
277
|
+
};
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Inject skills into messages.
|
|
282
|
+
* Each skill becomes a separate system message with _meta.
|
|
283
|
+
*/
|
|
284
|
+
injectSkills(messages, skills) {
|
|
285
|
+
// Sort skills by name (ASCII order)
|
|
286
|
+
const sortedSkills = [...skills].sort((a, b) => a.name.localeCompare(b.name));
|
|
287
|
+
// Find insertion point (after first system message, or at start)
|
|
288
|
+
let insertIndex = 0;
|
|
289
|
+
for (let i = 0; i < messages.length; i++) {
|
|
290
|
+
if (messages[i].role === 'system') {
|
|
291
|
+
insertIndex = i + 1;
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Create skill messages
|
|
296
|
+
const skillMessages = sortedSkills.map((skill, idx) => ({
|
|
297
|
+
role: 'system',
|
|
298
|
+
content: skill.content,
|
|
299
|
+
_meta: {
|
|
300
|
+
skillId: skill.name,
|
|
301
|
+
droppable: true,
|
|
302
|
+
},
|
|
303
|
+
}));
|
|
304
|
+
// Build injected skill metadata
|
|
305
|
+
const injectedSkills = sortedSkills.map((skill, idx) => ({
|
|
306
|
+
name: skill.name,
|
|
307
|
+
priority: idx, // Lower index = lower priority = drop first
|
|
308
|
+
messageIndex: insertIndex + idx,
|
|
309
|
+
tokenCount: skill.tokenCount,
|
|
310
|
+
}));
|
|
311
|
+
// Insert skill messages
|
|
312
|
+
const newMessages = [
|
|
313
|
+
...messages.slice(0, insertIndex),
|
|
314
|
+
...skillMessages,
|
|
315
|
+
...messages.slice(insertIndex),
|
|
316
|
+
];
|
|
317
|
+
return { messages: newMessages, skills: injectedSkills };
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
exports.AgentGraph = AgentGraph;
|
|
321
|
+
//# sourceMappingURL=agent-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-graph.js","sourceRoot":"","sources":["../../src/ai/agent-graph.ts"],"names":[],"mappings":"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"}
|