@bowenqt/qiniu-ai-sdk 0.10.0 → 0.14.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.
Files changed (149) hide show
  1. package/README.md +225 -0
  2. package/dist/ai/agent-graph.d.ts +101 -0
  3. package/dist/ai/agent-graph.d.ts.map +1 -0
  4. package/dist/ai/agent-graph.js +322 -0
  5. package/dist/ai/agent-graph.js.map +1 -0
  6. package/dist/ai/agent-graph.mjs +318 -0
  7. package/dist/ai/generate-text.d.ts +58 -0
  8. package/dist/ai/generate-text.d.ts.map +1 -1
  9. package/dist/ai/generate-text.js +157 -0
  10. package/dist/ai/generate-text.js.map +1 -1
  11. package/dist/ai/generate-text.mjs +156 -0
  12. package/dist/ai/graph/checkpointer.d.ts +112 -0
  13. package/dist/ai/graph/checkpointer.d.ts.map +1 -0
  14. package/dist/ai/graph/checkpointer.js +131 -0
  15. package/dist/ai/graph/checkpointer.js.map +1 -0
  16. package/dist/ai/graph/checkpointer.mjs +126 -0
  17. package/dist/ai/graph/index.d.ts +13 -0
  18. package/dist/ai/graph/index.d.ts.map +1 -0
  19. package/dist/ai/graph/index.js +22 -0
  20. package/dist/ai/graph/index.js.map +1 -0
  21. package/dist/ai/graph/index.mjs +12 -0
  22. package/dist/ai/graph/postgres-checkpointer.d.ts +54 -0
  23. package/dist/ai/graph/postgres-checkpointer.d.ts.map +1 -0
  24. package/dist/ai/graph/postgres-checkpointer.js +134 -0
  25. package/dist/ai/graph/postgres-checkpointer.js.map +1 -0
  26. package/dist/ai/graph/postgres-checkpointer.mjs +130 -0
  27. package/dist/ai/graph/redis-checkpointer.d.ts +51 -0
  28. package/dist/ai/graph/redis-checkpointer.d.ts.map +1 -0
  29. package/dist/ai/graph/redis-checkpointer.js +124 -0
  30. package/dist/ai/graph/redis-checkpointer.js.map +1 -0
  31. package/dist/ai/graph/redis-checkpointer.mjs +120 -0
  32. package/dist/ai/graph/state-graph.d.ts +41 -0
  33. package/dist/ai/graph/state-graph.d.ts.map +1 -0
  34. package/dist/ai/graph/state-graph.js +149 -0
  35. package/dist/ai/graph/state-graph.js.map +1 -0
  36. package/dist/ai/graph/state-graph.mjs +144 -0
  37. package/dist/ai/graph/types.d.ts +41 -0
  38. package/dist/ai/graph/types.d.ts.map +1 -0
  39. package/dist/ai/graph/types.js +10 -0
  40. package/dist/ai/graph/types.js.map +1 -0
  41. package/dist/ai/graph/types.mjs +7 -0
  42. package/dist/ai/internal-types.d.ts +109 -0
  43. package/dist/ai/internal-types.d.ts.map +1 -0
  44. package/dist/ai/internal-types.js +28 -0
  45. package/dist/ai/internal-types.js.map +1 -0
  46. package/dist/ai/internal-types.mjs +23 -0
  47. package/dist/ai/nodes/execute-node.d.ts +27 -0
  48. package/dist/ai/nodes/execute-node.d.ts.map +1 -0
  49. package/dist/ai/nodes/execute-node.js +118 -0
  50. package/dist/ai/nodes/execute-node.js.map +1 -0
  51. package/dist/ai/nodes/execute-node.mjs +114 -0
  52. package/dist/ai/nodes/index.d.ts +8 -0
  53. package/dist/ai/nodes/index.d.ts.map +1 -0
  54. package/dist/ai/nodes/index.js +16 -0
  55. package/dist/ai/nodes/index.js.map +1 -0
  56. package/dist/ai/nodes/index.mjs +7 -0
  57. package/dist/ai/nodes/memory-node.d.ts +34 -0
  58. package/dist/ai/nodes/memory-node.d.ts.map +1 -0
  59. package/dist/ai/nodes/memory-node.js +164 -0
  60. package/dist/ai/nodes/memory-node.js.map +1 -0
  61. package/dist/ai/nodes/memory-node.mjs +158 -0
  62. package/dist/ai/nodes/predict-node.d.ts +42 -0
  63. package/dist/ai/nodes/predict-node.d.ts.map +1 -0
  64. package/dist/ai/nodes/predict-node.js +89 -0
  65. package/dist/ai/nodes/predict-node.js.map +1 -0
  66. package/dist/ai/nodes/predict-node.mjs +86 -0
  67. package/dist/ai/nodes/types.d.ts +44 -0
  68. package/dist/ai/nodes/types.d.ts.map +1 -0
  69. package/dist/ai/nodes/types.js +6 -0
  70. package/dist/ai/nodes/types.js.map +1 -0
  71. package/dist/ai/nodes/types.mjs +5 -0
  72. package/dist/index.d.ts +23 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +80 -1
  75. package/dist/index.js.map +1 -1
  76. package/dist/index.mjs +34 -0
  77. package/dist/lib/otel-tracer.d.ts +47 -0
  78. package/dist/lib/otel-tracer.d.ts.map +1 -0
  79. package/dist/lib/otel-tracer.js +79 -0
  80. package/dist/lib/otel-tracer.js.map +1 -0
  81. package/dist/lib/otel-tracer.mjs +75 -0
  82. package/dist/lib/token-estimator.d.ts +62 -0
  83. package/dist/lib/token-estimator.d.ts.map +1 -0
  84. package/dist/lib/token-estimator.js +106 -0
  85. package/dist/lib/token-estimator.js.map +1 -0
  86. package/dist/lib/token-estimator.mjs +100 -0
  87. package/dist/lib/tool-registry.d.ts +103 -0
  88. package/dist/lib/tool-registry.d.ts.map +1 -0
  89. package/dist/lib/tool-registry.js +159 -0
  90. package/dist/lib/tool-registry.js.map +1 -0
  91. package/dist/lib/tool-registry.mjs +154 -0
  92. package/dist/lib/tracer.d.ts +85 -0
  93. package/dist/lib/tracer.d.ts.map +1 -0
  94. package/dist/lib/tracer.js +170 -0
  95. package/dist/lib/tracer.js.map +1 -0
  96. package/dist/lib/tracer.mjs +161 -0
  97. package/dist/lib/types.d.ts +11 -0
  98. package/dist/lib/types.d.ts.map +1 -1
  99. package/dist/modules/mcp/adapter.d.ts +23 -0
  100. package/dist/modules/mcp/adapter.d.ts.map +1 -0
  101. package/dist/modules/mcp/adapter.js +63 -0
  102. package/dist/modules/mcp/adapter.js.map +1 -0
  103. package/dist/modules/mcp/adapter.mjs +58 -0
  104. package/dist/modules/mcp/client.d.ts +75 -0
  105. package/dist/modules/mcp/client.d.ts.map +1 -0
  106. package/dist/modules/mcp/client.js +300 -0
  107. package/dist/modules/mcp/client.js.map +1 -0
  108. package/dist/modules/mcp/client.mjs +295 -0
  109. package/dist/modules/mcp/http-transport.d.ts +51 -0
  110. package/dist/modules/mcp/http-transport.d.ts.map +1 -0
  111. package/dist/modules/mcp/http-transport.js +146 -0
  112. package/dist/modules/mcp/http-transport.js.map +1 -0
  113. package/dist/modules/mcp/http-transport.mjs +141 -0
  114. package/dist/modules/mcp/index.d.ts +11 -0
  115. package/dist/modules/mcp/index.d.ts.map +1 -0
  116. package/dist/modules/mcp/index.js +34 -0
  117. package/dist/modules/mcp/index.js.map +1 -0
  118. package/dist/modules/mcp/index.mjs +14 -0
  119. package/dist/modules/mcp/oauth.d.ts +101 -0
  120. package/dist/modules/mcp/oauth.d.ts.map +1 -0
  121. package/dist/modules/mcp/oauth.js +347 -0
  122. package/dist/modules/mcp/oauth.js.map +1 -0
  123. package/dist/modules/mcp/oauth.mjs +304 -0
  124. package/dist/modules/mcp/token-store.d.ts +69 -0
  125. package/dist/modules/mcp/token-store.d.ts.map +1 -0
  126. package/dist/modules/mcp/token-store.js +174 -0
  127. package/dist/modules/mcp/token-store.js.map +1 -0
  128. package/dist/modules/mcp/token-store.mjs +135 -0
  129. package/dist/modules/mcp/types.d.ts +91 -0
  130. package/dist/modules/mcp/types.d.ts.map +1 -0
  131. package/dist/modules/mcp/types.js +14 -0
  132. package/dist/modules/mcp/types.js.map +1 -0
  133. package/dist/modules/mcp/types.mjs +11 -0
  134. package/dist/modules/skills/index.d.ts +7 -0
  135. package/dist/modules/skills/index.d.ts.map +1 -0
  136. package/dist/modules/skills/index.js +14 -0
  137. package/dist/modules/skills/index.js.map +1 -0
  138. package/dist/modules/skills/index.mjs +6 -0
  139. package/dist/modules/skills/loader.d.ts +51 -0
  140. package/dist/modules/skills/loader.d.ts.map +1 -0
  141. package/dist/modules/skills/loader.js +237 -0
  142. package/dist/modules/skills/loader.js.map +1 -0
  143. package/dist/modules/skills/loader.mjs +198 -0
  144. package/dist/modules/skills/types.d.ts +60 -0
  145. package/dist/modules/skills/types.d.ts.map +1 -0
  146. package/dist/modules/skills/types.js +20 -0
  147. package/dist/modules/skills/types.js.map +1 -0
  148. package/dist/modules/skills/types.mjs +17 -0
  149. 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,101 @@
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
+ /** Final agent state (for checkpointing) */
55
+ state: AgentState;
56
+ }
57
+ /**
58
+ * AgentGraph class for agent execution.
59
+ */
60
+ export declare class AgentGraph {
61
+ private readonly options;
62
+ private readonly graph;
63
+ private steps;
64
+ /** Compaction tracking */
65
+ private compactionOccurred;
66
+ private droppedSkills;
67
+ private droppedMessages;
68
+ constructor(options: AgentGraphOptions);
69
+ /**
70
+ * Compact messages if needed based on maxContextTokens.
71
+ * Uses estimateMessageTokens from token-estimator.ts for all estimation.
72
+ */
73
+ private compactIfNeeded;
74
+ /**
75
+ * Get injected skills from message _meta.
76
+ * Priority is derived from skill name ASCII order, not message order.
77
+ */
78
+ private getInjectedSkillsFromMessages;
79
+ /**
80
+ * Execute the agent graph.
81
+ */
82
+ invoke(messages: InternalMessage[]): Promise<AgentGraphResult>;
83
+ /**
84
+ * Build the internal state graph.
85
+ */
86
+ private buildGraph;
87
+ /**
88
+ * Predict node - calls LLM.
89
+ */
90
+ private predictNode;
91
+ /**
92
+ * Execute node - runs tools.
93
+ */
94
+ private executeNode;
95
+ /**
96
+ * Inject skills into messages.
97
+ * Each skill becomes a separate system message with _meta.
98
+ */
99
+ private injectSkills;
100
+ }
101
+ //# 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;IACF,4CAA4C;IAC5C,KAAK,EAAE,UAAU,CAAC;CACrB;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;IAyEpE;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;YACW,WAAW;IAyEzB;;OAEG;YACW,WAAW;IAkEzB;;;OAGG;IACH,OAAO,CAAC,YAAY;CA2CvB"}
@@ -0,0 +1,322 @@
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
+ state: finalState,
145
+ };
146
+ });
147
+ }
148
+ /**
149
+ * Build the internal state graph.
150
+ */
151
+ buildGraph() {
152
+ const graph = new graph_1.StateGraph()
153
+ .addNode('predict', async (state) => this.predictNode(state))
154
+ .addNode('execute', async (state) => this.executeNode(state))
155
+ .addConditionalEdge('predict', (state) => {
156
+ if (state.done)
157
+ return graph_1.END;
158
+ return 'execute';
159
+ })
160
+ .addEdge('execute', 'predict')
161
+ .setEntryPoint('predict');
162
+ return graph.compile();
163
+ }
164
+ /**
165
+ * Predict node - calls LLM.
166
+ */
167
+ async predictNode(state) {
168
+ const tracer = (0, tracer_1.getGlobalTracer)();
169
+ const { events } = this.options;
170
+ return tracer.withSpan('agent_graph.predict', async (span) => {
171
+ span.setAttribute('step_count', state.stepCount);
172
+ span.setAttribute('message_count', state.messages.length);
173
+ // Notify node entry
174
+ events?.onNodeEnter?.('predict');
175
+ // Check step limit
176
+ if (state.stepCount >= state.maxSteps) {
177
+ events?.onNodeExit?.('predict');
178
+ return { done: true };
179
+ }
180
+ // Compact messages before prediction (if needed)
181
+ const compactedState = this.compactIfNeeded(state);
182
+ // Strip metadata before API call
183
+ const apiMessages = (0, internal_types_1.stripMeta)(compactedState.messages);
184
+ // Execute prediction
185
+ const result = await (0, predict_node_1.predict)({
186
+ client: this.options.client,
187
+ model: this.options.model,
188
+ messages: apiMessages,
189
+ tools: Array.from(state.tools.values()),
190
+ temperature: this.options.temperature,
191
+ topP: this.options.topP,
192
+ maxTokens: this.options.maxTokens,
193
+ responseFormat: this.options.responseFormat,
194
+ toolChoice: this.options.toolChoice,
195
+ abortSignal: state.abortSignal,
196
+ });
197
+ // Build step result
198
+ const textStep = {
199
+ type: 'text',
200
+ content: result.message.content || '',
201
+ reasoning: result.reasoning,
202
+ toolCalls: result.message.tool_calls,
203
+ };
204
+ this.steps.push(textStep);
205
+ events?.onStepFinish?.(textStep);
206
+ // Check if done - use hasToolCalls as primary gate
207
+ // High fix: finishReason can be null/missing, but tool_calls presence is reliable
208
+ const hasToolCalls = (result.message.tool_calls?.length ?? 0) > 0;
209
+ const isDone = !hasToolCalls;
210
+ // Update state with compacted messages
211
+ const newMessages = [
212
+ ...compactedState.messages,
213
+ { ...result.message },
214
+ ];
215
+ events?.onNodeExit?.('predict');
216
+ return {
217
+ messages: newMessages,
218
+ skills: compactedState.skills, // Preserve updated skill list
219
+ stepCount: state.stepCount + 1,
220
+ output: isDone ? (result.message.content || state.output) : state.output,
221
+ reasoning: (state.reasoning || '') + (result.reasoning || ''),
222
+ finishReason: result.finishReason,
223
+ usage: result.usage,
224
+ done: isDone,
225
+ };
226
+ });
227
+ }
228
+ /**
229
+ * Execute node - runs tools.
230
+ */
231
+ async executeNode(state) {
232
+ const tracer = (0, tracer_1.getGlobalTracer)();
233
+ const { events } = this.options;
234
+ return tracer.withSpan('agent_graph.execute', async (span) => {
235
+ // Notify node entry
236
+ events?.onNodeEnter?.('execute');
237
+ // Get last message with tool calls
238
+ const lastMessage = state.messages[state.messages.length - 1];
239
+ const toolCalls = lastMessage.tool_calls;
240
+ if (!toolCalls?.length) {
241
+ events?.onNodeExit?.('execute');
242
+ return {};
243
+ }
244
+ // Create tool call steps
245
+ for (const tc of toolCalls) {
246
+ const callStep = {
247
+ type: 'tool_call',
248
+ content: tc.function.arguments,
249
+ toolCalls: [tc],
250
+ };
251
+ this.steps.push(callStep);
252
+ events?.onStepFinish?.(callStep);
253
+ }
254
+ // Execute tools
255
+ const results = await (0, execute_node_1.executeTools)(toolCalls, state.tools, {
256
+ messages: (0, internal_types_1.stripMeta)(state.messages),
257
+ abortSignal: state.abortSignal,
258
+ });
259
+ // Create tool result steps and messages
260
+ const toolMessages = (0, execute_node_1.toolResultsToMessages)(results);
261
+ for (const result of results) {
262
+ const resultStep = {
263
+ type: 'tool_result',
264
+ content: result.result,
265
+ toolResults: [{ toolCallId: result.toolCallId, result: result.result }],
266
+ };
267
+ this.steps.push(resultStep);
268
+ events?.onStepFinish?.(resultStep);
269
+ }
270
+ events?.onNodeExit?.('execute');
271
+ // Build new messages with tool results
272
+ const newMessages = [...state.messages, ...toolMessages.map(m => m)];
273
+ // Compact after execute if needed (tool results can be large)
274
+ const postExecuteState = this.compactIfNeeded({ ...state, messages: newMessages });
275
+ return {
276
+ messages: postExecuteState.messages,
277
+ skills: postExecuteState.skills,
278
+ };
279
+ });
280
+ }
281
+ /**
282
+ * Inject skills into messages.
283
+ * Each skill becomes a separate system message with _meta.
284
+ */
285
+ injectSkills(messages, skills) {
286
+ // Sort skills by name (ASCII order)
287
+ const sortedSkills = [...skills].sort((a, b) => a.name.localeCompare(b.name));
288
+ // Find insertion point (after first system message, or at start)
289
+ let insertIndex = 0;
290
+ for (let i = 0; i < messages.length; i++) {
291
+ if (messages[i].role === 'system') {
292
+ insertIndex = i + 1;
293
+ break;
294
+ }
295
+ }
296
+ // Create skill messages
297
+ const skillMessages = sortedSkills.map((skill, idx) => ({
298
+ role: 'system',
299
+ content: skill.content,
300
+ _meta: {
301
+ skillId: skill.name,
302
+ droppable: true,
303
+ },
304
+ }));
305
+ // Build injected skill metadata
306
+ const injectedSkills = sortedSkills.map((skill, idx) => ({
307
+ name: skill.name,
308
+ priority: idx, // Lower index = lower priority = drop first
309
+ messageIndex: insertIndex + idx,
310
+ tokenCount: skill.tokenCount,
311
+ }));
312
+ // Insert skill messages
313
+ const newMessages = [
314
+ ...messages.slice(0, insertIndex),
315
+ ...skillMessages,
316
+ ...messages.slice(insertIndex),
317
+ ];
318
+ return { messages: newMessages, skills: injectedSkills };
319
+ }
320
+ }
321
+ exports.AgentGraph = AgentGraph;
322
+ //# 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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"}