@lov3kaizen/agentsea-core 0.6.0 → 0.8.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 +374 -37
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +70 -55
- package/dist/index.mjs +65 -70
- package/package.json +16 -16
package/README.md
CHANGED
|
@@ -8,16 +8,19 @@
|
|
|
8
8
|
|
|
9
9
|
## Features
|
|
10
10
|
|
|
11
|
-
- Multi-Provider Support - Anthropic Claude, OpenAI GPT, Google Gemini
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
11
|
+
- **Multi-Provider Support** - Anthropic Claude, OpenAI GPT, Google Gemini
|
|
12
|
+
- **Per-Model Type Safety** - Compile-time validation of model-specific options
|
|
13
|
+
- **Local & Open Source Models** - Ollama, LM Studio, LocalAI, Text Generation WebUI, vLLM
|
|
14
|
+
- **Voice Support (TTS/STT)** - OpenAI Whisper, ElevenLabs, Piper TTS, Local Whisper
|
|
15
|
+
- **MCP Protocol** - First-class Model Context Protocol integration
|
|
16
|
+
- **ACP Protocol** - Agentic Commerce Protocol for e-commerce (14 operations)
|
|
17
|
+
- **Multi-Agent Workflows** - Sequential, parallel, and supervisor orchestration
|
|
18
|
+
- **Conversation Schemas** - Structured conversational experiences with validation
|
|
19
|
+
- **Advanced Memory** - Buffer, Redis, summary, and tenant-based memory stores
|
|
20
|
+
- **Built-in Tools** - 13 coding tools + 8 general tools + custom tool support
|
|
21
|
+
- **Isomorphic Tool Definitions** - Server, client, and hybrid tool types
|
|
22
|
+
- **Multi-Tenancy** - Built-in tenant isolation for SaaS applications
|
|
23
|
+
- **Full Observability** - Logging, metrics, and distributed tracing
|
|
21
24
|
|
|
22
25
|
## Installation
|
|
23
26
|
|
|
@@ -40,11 +43,10 @@ import {
|
|
|
40
43
|
calculatorTool,
|
|
41
44
|
} from '@lov3kaizen/agentsea-core';
|
|
42
45
|
|
|
43
|
-
// Create agent
|
|
44
46
|
const agent = new Agent(
|
|
45
47
|
{
|
|
46
48
|
name: 'assistant',
|
|
47
|
-
model: 'claude-sonnet-4-
|
|
49
|
+
model: 'claude-sonnet-4-6',
|
|
48
50
|
provider: 'anthropic',
|
|
49
51
|
systemPrompt: 'You are a helpful assistant.',
|
|
50
52
|
tools: [calculatorTool],
|
|
@@ -54,7 +56,6 @@ const agent = new Agent(
|
|
|
54
56
|
new BufferMemory(50),
|
|
55
57
|
);
|
|
56
58
|
|
|
57
|
-
// Execute
|
|
58
59
|
const response = await agent.execute('What is 42 * 58?', {
|
|
59
60
|
conversationId: 'user-123',
|
|
60
61
|
sessionData: {},
|
|
@@ -64,44 +65,380 @@ const response = await agent.execute('What is 42 * 58?', {
|
|
|
64
65
|
console.log(response.content);
|
|
65
66
|
```
|
|
66
67
|
|
|
67
|
-
##
|
|
68
|
+
## Providers
|
|
69
|
+
|
|
70
|
+
### Cloud Providers
|
|
68
71
|
|
|
69
72
|
```typescript
|
|
70
73
|
import {
|
|
71
|
-
GeminiProvider,
|
|
72
|
-
OpenAIProvider,
|
|
73
74
|
AnthropicProvider,
|
|
75
|
+
OpenAIProvider,
|
|
76
|
+
GeminiProvider,
|
|
77
|
+
} from '@lov3kaizen/agentsea-core';
|
|
78
|
+
|
|
79
|
+
// Anthropic Claude (Opus 4.6, Sonnet 4.5, Haiku 4.5, and earlier)
|
|
80
|
+
const claude = new AnthropicProvider(process.env.ANTHROPIC_API_KEY);
|
|
81
|
+
|
|
82
|
+
// OpenAI (GPT-5, GPT-4.1, o3, o4-mini, GPT-4o, and more)
|
|
83
|
+
const openai = new OpenAIProvider(process.env.OPENAI_API_KEY);
|
|
84
|
+
|
|
85
|
+
// Google Gemini
|
|
86
|
+
const gemini = new GeminiProvider(process.env.GEMINI_API_KEY);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Local Providers
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import {
|
|
74
93
|
OllamaProvider,
|
|
94
|
+
LMStudioProvider,
|
|
95
|
+
LocalAIProvider,
|
|
96
|
+
TextGenerationWebUIProvider,
|
|
97
|
+
VLLMProvider,
|
|
98
|
+
OpenAICompatibleProvider,
|
|
75
99
|
} from '@lov3kaizen/agentsea-core';
|
|
76
100
|
|
|
77
|
-
//
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
);
|
|
85
|
-
|
|
101
|
+
// Ollama
|
|
102
|
+
const ollama = new OllamaProvider({ baseUrl: 'http://localhost:11434' });
|
|
103
|
+
|
|
104
|
+
// LM Studio
|
|
105
|
+
const lmstudio = new LMStudioProvider({ baseUrl: 'http://localhost:1234/v1' });
|
|
106
|
+
|
|
107
|
+
// LocalAI
|
|
108
|
+
const localai = new LocalAIProvider({ baseUrl: 'http://localhost:8080/v1' });
|
|
109
|
+
|
|
110
|
+
// Any OpenAI-compatible endpoint
|
|
111
|
+
const custom = new OpenAICompatibleProvider({
|
|
112
|
+
baseUrl: 'http://your-server/v1',
|
|
113
|
+
apiKey: 'optional-key',
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Per-Model Type Safety
|
|
118
|
+
|
|
119
|
+
Get compile-time validation for model-specific options:
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { anthropic, openai, createProvider } from '@lov3kaizen/agentsea-core';
|
|
123
|
+
|
|
124
|
+
// Claude supports tools, system prompts, and extended thinking
|
|
125
|
+
const claudeConfig = anthropic('claude-sonnet-4-6', {
|
|
126
|
+
tools: [myTool],
|
|
127
|
+
systemPrompt: 'You are a helpful assistant',
|
|
128
|
+
thinking: { type: 'enabled', budgetTokens: 10000 },
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// o3 supports tools and reasoning effort
|
|
132
|
+
const o3Config = openai('o3', {
|
|
133
|
+
tools: [myTool],
|
|
134
|
+
reasoningEffort: 'high',
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// Create type-safe provider from config
|
|
138
|
+
const provider = createProvider(claudeConfig);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Tools
|
|
142
|
+
|
|
143
|
+
### Built-in Tools
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
import {
|
|
147
|
+
// General tools
|
|
148
|
+
calculatorTool,
|
|
149
|
+
// Coding tools
|
|
150
|
+
fileReadTool,
|
|
151
|
+
fileWriteTool,
|
|
152
|
+
fileListTool,
|
|
153
|
+
shellExecuteTool,
|
|
154
|
+
codeEditTool,
|
|
155
|
+
globTool,
|
|
156
|
+
grepTool,
|
|
157
|
+
gitStatusTool,
|
|
158
|
+
gitDiffTool,
|
|
159
|
+
gitAddTool,
|
|
160
|
+
gitCommitTool,
|
|
161
|
+
gitLogTool,
|
|
162
|
+
gitBranchTool,
|
|
163
|
+
} from '@lov3kaizen/agentsea-core';
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Custom Tools
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import { z } from 'zod';
|
|
170
|
+
|
|
171
|
+
const weatherTool = {
|
|
172
|
+
name: 'get_weather',
|
|
173
|
+
description: 'Get current weather for a location',
|
|
174
|
+
parameters: z.object({
|
|
175
|
+
location: z.string().describe('City name'),
|
|
176
|
+
}),
|
|
177
|
+
execute: async (params) => {
|
|
178
|
+
return `Weather in ${params.location}: Sunny, 72°F`;
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
toolRegistry.register(weatherTool);
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Isomorphic Tool Definitions
|
|
186
|
+
|
|
187
|
+
Define tools that work on server, client, or both:
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
import { serverTool, clientTool, hybridTool } from '@lov3kaizen/agentsea-core';
|
|
191
|
+
import { z } from 'zod';
|
|
192
|
+
|
|
193
|
+
// Server-only tool
|
|
194
|
+
const dbQuery = serverTool({
|
|
195
|
+
name: 'db_query',
|
|
196
|
+
description: 'Query the database',
|
|
197
|
+
parameters: z.object({ sql: z.string() }),
|
|
198
|
+
execute: async (params) => {
|
|
199
|
+
/* server-side only */
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// Client-only tool (runs in browser)
|
|
204
|
+
const showModal = clientTool({
|
|
205
|
+
name: 'show_modal',
|
|
206
|
+
description: 'Show a modal dialog',
|
|
207
|
+
parameters: z.object({ message: z.string() }),
|
|
208
|
+
execute: async (params) => {
|
|
209
|
+
/* client-side only */
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// Hybrid tool (runs on both)
|
|
214
|
+
const logger = hybridTool({
|
|
215
|
+
name: 'log',
|
|
216
|
+
description: 'Log a message',
|
|
217
|
+
parameters: z.object({ message: z.string() }),
|
|
218
|
+
executeServer: async (params) => {
|
|
219
|
+
/* server impl */
|
|
220
|
+
},
|
|
221
|
+
executeClient: async (params) => {
|
|
222
|
+
/* client impl */
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Memory
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
import {
|
|
231
|
+
BufferMemory,
|
|
232
|
+
RedisMemory,
|
|
233
|
+
SummaryMemory,
|
|
234
|
+
TenantBufferMemory,
|
|
235
|
+
} from '@lov3kaizen/agentsea-core';
|
|
236
|
+
|
|
237
|
+
// Simple buffer (keep last N messages)
|
|
238
|
+
const buffer = new BufferMemory(50);
|
|
239
|
+
|
|
240
|
+
// Redis-backed for persistence
|
|
241
|
+
const redis = new RedisMemory({ url: 'redis://localhost:6379' });
|
|
242
|
+
|
|
243
|
+
// Summary-based (compresses old conversations)
|
|
244
|
+
const summary = new SummaryMemory(provider);
|
|
245
|
+
|
|
246
|
+
// Multi-tenant (isolates memory per tenant)
|
|
247
|
+
const tenant = new TenantBufferMemory(100);
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Workflows
|
|
251
|
+
|
|
252
|
+
Orchestrate multiple agents in different patterns:
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
import {
|
|
256
|
+
SequentialWorkflow,
|
|
257
|
+
ParallelWorkflow,
|
|
258
|
+
SupervisorWorkflow,
|
|
259
|
+
} from '@lov3kaizen/agentsea-core';
|
|
260
|
+
|
|
261
|
+
// Sequential: agents run one after another
|
|
262
|
+
const sequential = new SequentialWorkflow({
|
|
263
|
+
name: 'research-pipeline',
|
|
264
|
+
agents: [researchAgent, analyzeAgent, summaryAgent],
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// Parallel: agents run simultaneously
|
|
268
|
+
const parallel = new ParallelWorkflow({
|
|
269
|
+
name: 'multi-analysis',
|
|
270
|
+
agents: [sentimentAgent, topicAgent, entityAgent],
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
// Supervisor: one agent delegates to others
|
|
274
|
+
const supervised = new SupervisorWorkflow({
|
|
275
|
+
name: 'managed-team',
|
|
276
|
+
supervisor: managerAgent,
|
|
277
|
+
workers: [codeAgent, testAgent, reviewAgent],
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
const result = await sequential.execute('Research AI trends', context);
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## MCP Integration
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
import { MCPRegistry } from '@lov3kaizen/agentsea-core';
|
|
287
|
+
|
|
288
|
+
const mcpRegistry = new MCPRegistry();
|
|
289
|
+
|
|
290
|
+
await mcpRegistry.addServer({
|
|
291
|
+
name: 'filesystem',
|
|
292
|
+
command: 'npx',
|
|
293
|
+
args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'],
|
|
294
|
+
transport: 'stdio',
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
const mcpTools = mcpRegistry.getTools();
|
|
298
|
+
const agent = new Agent({ tools: mcpTools }, provider, toolRegistry);
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## ACP (Agentic Commerce Protocol)
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
import { ACPClient, createACPTools } from '@lov3kaizen/agentsea-core';
|
|
305
|
+
|
|
306
|
+
const acpClient = new ACPClient({
|
|
307
|
+
baseUrl: 'https://api.yourcommerce.com/v1',
|
|
308
|
+
apiKey: process.env.ACP_API_KEY,
|
|
309
|
+
merchantId: process.env.ACP_MERCHANT_ID,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
// 14 commerce operations: search, cart, checkout, payments, orders
|
|
313
|
+
const acpTools = createACPTools(acpClient);
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Voice
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
import {
|
|
320
|
+
VoiceAgent,
|
|
321
|
+
OpenAIWhisperProvider,
|
|
322
|
+
OpenAITTSProvider,
|
|
323
|
+
} from '@lov3kaizen/agentsea-core';
|
|
324
|
+
|
|
325
|
+
const voiceAgent = new VoiceAgent(agent, {
|
|
326
|
+
sttProvider: new OpenAIWhisperProvider(process.env.OPENAI_API_KEY),
|
|
327
|
+
ttsProvider: new OpenAITTSProvider(process.env.OPENAI_API_KEY),
|
|
328
|
+
ttsConfig: { voice: 'nova' },
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
const result = await voiceAgent.processVoice(audioBuffer, context);
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**Supported Providers:**
|
|
335
|
+
|
|
336
|
+
- **STT:** OpenAI Whisper, Local Whisper
|
|
337
|
+
- **TTS:** OpenAI TTS, ElevenLabs, Piper TTS
|
|
338
|
+
|
|
339
|
+
## Conversation Schemas
|
|
340
|
+
|
|
341
|
+
```typescript
|
|
342
|
+
import { ConversationSchema } from '@lov3kaizen/agentsea-core';
|
|
343
|
+
import { z } from 'zod';
|
|
344
|
+
|
|
345
|
+
const schema = new ConversationSchema({
|
|
346
|
+
name: 'booking',
|
|
347
|
+
startStep: 'destination',
|
|
348
|
+
steps: [
|
|
349
|
+
{
|
|
350
|
+
id: 'destination',
|
|
351
|
+
prompt: 'Where would you like to go?',
|
|
352
|
+
schema: z.object({ city: z.string() }),
|
|
353
|
+
next: 'dates',
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
id: 'dates',
|
|
357
|
+
prompt: 'What dates?',
|
|
358
|
+
schema: z.object({ checkIn: z.string(), checkOut: z.string() }),
|
|
359
|
+
next: 'confirm',
|
|
360
|
+
},
|
|
361
|
+
],
|
|
362
|
+
});
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
## Observability
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
import {
|
|
369
|
+
Logger,
|
|
370
|
+
defaultLogger,
|
|
371
|
+
MetricsCollector,
|
|
372
|
+
globalMetrics,
|
|
373
|
+
Tracer,
|
|
374
|
+
globalTracer,
|
|
375
|
+
} from '@lov3kaizen/agentsea-core';
|
|
376
|
+
|
|
377
|
+
// Structured logging
|
|
378
|
+
const logger = new Logger({ level: 'info', pretty: true });
|
|
379
|
+
logger.info('Agent started', { agent: 'assistant' });
|
|
380
|
+
|
|
381
|
+
// Metrics collection
|
|
382
|
+
globalMetrics.increment('agent.requests');
|
|
383
|
+
globalMetrics.histogram('agent.latency', 150);
|
|
384
|
+
|
|
385
|
+
// Distributed tracing
|
|
386
|
+
const span = globalTracer.startSpan('agent.execute');
|
|
387
|
+
span.end();
|
|
86
388
|
```
|
|
87
389
|
|
|
88
|
-
##
|
|
390
|
+
## Utilities
|
|
391
|
+
|
|
392
|
+
```typescript
|
|
393
|
+
import {
|
|
394
|
+
RateLimiter,
|
|
395
|
+
LRUCache,
|
|
396
|
+
ContentFormatter,
|
|
397
|
+
} from '@lov3kaizen/agentsea-core';
|
|
398
|
+
|
|
399
|
+
// Rate limiting
|
|
400
|
+
const limiter = new RateLimiter({ maxRequests: 100, windowMs: 60000 });
|
|
401
|
+
|
|
402
|
+
// LRU caching
|
|
403
|
+
const cache = new LRUCache<string>({ maxSize: 1000 });
|
|
404
|
+
|
|
405
|
+
// Content formatting
|
|
406
|
+
const formatted = ContentFormatter.format(response);
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
## API Reference
|
|
410
|
+
|
|
411
|
+
### Agent
|
|
412
|
+
|
|
413
|
+
| Method | Description |
|
|
414
|
+
| ---------------------------------- | -------------------------------------------- |
|
|
415
|
+
| `execute(input, context)` | Execute agent with input and return response |
|
|
416
|
+
| `executeStream(input, context)` | Stream agent response chunks |
|
|
417
|
+
| `registerProvider(name, provider)` | Register a provider |
|
|
89
418
|
|
|
90
|
-
|
|
419
|
+
### ToolRegistry
|
|
91
420
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
- [API Reference](https://agentsea.dev/api)
|
|
421
|
+
| Method | Description |
|
|
422
|
+
| -------------------------------- | ------------------------- |
|
|
423
|
+
| `register(tool)` | Register a tool |
|
|
424
|
+
| `get(name)` | Get a tool by name |
|
|
425
|
+
| `list()` | List all registered tools |
|
|
426
|
+
| `execute(name, params, context)` | Execute a tool |
|
|
99
427
|
|
|
100
428
|
## Related Packages
|
|
101
429
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
430
|
+
| Package | Description |
|
|
431
|
+
| ------------------------------------------------ | ------------------------------------------ |
|
|
432
|
+
| [@lov3kaizen/agentsea-cli](../cli) | Command-line interface with agentic coding |
|
|
433
|
+
| [@lov3kaizen/agentsea-nestjs](../nestjs) | NestJS integration |
|
|
434
|
+
| [@lov3kaizen/agentsea-crews](../crews) | Multi-agent orchestration |
|
|
435
|
+
| [@lov3kaizen/agentsea-memory](../memory) | Advanced memory systems |
|
|
436
|
+
| [@lov3kaizen/agentsea-cache](../cache) | Intelligent LLM caching |
|
|
437
|
+
| [@lov3kaizen/agentsea-guardrails](../guardrails) | Safety & validation |
|
|
438
|
+
| [@lov3kaizen/agentsea-evaluate](../evaluate) | LLM evaluation |
|
|
439
|
+
| [@lov3kaizen/agentsea-redteam](../redteam) | Red teaming & security |
|
|
440
|
+
| [@lov3kaizen/agentsea-analytics](../analytics) | Conversation analytics |
|
|
441
|
+
| [@lov3kaizen/agentsea-react](../react) | React components |
|
|
105
442
|
|
|
106
443
|
## License
|
|
107
444
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Tool, ToolCall, ToolContext, AgentConfig, LLMProvider, MemoryStore, AgentContext, AgentResponse, StreamEvent, RetryConfig, Message, ProviderConfig, LLMResponse, LLMStreamChunk, ProviderModelConfig,
|
|
1
|
+
import { Tool, ToolCall, ToolContext, AgentConfig, LLMProvider, MemoryStore, AgentContext, AgentResponse, StreamEvent, RetryConfig, Message, ProviderConfig, LLMResponse, LLMStreamChunk, ProviderModelConfig, ModelCapabilities, AnthropicConfig, AnthropicModelCapabilities, OpenAIConfig, OpenAIModelCapabilities, GeminiConfig, GeminiModelCapabilities, MistralConfig, MistralModelCapabilities, DeepSeekConfig, DeepSeekModelCapabilities, XAIConfig, XAIModelCapabilities, ModelInfo, AnthropicModel, GeminiModel, OllamaConfig as OllamaConfig$1, OpenAIModel, WorkflowConfig, AgentMetrics, SpanContext, OutputFormat, FormatOptions, FormattedContent, VoiceAgentConfig, VoiceMessage, STTConfig, TTSConfig, STTProvider, STTResult, TTSProvider, TTSResult, AudioFormat, TenantStorage, Tenant, TenantStatus, TenantApiKey, TenantQuota } from '@lov3kaizen/agentsea-types';
|
|
2
2
|
export * from '@lov3kaizen/agentsea-types';
|
|
3
3
|
export { AudioFormat, STTConfig, STTProvider, STTResult, TTSConfig, TTSProvider, TTSResult, Tenant, TenantApiKey, TenantContext, TenantQuota, TenantResolver, TenantSettings, TenantStatus, TenantStorage, VoiceAgentConfig, VoiceMessage, VoiceType } from '@lov3kaizen/agentsea-types';
|
|
4
4
|
import { z } from 'zod';
|
|
@@ -193,6 +193,7 @@ declare const calculatorClient: ClientTool<z.ZodObject<{
|
|
|
193
193
|
declare class AnthropicProvider implements LLMProvider {
|
|
194
194
|
private client;
|
|
195
195
|
constructor(apiKey?: string);
|
|
196
|
+
private buildRequestParams;
|
|
196
197
|
generateResponse(messages: Message[], config: ProviderConfig): Promise<LLMResponse>;
|
|
197
198
|
streamResponse(messages: Message[], config: ProviderConfig): AsyncIterable<LLMStreamChunk>;
|
|
198
199
|
parseToolCalls(response: LLMResponse): ToolCall[];
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Tool, ToolCall, ToolContext, AgentConfig, LLMProvider, MemoryStore, AgentContext, AgentResponse, StreamEvent, RetryConfig, Message, ProviderConfig, LLMResponse, LLMStreamChunk, ProviderModelConfig,
|
|
1
|
+
import { Tool, ToolCall, ToolContext, AgentConfig, LLMProvider, MemoryStore, AgentContext, AgentResponse, StreamEvent, RetryConfig, Message, ProviderConfig, LLMResponse, LLMStreamChunk, ProviderModelConfig, ModelCapabilities, AnthropicConfig, AnthropicModelCapabilities, OpenAIConfig, OpenAIModelCapabilities, GeminiConfig, GeminiModelCapabilities, MistralConfig, MistralModelCapabilities, DeepSeekConfig, DeepSeekModelCapabilities, XAIConfig, XAIModelCapabilities, ModelInfo, AnthropicModel, GeminiModel, OllamaConfig as OllamaConfig$1, OpenAIModel, WorkflowConfig, AgentMetrics, SpanContext, OutputFormat, FormatOptions, FormattedContent, VoiceAgentConfig, VoiceMessage, STTConfig, TTSConfig, STTProvider, STTResult, TTSProvider, TTSResult, AudioFormat, TenantStorage, Tenant, TenantStatus, TenantApiKey, TenantQuota } from '@lov3kaizen/agentsea-types';
|
|
2
2
|
export * from '@lov3kaizen/agentsea-types';
|
|
3
3
|
export { AudioFormat, STTConfig, STTProvider, STTResult, TTSConfig, TTSProvider, TTSResult, Tenant, TenantApiKey, TenantContext, TenantQuota, TenantResolver, TenantSettings, TenantStatus, TenantStorage, VoiceAgentConfig, VoiceMessage, VoiceType } from '@lov3kaizen/agentsea-types';
|
|
4
4
|
import { z } from 'zod';
|
|
@@ -193,6 +193,7 @@ declare const calculatorClient: ClientTool<z.ZodObject<{
|
|
|
193
193
|
declare class AnthropicProvider implements LLMProvider {
|
|
194
194
|
private client;
|
|
195
195
|
constructor(apiKey?: string);
|
|
196
|
+
private buildRequestParams;
|
|
196
197
|
generateResponse(messages: Message[], config: ProviderConfig): Promise<LLMResponse>;
|
|
197
198
|
streamResponse(messages: Message[], config: ProviderConfig): AsyncIterable<LLMStreamChunk>;
|
|
198
199
|
parseToolCalls(response: LLMResponse): ToolCall[];
|
package/dist/index.js
CHANGED
|
@@ -34,7 +34,6 @@ __export(index_exports, {
|
|
|
34
34
|
ACPClient: () => ACPClient,
|
|
35
35
|
Agent: () => Agent,
|
|
36
36
|
AnthropicProvider: () => AnthropicProvider,
|
|
37
|
-
AudioFormat: () => import_agentsea_types.AudioFormat,
|
|
38
37
|
BufferMemory: () => BufferMemory,
|
|
39
38
|
Cache: () => Cache,
|
|
40
39
|
ContentFormatter: () => ContentFormatter,
|
|
@@ -64,35 +63,19 @@ __export(index_exports, {
|
|
|
64
63
|
RateLimiter: () => RateLimiter,
|
|
65
64
|
RedisMemory: () => RedisMemory,
|
|
66
65
|
SSETransport: () => SSETransport,
|
|
67
|
-
STTConfig: () => import_agentsea_types.STTConfig,
|
|
68
|
-
STTProvider: () => import_agentsea_types.STTProvider,
|
|
69
|
-
STTResult: () => import_agentsea_types.STTResult,
|
|
70
66
|
SequentialWorkflow: () => SequentialWorkflow,
|
|
71
67
|
SlidingWindowRateLimiter: () => SlidingWindowRateLimiter,
|
|
72
68
|
StdioTransport: () => StdioTransport,
|
|
73
69
|
SummaryMemory: () => SummaryMemory,
|
|
74
70
|
SupervisorWorkflow: () => SupervisorWorkflow,
|
|
75
|
-
TTSConfig: () => import_agentsea_types.TTSConfig,
|
|
76
|
-
TTSProvider: () => import_agentsea_types.TTSProvider,
|
|
77
|
-
TTSResult: () => import_agentsea_types.TTSResult,
|
|
78
|
-
Tenant: () => import_agentsea_types2.Tenant,
|
|
79
|
-
TenantApiKey: () => import_agentsea_types2.TenantApiKey,
|
|
80
71
|
TenantBufferMemory: () => TenantBufferMemory,
|
|
81
|
-
TenantContext: () => import_agentsea_types2.TenantContext,
|
|
82
72
|
TenantManager: () => TenantManager,
|
|
83
|
-
|
|
84
|
-
TenantResolver: () => import_agentsea_types2.TenantResolver,
|
|
85
|
-
TenantSettings: () => import_agentsea_types2.TenantSettings,
|
|
86
|
-
TenantStatus: () => import_agentsea_types2.TenantStatus,
|
|
87
|
-
TenantStorage: () => import_agentsea_types2.TenantStorage,
|
|
73
|
+
TenantStatus: () => import_agentsea_types.TenantStatus,
|
|
88
74
|
TextGenerationWebUIProvider: () => TextGenerationWebUIProvider,
|
|
89
75
|
ToolRegistry: () => ToolRegistry,
|
|
90
76
|
Tracer: () => Tracer,
|
|
91
77
|
VLLMProvider: () => VLLMProvider,
|
|
92
78
|
VoiceAgent: () => VoiceAgent,
|
|
93
|
-
VoiceAgentConfig: () => import_agentsea_types.VoiceAgentConfig,
|
|
94
|
-
VoiceMessage: () => import_agentsea_types.VoiceMessage,
|
|
95
|
-
VoiceType: () => import_agentsea_types.VoiceType,
|
|
96
79
|
Workflow: () => Workflow,
|
|
97
80
|
WorkflowFactory: () => WorkflowFactory,
|
|
98
81
|
calculatorClient: () => calculatorClient,
|
|
@@ -312,6 +295,10 @@ var Agent = class {
|
|
|
312
295
|
this.toolRegistry = toolRegistry;
|
|
313
296
|
this.memory = memory;
|
|
314
297
|
}
|
|
298
|
+
config;
|
|
299
|
+
provider;
|
|
300
|
+
toolRegistry;
|
|
301
|
+
memory;
|
|
315
302
|
iterationCount = 0;
|
|
316
303
|
/**
|
|
317
304
|
* Execute the agent with the given input
|
|
@@ -1798,7 +1785,7 @@ var grepTool = {
|
|
|
1798
1785
|
// src/tools/built-in/git.tool.ts
|
|
1799
1786
|
var import_child_process2 = require("child_process");
|
|
1800
1787
|
var import_zod11 = require("zod");
|
|
1801
|
-
var GIT_TIMEOUT_MS =
|
|
1788
|
+
var GIT_TIMEOUT_MS = 3e4;
|
|
1802
1789
|
function gitExec(args, cwd) {
|
|
1803
1790
|
return (0, import_child_process2.execSync)(`git ${args}`, {
|
|
1804
1791
|
cwd: cwd || process.cwd(),
|
|
@@ -2158,6 +2145,8 @@ var calculatorClient = calculatorDef.client(({ operation, a, b }) => {
|
|
|
2158
2145
|
// src/providers/anthropic.ts
|
|
2159
2146
|
var import_sdk = __toESM(require("@anthropic-ai/sdk"));
|
|
2160
2147
|
var import_zod_to_json_schema = require("zod-to-json-schema");
|
|
2148
|
+
var SAMPLING_REMOVED = /^claude-(opus-4-[789]|fable-5|mythos-5)/;
|
|
2149
|
+
var ADAPTIVE_THINKING = /^claude-(opus-4-[6789]|sonnet-4-6|fable-5|mythos-5)/;
|
|
2161
2150
|
var AnthropicProvider = class {
|
|
2162
2151
|
client;
|
|
2163
2152
|
constructor(apiKey) {
|
|
@@ -2165,6 +2154,30 @@ var AnthropicProvider = class {
|
|
|
2165
2154
|
apiKey: apiKey || process.env.ANTHROPIC_API_KEY
|
|
2166
2155
|
});
|
|
2167
2156
|
}
|
|
2157
|
+
/**
|
|
2158
|
+
* Build model-aware request parameters. Modern Claude models reject
|
|
2159
|
+
* removed sampling params, and Claude 4+ rejects temperature and
|
|
2160
|
+
* top_p together — temperature wins when both are configured.
|
|
2161
|
+
*/
|
|
2162
|
+
buildRequestParams(config, defaultMaxTokens) {
|
|
2163
|
+
const params = {
|
|
2164
|
+
max_tokens: config.maxTokens || defaultMaxTokens
|
|
2165
|
+
};
|
|
2166
|
+
if (!SAMPLING_REMOVED.test(config.model)) {
|
|
2167
|
+
if (config.temperature !== void 0) {
|
|
2168
|
+
params.temperature = config.temperature;
|
|
2169
|
+
} else if (config.topP !== void 0) {
|
|
2170
|
+
params.top_p = config.topP;
|
|
2171
|
+
}
|
|
2172
|
+
}
|
|
2173
|
+
if (config.thinking && ADAPTIVE_THINKING.test(config.model)) {
|
|
2174
|
+
params.thinking = config.thinking === true ? { type: "adaptive" } : config.thinking;
|
|
2175
|
+
}
|
|
2176
|
+
if (config.effort && ADAPTIVE_THINKING.test(config.model)) {
|
|
2177
|
+
params.output_config = { effort: config.effort };
|
|
2178
|
+
}
|
|
2179
|
+
return params;
|
|
2180
|
+
}
|
|
2168
2181
|
/**
|
|
2169
2182
|
* Generate a response from Claude
|
|
2170
2183
|
*/
|
|
@@ -2177,14 +2190,12 @@ var AnthropicProvider = class {
|
|
|
2177
2190
|
})) : void 0;
|
|
2178
2191
|
const response = await this.client.messages.create({
|
|
2179
2192
|
model: config.model,
|
|
2180
|
-
max_tokens: config.maxTokens || 1024,
|
|
2181
|
-
temperature: config.temperature,
|
|
2182
2193
|
system: config.systemPrompt,
|
|
2183
2194
|
messages: anthropicMessages,
|
|
2184
2195
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2185
2196
|
tools,
|
|
2186
|
-
|
|
2187
|
-
|
|
2197
|
+
stop_sequences: config.stopSequences,
|
|
2198
|
+
...this.buildRequestParams(config, 16e3)
|
|
2188
2199
|
});
|
|
2189
2200
|
const textContent = response.content.filter((block) => block.type === "text").map((block) => block.text).join("\n");
|
|
2190
2201
|
return {
|
|
@@ -2209,14 +2220,12 @@ var AnthropicProvider = class {
|
|
|
2209
2220
|
})) : void 0;
|
|
2210
2221
|
const stream = await this.client.messages.stream({
|
|
2211
2222
|
model: config.model,
|
|
2212
|
-
max_tokens: config.maxTokens || 1024,
|
|
2213
|
-
temperature: config.temperature,
|
|
2214
2223
|
system: config.systemPrompt,
|
|
2215
2224
|
messages: anthropicMessages,
|
|
2216
2225
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2217
2226
|
tools,
|
|
2218
|
-
|
|
2219
|
-
|
|
2227
|
+
stop_sequences: config.stopSequences,
|
|
2228
|
+
...this.buildRequestParams(config, 64e3)
|
|
2220
2229
|
});
|
|
2221
2230
|
for await (const event of stream) {
|
|
2222
2231
|
if (event.type === "content_block_delta") {
|
|
@@ -2398,6 +2407,9 @@ var OpenAIProvider = class {
|
|
|
2398
2407
|
const choice = rawResponse.choices[0];
|
|
2399
2408
|
if (choice?.message.tool_calls) {
|
|
2400
2409
|
for (const toolCall of choice.message.tool_calls) {
|
|
2410
|
+
if (toolCall.type !== "function") {
|
|
2411
|
+
continue;
|
|
2412
|
+
}
|
|
2401
2413
|
toolCalls.push({
|
|
2402
2414
|
id: toolCall.id,
|
|
2403
2415
|
tool: toolCall.function.name,
|
|
@@ -2457,7 +2469,7 @@ var GeminiProvider = class {
|
|
|
2457
2469
|
* Generate a response from the Gemini model
|
|
2458
2470
|
*/
|
|
2459
2471
|
async generateResponse(messages, config) {
|
|
2460
|
-
const model = this.getModel(config.model || "gemini-pro");
|
|
2472
|
+
const model = this.getModel(config.model || "gemini-3.1-pro-preview");
|
|
2461
2473
|
const contents = this.convertMessages(messages);
|
|
2462
2474
|
const generationConfig = {
|
|
2463
2475
|
temperature: config.temperature || 0.7,
|
|
@@ -2491,7 +2503,7 @@ var GeminiProvider = class {
|
|
|
2491
2503
|
* Stream responses from Gemini
|
|
2492
2504
|
*/
|
|
2493
2505
|
async *streamResponse(messages, config) {
|
|
2494
|
-
const model = this.getModel(config.model || "gemini-pro");
|
|
2506
|
+
const model = this.getModel(config.model || "gemini-3.1-pro-preview");
|
|
2495
2507
|
const contents = this.convertMessages(messages);
|
|
2496
2508
|
const generationConfig = {
|
|
2497
2509
|
temperature: config.temperature || 0.7,
|
|
@@ -2974,6 +2986,9 @@ var OpenAICompatibleProvider = class {
|
|
|
2974
2986
|
const choice = rawResponse.choices[0];
|
|
2975
2987
|
if (choice?.message.tool_calls) {
|
|
2976
2988
|
for (const toolCall of choice.message.tool_calls) {
|
|
2989
|
+
if (toolCall.type !== "function") {
|
|
2990
|
+
continue;
|
|
2991
|
+
}
|
|
2977
2992
|
toolCalls.push({
|
|
2978
2993
|
id: toolCall.id,
|
|
2979
2994
|
tool: toolCall.function.name,
|
|
@@ -3174,6 +3189,7 @@ var BufferMemory = class {
|
|
|
3174
3189
|
constructor(maxMessages) {
|
|
3175
3190
|
this.maxMessages = maxMessages;
|
|
3176
3191
|
}
|
|
3192
|
+
maxMessages;
|
|
3177
3193
|
store = /* @__PURE__ */ new Map();
|
|
3178
3194
|
/**
|
|
3179
3195
|
* Save messages to memory
|
|
@@ -3294,11 +3310,14 @@ var RedisMemory = class {
|
|
|
3294
3310
|
|
|
3295
3311
|
// src/memory/summary-memory.ts
|
|
3296
3312
|
var SummaryMemory = class {
|
|
3297
|
-
constructor(provider, maxRecentMessages = 10, summaryModel = "claude-
|
|
3313
|
+
constructor(provider, maxRecentMessages = 10, summaryModel = "claude-haiku-4-5") {
|
|
3298
3314
|
this.provider = provider;
|
|
3299
3315
|
this.maxRecentMessages = maxRecentMessages;
|
|
3300
3316
|
this.summaryModel = summaryModel;
|
|
3301
3317
|
}
|
|
3318
|
+
provider;
|
|
3319
|
+
maxRecentMessages;
|
|
3320
|
+
summaryModel;
|
|
3302
3321
|
store = /* @__PURE__ */ new Map();
|
|
3303
3322
|
/**
|
|
3304
3323
|
* Save messages with automatic summarization
|
|
@@ -3388,6 +3407,7 @@ var TenantBufferMemory = class {
|
|
|
3388
3407
|
constructor(maxMessages) {
|
|
3389
3408
|
this.maxMessages = maxMessages;
|
|
3390
3409
|
}
|
|
3410
|
+
maxMessages;
|
|
3391
3411
|
store = /* @__PURE__ */ new Map();
|
|
3392
3412
|
/**
|
|
3393
3413
|
* Save messages to memory with tenant isolation
|
|
@@ -3497,6 +3517,10 @@ var Workflow = class {
|
|
|
3497
3517
|
this.memory = memory;
|
|
3498
3518
|
this.initializeAgents();
|
|
3499
3519
|
}
|
|
3520
|
+
config;
|
|
3521
|
+
provider;
|
|
3522
|
+
toolRegistry;
|
|
3523
|
+
memory;
|
|
3500
3524
|
agents = /* @__PURE__ */ new Map();
|
|
3501
3525
|
/**
|
|
3502
3526
|
* Initialize all agents in the workflow
|
|
@@ -4045,6 +4069,8 @@ var RateLimiter = class {
|
|
|
4045
4069
|
this.tokens = maxTokens;
|
|
4046
4070
|
this.lastRefill = Date.now();
|
|
4047
4071
|
}
|
|
4072
|
+
maxTokens;
|
|
4073
|
+
refillRate;
|
|
4048
4074
|
tokens;
|
|
4049
4075
|
lastRefill;
|
|
4050
4076
|
/**
|
|
@@ -4103,6 +4129,8 @@ var SlidingWindowRateLimiter = class {
|
|
|
4103
4129
|
this.maxRequests = maxRequests;
|
|
4104
4130
|
this.windowMs = windowMs;
|
|
4105
4131
|
}
|
|
4132
|
+
maxRequests;
|
|
4133
|
+
windowMs;
|
|
4106
4134
|
requests = /* @__PURE__ */ new Map();
|
|
4107
4135
|
/**
|
|
4108
4136
|
* Check if request is allowed
|
|
@@ -4147,6 +4175,7 @@ var Cache = class {
|
|
|
4147
4175
|
constructor(defaultTTL) {
|
|
4148
4176
|
this.defaultTTL = defaultTTL;
|
|
4149
4177
|
}
|
|
4178
|
+
defaultTTL;
|
|
4150
4179
|
store = /* @__PURE__ */ new Map();
|
|
4151
4180
|
/**
|
|
4152
4181
|
* Set a value in the cache
|
|
@@ -4249,6 +4278,7 @@ var LRUCache = class {
|
|
|
4249
4278
|
constructor(maxSize) {
|
|
4250
4279
|
this.maxSize = maxSize;
|
|
4251
4280
|
}
|
|
4281
|
+
maxSize;
|
|
4252
4282
|
cache = /* @__PURE__ */ new Map();
|
|
4253
4283
|
/**
|
|
4254
4284
|
* Get a value from the cache
|
|
@@ -4316,6 +4346,9 @@ var StdioTransport = class extends import_events.EventEmitter {
|
|
|
4316
4346
|
this.args = args;
|
|
4317
4347
|
this.env = env;
|
|
4318
4348
|
}
|
|
4349
|
+
command;
|
|
4350
|
+
args;
|
|
4351
|
+
env;
|
|
4319
4352
|
process = null;
|
|
4320
4353
|
connected = false;
|
|
4321
4354
|
buffer = "";
|
|
@@ -4387,6 +4420,7 @@ var SSETransport = class extends import_events.EventEmitter {
|
|
|
4387
4420
|
super();
|
|
4388
4421
|
this.url = url;
|
|
4389
4422
|
}
|
|
4423
|
+
url;
|
|
4390
4424
|
eventSource = null;
|
|
4391
4425
|
connected = false;
|
|
4392
4426
|
async connect() {
|
|
@@ -4454,6 +4488,7 @@ var MCPClient = class extends import_events2.EventEmitter {
|
|
|
4454
4488
|
super();
|
|
4455
4489
|
this.config = config;
|
|
4456
4490
|
}
|
|
4491
|
+
config;
|
|
4457
4492
|
transport = null;
|
|
4458
4493
|
serverInfo = null;
|
|
4459
4494
|
requestId = 0;
|
|
@@ -5746,9 +5781,6 @@ Respond naturally while ensuring you gather the required information.`;
|
|
|
5746
5781
|
}
|
|
5747
5782
|
};
|
|
5748
5783
|
|
|
5749
|
-
// src/types/voice.ts
|
|
5750
|
-
var import_agentsea_types = require("@lov3kaizen/agentsea-types");
|
|
5751
|
-
|
|
5752
5784
|
// src/voice/voice-agent.ts
|
|
5753
5785
|
var import_fs5 = require("fs");
|
|
5754
5786
|
var import_path3 = require("path");
|
|
@@ -6706,7 +6738,7 @@ var LemonFoxTTSProvider = class extends OpenAITTSProvider {
|
|
|
6706
6738
|
var import_crypto2 = require("crypto");
|
|
6707
6739
|
|
|
6708
6740
|
// src/types/tenant.ts
|
|
6709
|
-
var
|
|
6741
|
+
var import_agentsea_types = require("@lov3kaizen/agentsea-types");
|
|
6710
6742
|
|
|
6711
6743
|
// src/tenant/tenant-manager.ts
|
|
6712
6744
|
var TenantManager = class {
|
|
@@ -6735,7 +6767,7 @@ var TenantManager = class {
|
|
|
6735
6767
|
slug: data.slug,
|
|
6736
6768
|
metadata: data.metadata,
|
|
6737
6769
|
settings: { ...this.defaultSettings, ...data.settings },
|
|
6738
|
-
status:
|
|
6770
|
+
status: import_agentsea_types.TenantStatus.ACTIVE
|
|
6739
6771
|
});
|
|
6740
6772
|
return tenant;
|
|
6741
6773
|
}
|
|
@@ -6765,13 +6797,13 @@ var TenantManager = class {
|
|
|
6765
6797
|
* Suspend tenant
|
|
6766
6798
|
*/
|
|
6767
6799
|
async suspendTenant(tenantId) {
|
|
6768
|
-
return this.updateTenant(tenantId, { status:
|
|
6800
|
+
return this.updateTenant(tenantId, { status: import_agentsea_types.TenantStatus.SUSPENDED });
|
|
6769
6801
|
}
|
|
6770
6802
|
/**
|
|
6771
6803
|
* Activate tenant
|
|
6772
6804
|
*/
|
|
6773
6805
|
async activateTenant(tenantId) {
|
|
6774
|
-
return this.updateTenant(tenantId, { status:
|
|
6806
|
+
return this.updateTenant(tenantId, { status: import_agentsea_types.TenantStatus.ACTIVE });
|
|
6775
6807
|
}
|
|
6776
6808
|
/**
|
|
6777
6809
|
* Delete tenant and all associated data
|
|
@@ -6821,7 +6853,7 @@ var TenantManager = class {
|
|
|
6821
6853
|
return null;
|
|
6822
6854
|
}
|
|
6823
6855
|
const tenant = await this.storage.getTenant(apiKey.tenantId);
|
|
6824
|
-
if (!tenant || tenant.status !==
|
|
6856
|
+
if (!tenant || tenant.status !== import_agentsea_types.TenantStatus.ACTIVE) {
|
|
6825
6857
|
return null;
|
|
6826
6858
|
}
|
|
6827
6859
|
return tenant;
|
|
@@ -7035,7 +7067,6 @@ var MemoryTenantStorage = class {
|
|
|
7035
7067
|
ACPClient,
|
|
7036
7068
|
Agent,
|
|
7037
7069
|
AnthropicProvider,
|
|
7038
|
-
AudioFormat,
|
|
7039
7070
|
BufferMemory,
|
|
7040
7071
|
Cache,
|
|
7041
7072
|
ContentFormatter,
|
|
@@ -7065,35 +7096,19 @@ var MemoryTenantStorage = class {
|
|
|
7065
7096
|
RateLimiter,
|
|
7066
7097
|
RedisMemory,
|
|
7067
7098
|
SSETransport,
|
|
7068
|
-
STTConfig,
|
|
7069
|
-
STTProvider,
|
|
7070
|
-
STTResult,
|
|
7071
7099
|
SequentialWorkflow,
|
|
7072
7100
|
SlidingWindowRateLimiter,
|
|
7073
7101
|
StdioTransport,
|
|
7074
7102
|
SummaryMemory,
|
|
7075
7103
|
SupervisorWorkflow,
|
|
7076
|
-
TTSConfig,
|
|
7077
|
-
TTSProvider,
|
|
7078
|
-
TTSResult,
|
|
7079
|
-
Tenant,
|
|
7080
|
-
TenantApiKey,
|
|
7081
7104
|
TenantBufferMemory,
|
|
7082
|
-
TenantContext,
|
|
7083
7105
|
TenantManager,
|
|
7084
|
-
TenantQuota,
|
|
7085
|
-
TenantResolver,
|
|
7086
|
-
TenantSettings,
|
|
7087
7106
|
TenantStatus,
|
|
7088
|
-
TenantStorage,
|
|
7089
7107
|
TextGenerationWebUIProvider,
|
|
7090
7108
|
ToolRegistry,
|
|
7091
7109
|
Tracer,
|
|
7092
7110
|
VLLMProvider,
|
|
7093
7111
|
VoiceAgent,
|
|
7094
|
-
VoiceAgentConfig,
|
|
7095
|
-
VoiceMessage,
|
|
7096
|
-
VoiceType,
|
|
7097
7112
|
Workflow,
|
|
7098
7113
|
WorkflowFactory,
|
|
7099
7114
|
calculatorClient,
|
package/dist/index.mjs
CHANGED
|
@@ -22,7 +22,6 @@ __export(index_exports, {
|
|
|
22
22
|
ACPClient: () => ACPClient,
|
|
23
23
|
Agent: () => Agent,
|
|
24
24
|
AnthropicProvider: () => AnthropicProvider,
|
|
25
|
-
AudioFormat: () => AudioFormat,
|
|
26
25
|
BufferMemory: () => BufferMemory,
|
|
27
26
|
Cache: () => Cache,
|
|
28
27
|
ContentFormatter: () => ContentFormatter,
|
|
@@ -52,35 +51,19 @@ __export(index_exports, {
|
|
|
52
51
|
RateLimiter: () => RateLimiter,
|
|
53
52
|
RedisMemory: () => RedisMemory,
|
|
54
53
|
SSETransport: () => SSETransport,
|
|
55
|
-
STTConfig: () => STTConfig,
|
|
56
|
-
STTProvider: () => STTProvider,
|
|
57
|
-
STTResult: () => STTResult,
|
|
58
54
|
SequentialWorkflow: () => SequentialWorkflow,
|
|
59
55
|
SlidingWindowRateLimiter: () => SlidingWindowRateLimiter,
|
|
60
56
|
StdioTransport: () => StdioTransport,
|
|
61
57
|
SummaryMemory: () => SummaryMemory,
|
|
62
58
|
SupervisorWorkflow: () => SupervisorWorkflow,
|
|
63
|
-
TTSConfig: () => TTSConfig,
|
|
64
|
-
TTSProvider: () => TTSProvider,
|
|
65
|
-
TTSResult: () => TTSResult,
|
|
66
|
-
Tenant: () => Tenant,
|
|
67
|
-
TenantApiKey: () => TenantApiKey,
|
|
68
59
|
TenantBufferMemory: () => TenantBufferMemory,
|
|
69
|
-
TenantContext: () => TenantContext,
|
|
70
60
|
TenantManager: () => TenantManager,
|
|
71
|
-
TenantQuota: () => TenantQuota,
|
|
72
|
-
TenantResolver: () => TenantResolver,
|
|
73
|
-
TenantSettings: () => TenantSettings,
|
|
74
61
|
TenantStatus: () => TenantStatus,
|
|
75
|
-
TenantStorage: () => TenantStorage,
|
|
76
62
|
TextGenerationWebUIProvider: () => TextGenerationWebUIProvider,
|
|
77
63
|
ToolRegistry: () => ToolRegistry,
|
|
78
64
|
Tracer: () => Tracer,
|
|
79
65
|
VLLMProvider: () => VLLMProvider,
|
|
80
66
|
VoiceAgent: () => VoiceAgent,
|
|
81
|
-
VoiceAgentConfig: () => VoiceAgentConfig,
|
|
82
|
-
VoiceMessage: () => VoiceMessage,
|
|
83
|
-
VoiceType: () => VoiceType,
|
|
84
67
|
Workflow: () => Workflow,
|
|
85
68
|
WorkflowFactory: () => WorkflowFactory,
|
|
86
69
|
calculatorClient: () => calculatorClient,
|
|
@@ -300,6 +283,10 @@ var Agent = class {
|
|
|
300
283
|
this.toolRegistry = toolRegistry;
|
|
301
284
|
this.memory = memory;
|
|
302
285
|
}
|
|
286
|
+
config;
|
|
287
|
+
provider;
|
|
288
|
+
toolRegistry;
|
|
289
|
+
memory;
|
|
303
290
|
iterationCount = 0;
|
|
304
291
|
/**
|
|
305
292
|
* Execute the agent with the given input
|
|
@@ -1786,7 +1773,7 @@ var grepTool = {
|
|
|
1786
1773
|
// src/tools/built-in/git.tool.ts
|
|
1787
1774
|
import { execSync as execSync2 } from "child_process";
|
|
1788
1775
|
import { z as z11 } from "zod";
|
|
1789
|
-
var GIT_TIMEOUT_MS =
|
|
1776
|
+
var GIT_TIMEOUT_MS = 3e4;
|
|
1790
1777
|
function gitExec(args, cwd) {
|
|
1791
1778
|
return execSync2(`git ${args}`, {
|
|
1792
1779
|
cwd: cwd || process.cwd(),
|
|
@@ -2146,6 +2133,8 @@ var calculatorClient = calculatorDef.client(({ operation, a, b }) => {
|
|
|
2146
2133
|
// src/providers/anthropic.ts
|
|
2147
2134
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2148
2135
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
2136
|
+
var SAMPLING_REMOVED = /^claude-(opus-4-[789]|fable-5|mythos-5)/;
|
|
2137
|
+
var ADAPTIVE_THINKING = /^claude-(opus-4-[6789]|sonnet-4-6|fable-5|mythos-5)/;
|
|
2149
2138
|
var AnthropicProvider = class {
|
|
2150
2139
|
client;
|
|
2151
2140
|
constructor(apiKey) {
|
|
@@ -2153,6 +2142,30 @@ var AnthropicProvider = class {
|
|
|
2153
2142
|
apiKey: apiKey || process.env.ANTHROPIC_API_KEY
|
|
2154
2143
|
});
|
|
2155
2144
|
}
|
|
2145
|
+
/**
|
|
2146
|
+
* Build model-aware request parameters. Modern Claude models reject
|
|
2147
|
+
* removed sampling params, and Claude 4+ rejects temperature and
|
|
2148
|
+
* top_p together — temperature wins when both are configured.
|
|
2149
|
+
*/
|
|
2150
|
+
buildRequestParams(config, defaultMaxTokens) {
|
|
2151
|
+
const params = {
|
|
2152
|
+
max_tokens: config.maxTokens || defaultMaxTokens
|
|
2153
|
+
};
|
|
2154
|
+
if (!SAMPLING_REMOVED.test(config.model)) {
|
|
2155
|
+
if (config.temperature !== void 0) {
|
|
2156
|
+
params.temperature = config.temperature;
|
|
2157
|
+
} else if (config.topP !== void 0) {
|
|
2158
|
+
params.top_p = config.topP;
|
|
2159
|
+
}
|
|
2160
|
+
}
|
|
2161
|
+
if (config.thinking && ADAPTIVE_THINKING.test(config.model)) {
|
|
2162
|
+
params.thinking = config.thinking === true ? { type: "adaptive" } : config.thinking;
|
|
2163
|
+
}
|
|
2164
|
+
if (config.effort && ADAPTIVE_THINKING.test(config.model)) {
|
|
2165
|
+
params.output_config = { effort: config.effort };
|
|
2166
|
+
}
|
|
2167
|
+
return params;
|
|
2168
|
+
}
|
|
2156
2169
|
/**
|
|
2157
2170
|
* Generate a response from Claude
|
|
2158
2171
|
*/
|
|
@@ -2165,14 +2178,12 @@ var AnthropicProvider = class {
|
|
|
2165
2178
|
})) : void 0;
|
|
2166
2179
|
const response = await this.client.messages.create({
|
|
2167
2180
|
model: config.model,
|
|
2168
|
-
max_tokens: config.maxTokens || 1024,
|
|
2169
|
-
temperature: config.temperature,
|
|
2170
2181
|
system: config.systemPrompt,
|
|
2171
2182
|
messages: anthropicMessages,
|
|
2172
2183
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2173
2184
|
tools,
|
|
2174
|
-
|
|
2175
|
-
|
|
2185
|
+
stop_sequences: config.stopSequences,
|
|
2186
|
+
...this.buildRequestParams(config, 16e3)
|
|
2176
2187
|
});
|
|
2177
2188
|
const textContent = response.content.filter((block) => block.type === "text").map((block) => block.text).join("\n");
|
|
2178
2189
|
return {
|
|
@@ -2197,14 +2208,12 @@ var AnthropicProvider = class {
|
|
|
2197
2208
|
})) : void 0;
|
|
2198
2209
|
const stream = await this.client.messages.stream({
|
|
2199
2210
|
model: config.model,
|
|
2200
|
-
max_tokens: config.maxTokens || 1024,
|
|
2201
|
-
temperature: config.temperature,
|
|
2202
2211
|
system: config.systemPrompt,
|
|
2203
2212
|
messages: anthropicMessages,
|
|
2204
2213
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2205
2214
|
tools,
|
|
2206
|
-
|
|
2207
|
-
|
|
2215
|
+
stop_sequences: config.stopSequences,
|
|
2216
|
+
...this.buildRequestParams(config, 64e3)
|
|
2208
2217
|
});
|
|
2209
2218
|
for await (const event of stream) {
|
|
2210
2219
|
if (event.type === "content_block_delta") {
|
|
@@ -2386,6 +2395,9 @@ var OpenAIProvider = class {
|
|
|
2386
2395
|
const choice = rawResponse.choices[0];
|
|
2387
2396
|
if (choice?.message.tool_calls) {
|
|
2388
2397
|
for (const toolCall of choice.message.tool_calls) {
|
|
2398
|
+
if (toolCall.type !== "function") {
|
|
2399
|
+
continue;
|
|
2400
|
+
}
|
|
2389
2401
|
toolCalls.push({
|
|
2390
2402
|
id: toolCall.id,
|
|
2391
2403
|
tool: toolCall.function.name,
|
|
@@ -2447,7 +2459,7 @@ var GeminiProvider = class {
|
|
|
2447
2459
|
* Generate a response from the Gemini model
|
|
2448
2460
|
*/
|
|
2449
2461
|
async generateResponse(messages, config) {
|
|
2450
|
-
const model = this.getModel(config.model || "gemini-pro");
|
|
2462
|
+
const model = this.getModel(config.model || "gemini-3.1-pro-preview");
|
|
2451
2463
|
const contents = this.convertMessages(messages);
|
|
2452
2464
|
const generationConfig = {
|
|
2453
2465
|
temperature: config.temperature || 0.7,
|
|
@@ -2481,7 +2493,7 @@ var GeminiProvider = class {
|
|
|
2481
2493
|
* Stream responses from Gemini
|
|
2482
2494
|
*/
|
|
2483
2495
|
async *streamResponse(messages, config) {
|
|
2484
|
-
const model = this.getModel(config.model || "gemini-pro");
|
|
2496
|
+
const model = this.getModel(config.model || "gemini-3.1-pro-preview");
|
|
2485
2497
|
const contents = this.convertMessages(messages);
|
|
2486
2498
|
const generationConfig = {
|
|
2487
2499
|
temperature: config.temperature || 0.7,
|
|
@@ -2964,6 +2976,9 @@ var OpenAICompatibleProvider = class {
|
|
|
2964
2976
|
const choice = rawResponse.choices[0];
|
|
2965
2977
|
if (choice?.message.tool_calls) {
|
|
2966
2978
|
for (const toolCall of choice.message.tool_calls) {
|
|
2979
|
+
if (toolCall.type !== "function") {
|
|
2980
|
+
continue;
|
|
2981
|
+
}
|
|
2967
2982
|
toolCalls.push({
|
|
2968
2983
|
id: toolCall.id,
|
|
2969
2984
|
tool: toolCall.function.name,
|
|
@@ -3164,6 +3179,7 @@ var BufferMemory = class {
|
|
|
3164
3179
|
constructor(maxMessages) {
|
|
3165
3180
|
this.maxMessages = maxMessages;
|
|
3166
3181
|
}
|
|
3182
|
+
maxMessages;
|
|
3167
3183
|
store = /* @__PURE__ */ new Map();
|
|
3168
3184
|
/**
|
|
3169
3185
|
* Save messages to memory
|
|
@@ -3284,11 +3300,14 @@ var RedisMemory = class {
|
|
|
3284
3300
|
|
|
3285
3301
|
// src/memory/summary-memory.ts
|
|
3286
3302
|
var SummaryMemory = class {
|
|
3287
|
-
constructor(provider, maxRecentMessages = 10, summaryModel = "claude-
|
|
3303
|
+
constructor(provider, maxRecentMessages = 10, summaryModel = "claude-haiku-4-5") {
|
|
3288
3304
|
this.provider = provider;
|
|
3289
3305
|
this.maxRecentMessages = maxRecentMessages;
|
|
3290
3306
|
this.summaryModel = summaryModel;
|
|
3291
3307
|
}
|
|
3308
|
+
provider;
|
|
3309
|
+
maxRecentMessages;
|
|
3310
|
+
summaryModel;
|
|
3292
3311
|
store = /* @__PURE__ */ new Map();
|
|
3293
3312
|
/**
|
|
3294
3313
|
* Save messages with automatic summarization
|
|
@@ -3378,6 +3397,7 @@ var TenantBufferMemory = class {
|
|
|
3378
3397
|
constructor(maxMessages) {
|
|
3379
3398
|
this.maxMessages = maxMessages;
|
|
3380
3399
|
}
|
|
3400
|
+
maxMessages;
|
|
3381
3401
|
store = /* @__PURE__ */ new Map();
|
|
3382
3402
|
/**
|
|
3383
3403
|
* Save messages to memory with tenant isolation
|
|
@@ -3487,6 +3507,10 @@ var Workflow = class {
|
|
|
3487
3507
|
this.memory = memory;
|
|
3488
3508
|
this.initializeAgents();
|
|
3489
3509
|
}
|
|
3510
|
+
config;
|
|
3511
|
+
provider;
|
|
3512
|
+
toolRegistry;
|
|
3513
|
+
memory;
|
|
3490
3514
|
agents = /* @__PURE__ */ new Map();
|
|
3491
3515
|
/**
|
|
3492
3516
|
* Initialize all agents in the workflow
|
|
@@ -4035,6 +4059,8 @@ var RateLimiter = class {
|
|
|
4035
4059
|
this.tokens = maxTokens;
|
|
4036
4060
|
this.lastRefill = Date.now();
|
|
4037
4061
|
}
|
|
4062
|
+
maxTokens;
|
|
4063
|
+
refillRate;
|
|
4038
4064
|
tokens;
|
|
4039
4065
|
lastRefill;
|
|
4040
4066
|
/**
|
|
@@ -4093,6 +4119,8 @@ var SlidingWindowRateLimiter = class {
|
|
|
4093
4119
|
this.maxRequests = maxRequests;
|
|
4094
4120
|
this.windowMs = windowMs;
|
|
4095
4121
|
}
|
|
4122
|
+
maxRequests;
|
|
4123
|
+
windowMs;
|
|
4096
4124
|
requests = /* @__PURE__ */ new Map();
|
|
4097
4125
|
/**
|
|
4098
4126
|
* Check if request is allowed
|
|
@@ -4137,6 +4165,7 @@ var Cache = class {
|
|
|
4137
4165
|
constructor(defaultTTL) {
|
|
4138
4166
|
this.defaultTTL = defaultTTL;
|
|
4139
4167
|
}
|
|
4168
|
+
defaultTTL;
|
|
4140
4169
|
store = /* @__PURE__ */ new Map();
|
|
4141
4170
|
/**
|
|
4142
4171
|
* Set a value in the cache
|
|
@@ -4239,6 +4268,7 @@ var LRUCache = class {
|
|
|
4239
4268
|
constructor(maxSize) {
|
|
4240
4269
|
this.maxSize = maxSize;
|
|
4241
4270
|
}
|
|
4271
|
+
maxSize;
|
|
4242
4272
|
cache = /* @__PURE__ */ new Map();
|
|
4243
4273
|
/**
|
|
4244
4274
|
* Get a value from the cache
|
|
@@ -4306,6 +4336,9 @@ var StdioTransport = class extends EventEmitter {
|
|
|
4306
4336
|
this.args = args;
|
|
4307
4337
|
this.env = env;
|
|
4308
4338
|
}
|
|
4339
|
+
command;
|
|
4340
|
+
args;
|
|
4341
|
+
env;
|
|
4309
4342
|
process = null;
|
|
4310
4343
|
connected = false;
|
|
4311
4344
|
buffer = "";
|
|
@@ -4377,6 +4410,7 @@ var SSETransport = class extends EventEmitter {
|
|
|
4377
4410
|
super();
|
|
4378
4411
|
this.url = url;
|
|
4379
4412
|
}
|
|
4413
|
+
url;
|
|
4380
4414
|
eventSource = null;
|
|
4381
4415
|
connected = false;
|
|
4382
4416
|
async connect() {
|
|
@@ -4444,6 +4478,7 @@ var MCPClient = class extends EventEmitter2 {
|
|
|
4444
4478
|
super();
|
|
4445
4479
|
this.config = config;
|
|
4446
4480
|
}
|
|
4481
|
+
config;
|
|
4447
4482
|
transport = null;
|
|
4448
4483
|
serverInfo = null;
|
|
4449
4484
|
requestId = 0;
|
|
@@ -5736,20 +5771,6 @@ Respond naturally while ensuring you gather the required information.`;
|
|
|
5736
5771
|
}
|
|
5737
5772
|
};
|
|
5738
5773
|
|
|
5739
|
-
// src/types/voice.ts
|
|
5740
|
-
import {
|
|
5741
|
-
AudioFormat,
|
|
5742
|
-
VoiceType,
|
|
5743
|
-
STTConfig,
|
|
5744
|
-
TTSConfig,
|
|
5745
|
-
STTResult,
|
|
5746
|
-
TTSResult,
|
|
5747
|
-
STTProvider,
|
|
5748
|
-
TTSProvider,
|
|
5749
|
-
VoiceMessage,
|
|
5750
|
-
VoiceAgentConfig
|
|
5751
|
-
} from "@lov3kaizen/agentsea-types";
|
|
5752
|
-
|
|
5753
5774
|
// src/voice/voice-agent.ts
|
|
5754
5775
|
import { writeFileSync } from "fs";
|
|
5755
5776
|
import { join as join3 } from "path";
|
|
@@ -6707,16 +6728,7 @@ var LemonFoxTTSProvider = class extends OpenAITTSProvider {
|
|
|
6707
6728
|
import { randomBytes, createHash } from "crypto";
|
|
6708
6729
|
|
|
6709
6730
|
// src/types/tenant.ts
|
|
6710
|
-
import {
|
|
6711
|
-
Tenant,
|
|
6712
|
-
TenantStatus,
|
|
6713
|
-
TenantSettings,
|
|
6714
|
-
TenantContext,
|
|
6715
|
-
TenantApiKey,
|
|
6716
|
-
TenantQuota,
|
|
6717
|
-
TenantStorage,
|
|
6718
|
-
TenantResolver
|
|
6719
|
-
} from "@lov3kaizen/agentsea-types";
|
|
6731
|
+
import { TenantStatus } from "@lov3kaizen/agentsea-types";
|
|
6720
6732
|
|
|
6721
6733
|
// src/tenant/tenant-manager.ts
|
|
6722
6734
|
var TenantManager = class {
|
|
@@ -7044,7 +7056,6 @@ export {
|
|
|
7044
7056
|
ACPClient,
|
|
7045
7057
|
Agent,
|
|
7046
7058
|
AnthropicProvider,
|
|
7047
|
-
AudioFormat,
|
|
7048
7059
|
BufferMemory,
|
|
7049
7060
|
Cache,
|
|
7050
7061
|
ContentFormatter,
|
|
@@ -7074,35 +7085,19 @@ export {
|
|
|
7074
7085
|
RateLimiter,
|
|
7075
7086
|
RedisMemory,
|
|
7076
7087
|
SSETransport,
|
|
7077
|
-
STTConfig,
|
|
7078
|
-
STTProvider,
|
|
7079
|
-
STTResult,
|
|
7080
7088
|
SequentialWorkflow,
|
|
7081
7089
|
SlidingWindowRateLimiter,
|
|
7082
7090
|
StdioTransport,
|
|
7083
7091
|
SummaryMemory,
|
|
7084
7092
|
SupervisorWorkflow,
|
|
7085
|
-
TTSConfig,
|
|
7086
|
-
TTSProvider,
|
|
7087
|
-
TTSResult,
|
|
7088
|
-
Tenant,
|
|
7089
|
-
TenantApiKey,
|
|
7090
7093
|
TenantBufferMemory,
|
|
7091
|
-
TenantContext,
|
|
7092
7094
|
TenantManager,
|
|
7093
|
-
TenantQuota,
|
|
7094
|
-
TenantResolver,
|
|
7095
|
-
TenantSettings,
|
|
7096
7095
|
TenantStatus,
|
|
7097
|
-
TenantStorage,
|
|
7098
7096
|
TextGenerationWebUIProvider,
|
|
7099
7097
|
ToolRegistry,
|
|
7100
7098
|
Tracer,
|
|
7101
7099
|
VLLMProvider,
|
|
7102
7100
|
VoiceAgent,
|
|
7103
|
-
VoiceAgentConfig,
|
|
7104
|
-
VoiceMessage,
|
|
7105
|
-
VoiceType,
|
|
7106
7101
|
Workflow,
|
|
7107
7102
|
WorkflowFactory,
|
|
7108
7103
|
calculatorClient,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lov3kaizen/agentsea-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "AgentSea - Unite and orchestrate AI agents. A production-ready ADK for building agentic AI applications with multi-provider support.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -16,23 +16,23 @@
|
|
|
16
16
|
"README.md"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@anthropic-ai/sdk": "^0.
|
|
20
|
-
"@google/generative-ai": "^0.
|
|
21
|
-
"openai": "^
|
|
22
|
-
"fast-glob": "^3.3.
|
|
23
|
-
"zod": "^3.
|
|
24
|
-
"zod-to-json-schema": "^3.
|
|
25
|
-
"winston": "^3.
|
|
26
|
-
"ioredis": "^5.
|
|
27
|
-
"marked": "^12.0.
|
|
28
|
-
"@lov3kaizen/agentsea-types": "0.
|
|
19
|
+
"@anthropic-ai/sdk": "^0.104.1",
|
|
20
|
+
"@google/generative-ai": "^0.24.1",
|
|
21
|
+
"openai": "^6.42.0",
|
|
22
|
+
"fast-glob": "^3.3.3",
|
|
23
|
+
"zod": "^3.25.76",
|
|
24
|
+
"zod-to-json-schema": "^3.24.6",
|
|
25
|
+
"winston": "^3.19.0",
|
|
26
|
+
"ioredis": "^5.11.1",
|
|
27
|
+
"marked": "^12.0.2",
|
|
28
|
+
"@lov3kaizen/agentsea-types": "0.8.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@types/node": "^20.
|
|
32
|
-
"@vitest/coverage-v8": "^
|
|
33
|
-
"tsup": "^8.
|
|
34
|
-
"typescript": "^5.
|
|
35
|
-
"vitest": "^
|
|
31
|
+
"@types/node": "^20.19.0",
|
|
32
|
+
"@vitest/coverage-v8": "^3.2.6",
|
|
33
|
+
"tsup": "^8.5.1",
|
|
34
|
+
"typescript": "^5.9.3",
|
|
35
|
+
"vitest": "^3.2.6"
|
|
36
36
|
},
|
|
37
37
|
"keywords": [
|
|
38
38
|
"agentsea",
|