@polpo-ai/tools 0.2.4
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/dist/adapters/node-filesystem.d.ts +12 -0
- package/dist/adapters/node-filesystem.d.ts.map +1 -0
- package/dist/adapters/node-filesystem.js +46 -0
- package/dist/adapters/node-filesystem.js.map +1 -0
- package/dist/adapters/node-shell.d.ts +5 -0
- package/dist/adapters/node-shell.d.ts.map +1 -0
- package/dist/adapters/node-shell.js +34 -0
- package/dist/adapters/node-shell.js.map +1 -0
- package/dist/audio-tools.d.ts +42 -0
- package/dist/audio-tools.d.ts.map +1 -0
- package/dist/audio-tools.js +552 -0
- package/dist/audio-tools.js.map +1 -0
- package/dist/browser-tools.d.ts +36 -0
- package/dist/browser-tools.d.ts.map +1 -0
- package/dist/browser-tools.js +525 -0
- package/dist/browser-tools.js.map +1 -0
- package/dist/coding-tools.d.ts +99 -0
- package/dist/coding-tools.d.ts.map +1 -0
- package/dist/coding-tools.js +434 -0
- package/dist/coding-tools.js.map +1 -0
- package/dist/docx-tools.d.ts +22 -0
- package/dist/docx-tools.d.ts.map +1 -0
- package/dist/docx-tools.js +236 -0
- package/dist/docx-tools.js.map +1 -0
- package/dist/email-tools.d.ts +34 -0
- package/dist/email-tools.d.ts.map +1 -0
- package/dist/email-tools.js +787 -0
- package/dist/email-tools.js.map +1 -0
- package/dist/excel-tools.d.ts +25 -0
- package/dist/excel-tools.d.ts.map +1 -0
- package/dist/excel-tools.js +409 -0
- package/dist/excel-tools.js.map +1 -0
- package/dist/http-tools.d.ts +23 -0
- package/dist/http-tools.d.ts.map +1 -0
- package/dist/http-tools.js +214 -0
- package/dist/http-tools.js.map +1 -0
- package/dist/image-tools.d.ts +40 -0
- package/dist/image-tools.d.ts.map +1 -0
- package/dist/image-tools.js +522 -0
- package/dist/image-tools.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-tools.d.ts +19 -0
- package/dist/memory-tools.d.ts.map +1 -0
- package/dist/memory-tools.js +104 -0
- package/dist/memory-tools.js.map +1 -0
- package/dist/outcome-tools.d.ts +25 -0
- package/dist/outcome-tools.d.ts.map +1 -0
- package/dist/outcome-tools.js +191 -0
- package/dist/outcome-tools.js.map +1 -0
- package/dist/path-sandbox.d.ts +28 -0
- package/dist/path-sandbox.d.ts.map +1 -0
- package/dist/path-sandbox.js +58 -0
- package/dist/path-sandbox.js.map +1 -0
- package/dist/pdf-tools.d.ts +25 -0
- package/dist/pdf-tools.d.ts.map +1 -0
- package/dist/pdf-tools.js +363 -0
- package/dist/pdf-tools.js.map +1 -0
- package/dist/phone-tools.d.ts +27 -0
- package/dist/phone-tools.d.ts.map +1 -0
- package/dist/phone-tools.js +577 -0
- package/dist/phone-tools.js.map +1 -0
- package/dist/safe-env.d.ts +26 -0
- package/dist/safe-env.d.ts.map +1 -0
- package/dist/safe-env.js +76 -0
- package/dist/safe-env.js.map +1 -0
- package/dist/search-tools.d.ts +22 -0
- package/dist/search-tools.d.ts.map +1 -0
- package/dist/search-tools.js +205 -0
- package/dist/search-tools.js.map +1 -0
- package/dist/ssrf-guard.d.ts +17 -0
- package/dist/ssrf-guard.d.ts.map +1 -0
- package/dist/ssrf-guard.js +95 -0
- package/dist/ssrf-guard.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/vault-tools.d.ts +26 -0
- package/dist/vault-tools.d.ts.map +1 -0
- package/dist/vault-tools.js +86 -0
- package/dist/vault-tools.js.map +1 -0
- package/dist/whatsapp-tools.d.ts +18 -0
- package/dist/whatsapp-tools.d.ts.map +1 -0
- package/dist/whatsapp-tools.js +206 -0
- package/dist/whatsapp-tools.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image & video tools for generation and vision/analysis.
|
|
3
|
+
*
|
|
4
|
+
* Provides agent capabilities to:
|
|
5
|
+
* - Generate images from text prompts (image_generate) — via fal.ai
|
|
6
|
+
* - Generate videos from text prompts (video_generate) — via fal.ai
|
|
7
|
+
* - Analyze/describe images using vision models (image_analyze) — via OpenAI/Anthropic
|
|
8
|
+
*
|
|
9
|
+
* Architecture: direct fetch() to provider REST APIs — zero vendor SDK dependencies.
|
|
10
|
+
*
|
|
11
|
+
* Providers:
|
|
12
|
+
* Image generation: fal.ai (FLUX models — fal-ai/flux/dev default)
|
|
13
|
+
* Video generation: fal.ai (Wan 2.2 — fal-ai/wan/v2.2-1.3b/text-to-video default)
|
|
14
|
+
* Vision/analysis: openai (gpt-4.1-mini), anthropic (Claude)
|
|
15
|
+
*
|
|
16
|
+
* Credential resolution order (same as email tools):
|
|
17
|
+
* 1. Agent vault (per-agent credentials — e.g. service "fal" with key "key")
|
|
18
|
+
* 2. Environment variables (global fallback)
|
|
19
|
+
*
|
|
20
|
+
* Environment variables (fallback):
|
|
21
|
+
* FAL_KEY — fal.ai image/video generation
|
|
22
|
+
* OPENAI_API_KEY — openai vision provider
|
|
23
|
+
* ANTHROPIC_API_KEY — anthropic vision provider
|
|
24
|
+
*/
|
|
25
|
+
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
26
|
+
import { resolve, dirname, extname } from "node:path";
|
|
27
|
+
import { Type } from "@sinclair/typebox";
|
|
28
|
+
import { resolveAllowedPaths, assertPathAllowed } from "./path-sandbox.js";
|
|
29
|
+
// ─── Constants ───
|
|
30
|
+
const MAX_IMAGE_SIZE = 20 * 1024 * 1024; // 20 MB
|
|
31
|
+
const DEFAULT_TIMEOUT = 120_000; // 2 min for image generation
|
|
32
|
+
const VIDEO_TIMEOUT = 300_000; // 5 min for video generation
|
|
33
|
+
const FAL_QUEUE_POLL_INTERVAL = 3_000; // 3 sec polling for async queue
|
|
34
|
+
// ─── Helpers ───
|
|
35
|
+
function requireEnv(key) {
|
|
36
|
+
const val = process.env[key];
|
|
37
|
+
if (!val)
|
|
38
|
+
throw new Error(`Missing environment variable: ${key}. Set it before using this tool.`);
|
|
39
|
+
return val;
|
|
40
|
+
}
|
|
41
|
+
/** Resolve fal.ai API key: vault (service "fal-ai", key "key") > FAL_KEY env var. */
|
|
42
|
+
function resolveFalKey(vault) {
|
|
43
|
+
const fromVault = vault?.getKey("fal-ai", "key");
|
|
44
|
+
if (fromVault)
|
|
45
|
+
return fromVault;
|
|
46
|
+
return requireEnv("FAL_KEY");
|
|
47
|
+
}
|
|
48
|
+
function imageMime(ext) {
|
|
49
|
+
const map = {
|
|
50
|
+
".png": "image/png",
|
|
51
|
+
".jpg": "image/jpeg",
|
|
52
|
+
".jpeg": "image/jpeg",
|
|
53
|
+
".gif": "image/gif",
|
|
54
|
+
".webp": "image/webp",
|
|
55
|
+
".svg": "image/svg+xml",
|
|
56
|
+
".bmp": "image/bmp",
|
|
57
|
+
".tiff": "image/tiff",
|
|
58
|
+
};
|
|
59
|
+
return map[ext.toLowerCase()] ?? "image/png";
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Submit a request to fal.ai queue and poll until completion.
|
|
63
|
+
* Uses the queue endpoint (POST https://queue.fal.run/<model>) for reliability,
|
|
64
|
+
* then polls the status endpoint until the result is ready.
|
|
65
|
+
*/
|
|
66
|
+
async function falQueueRequest(modelId, input, apiKey, timeout, signal) {
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
69
|
+
if (signal)
|
|
70
|
+
signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
71
|
+
try {
|
|
72
|
+
// Submit to queue
|
|
73
|
+
const submitResp = await fetch(`https://queue.fal.run/${modelId}`, {
|
|
74
|
+
method: "POST",
|
|
75
|
+
headers: {
|
|
76
|
+
Authorization: `Key ${apiKey}`,
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
},
|
|
79
|
+
body: JSON.stringify(input),
|
|
80
|
+
signal: controller.signal,
|
|
81
|
+
});
|
|
82
|
+
if (!submitResp.ok) {
|
|
83
|
+
const errText = await submitResp.text();
|
|
84
|
+
throw new Error(`fal.ai queue submit ${submitResp.status}: ${errText}`);
|
|
85
|
+
}
|
|
86
|
+
const queueData = await submitResp.json();
|
|
87
|
+
const requestId = queueData.request_id;
|
|
88
|
+
const statusUrl = queueData.status_url ?? `https://queue.fal.run/${modelId}/requests/${requestId}/status`;
|
|
89
|
+
const responseUrl = queueData.response_url ?? `https://queue.fal.run/${modelId}/requests/${requestId}`;
|
|
90
|
+
// Poll for completion
|
|
91
|
+
while (true) {
|
|
92
|
+
await new Promise(r => setTimeout(r, FAL_QUEUE_POLL_INTERVAL));
|
|
93
|
+
const statusResp = await fetch(statusUrl, {
|
|
94
|
+
headers: { Authorization: `Key ${apiKey}` },
|
|
95
|
+
signal: controller.signal,
|
|
96
|
+
});
|
|
97
|
+
if (!statusResp.ok) {
|
|
98
|
+
throw new Error(`fal.ai status poll ${statusResp.status}`);
|
|
99
|
+
}
|
|
100
|
+
const status = await statusResp.json();
|
|
101
|
+
if (status.status === "COMPLETED") {
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
if (status.status === "FAILED") {
|
|
105
|
+
throw new Error(`fal.ai request failed: ${status.error ?? "unknown error"}`);
|
|
106
|
+
}
|
|
107
|
+
// IN_QUEUE or IN_PROGRESS — keep polling
|
|
108
|
+
}
|
|
109
|
+
// Fetch result
|
|
110
|
+
const resultResp = await fetch(responseUrl, {
|
|
111
|
+
headers: { Authorization: `Key ${apiKey}` },
|
|
112
|
+
signal: controller.signal,
|
|
113
|
+
});
|
|
114
|
+
if (!resultResp.ok) {
|
|
115
|
+
const errText = await resultResp.text();
|
|
116
|
+
throw new Error(`fal.ai result fetch ${resultResp.status}: ${errText}`);
|
|
117
|
+
}
|
|
118
|
+
return await resultResp.json();
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
clearTimeout(timer);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// ─── Tool: image_generate ───
|
|
125
|
+
const ImageGenerateSchema = Type.Object({
|
|
126
|
+
prompt: Type.String({ description: "Text prompt describing the image to generate" }),
|
|
127
|
+
path: Type.String({ description: "Output file path (e.g. 'output.png'). Format inferred from extension." }),
|
|
128
|
+
model: Type.Optional(Type.String({
|
|
129
|
+
description: "fal.ai model ID. Default: 'fal-ai/flux/dev'. " +
|
|
130
|
+
"Other options: 'fal-ai/flux-pro/v1.1' (higher quality), 'fal-ai/flux/schnell' (faster).",
|
|
131
|
+
})),
|
|
132
|
+
size: Type.Optional(Type.String({
|
|
133
|
+
description: "Image size as 'WIDTHxHEIGHT' (e.g. '1024x1024', '1024x768', '768x1024'). Default: '1024x1024'.",
|
|
134
|
+
})),
|
|
135
|
+
num_inference_steps: Type.Optional(Type.Number({
|
|
136
|
+
description: "Number of inference steps (higher = better quality, slower). Default varies by model (typically 28).",
|
|
137
|
+
})),
|
|
138
|
+
guidance_scale: Type.Optional(Type.Number({
|
|
139
|
+
description: "Guidance scale / CFG — how closely to follow the prompt. Default: 3.5.",
|
|
140
|
+
})),
|
|
141
|
+
seed: Type.Optional(Type.Number({
|
|
142
|
+
description: "Random seed for reproducible results. Omit for random.",
|
|
143
|
+
})),
|
|
144
|
+
});
|
|
145
|
+
function createGenerateTool(cwd, sandbox, vault) {
|
|
146
|
+
return {
|
|
147
|
+
name: "image_generate",
|
|
148
|
+
label: "Generate Image",
|
|
149
|
+
description: "Generate an image from a text prompt using fal.ai (FLUX models). " +
|
|
150
|
+
"Output format inferred from file extension (png, jpg, webp). " +
|
|
151
|
+
"Models: fal-ai/flux/dev (default, balanced), fal-ai/flux-pro/v1.1 (best quality), " +
|
|
152
|
+
"fal-ai/flux/schnell (fastest). Credentials resolved from: agent vault > FAL_KEY env var.",
|
|
153
|
+
parameters: ImageGenerateSchema,
|
|
154
|
+
async execute(_id, params, signal) {
|
|
155
|
+
const filePath = resolve(cwd, params.path);
|
|
156
|
+
assertPathAllowed(filePath, sandbox, "image_generate");
|
|
157
|
+
try {
|
|
158
|
+
return await generateFal(filePath, params, vault, signal);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return {
|
|
162
|
+
content: [{ type: "text", text: `Image generation error: ${err.message}` }],
|
|
163
|
+
details: { error: err.message },
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
async function generateFal(filePath, params, vault, signal) {
|
|
170
|
+
const apiKey = resolveFalKey(vault);
|
|
171
|
+
const model = params.model ?? "fal-ai/flux/dev";
|
|
172
|
+
// Parse size into width/height
|
|
173
|
+
let width = 1024, height = 1024;
|
|
174
|
+
if (params.size) {
|
|
175
|
+
const parts = params.size.split("x").map(Number);
|
|
176
|
+
if (parts.length === 2 && parts[0] > 0 && parts[1] > 0) {
|
|
177
|
+
width = parts[0];
|
|
178
|
+
height = parts[1];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const input = {
|
|
182
|
+
prompt: params.prompt,
|
|
183
|
+
image_size: { width, height },
|
|
184
|
+
num_images: 1,
|
|
185
|
+
};
|
|
186
|
+
if (params.num_inference_steps != null)
|
|
187
|
+
input.num_inference_steps = params.num_inference_steps;
|
|
188
|
+
if (params.guidance_scale != null)
|
|
189
|
+
input.guidance_scale = params.guidance_scale;
|
|
190
|
+
if (params.seed != null)
|
|
191
|
+
input.seed = params.seed;
|
|
192
|
+
const result = await falQueueRequest(model, input, apiKey, DEFAULT_TIMEOUT, signal);
|
|
193
|
+
// fal.ai FLUX response: { images: [{ url, width, height, content_type }], ... }
|
|
194
|
+
const images = result.images;
|
|
195
|
+
if (!images || images.length === 0) {
|
|
196
|
+
throw new Error("No images in fal.ai response");
|
|
197
|
+
}
|
|
198
|
+
const imageUrl = images[0].url;
|
|
199
|
+
const imgResp = await fetch(imageUrl);
|
|
200
|
+
if (!imgResp.ok)
|
|
201
|
+
throw new Error(`Failed to download generated image: ${imgResp.status}`);
|
|
202
|
+
const buffer = Buffer.from(await imgResp.arrayBuffer());
|
|
203
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
204
|
+
writeFileSync(filePath, buffer);
|
|
205
|
+
const info = [
|
|
206
|
+
`Image saved: ${filePath}`,
|
|
207
|
+
`Size: ${(buffer.byteLength / 1024).toFixed(1)} KB`,
|
|
208
|
+
`Model: ${model}`,
|
|
209
|
+
`Dimensions: ${images[0].width}x${images[0].height}`,
|
|
210
|
+
];
|
|
211
|
+
return {
|
|
212
|
+
content: [{ type: "text", text: info.join("\n") }],
|
|
213
|
+
details: {
|
|
214
|
+
provider: "fal",
|
|
215
|
+
model,
|
|
216
|
+
size: `${images[0].width}x${images[0].height}`,
|
|
217
|
+
path: filePath,
|
|
218
|
+
bytes: buffer.byteLength,
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// ─── Tool: video_generate ───
|
|
223
|
+
const VideoGenerateSchema = Type.Object({
|
|
224
|
+
prompt: Type.String({ description: "Text prompt describing the video to generate" }),
|
|
225
|
+
path: Type.String({ description: "Output file path (e.g. 'output.mp4')." }),
|
|
226
|
+
model: Type.Optional(Type.String({
|
|
227
|
+
description: "fal.ai video model ID. Default: 'fal-ai/wan/v2.2-1.3b/text-to-video'. " +
|
|
228
|
+
"Other options: 'fal-ai/wan/v2.2-a14b/text-to-video' (higher quality, slower).",
|
|
229
|
+
})),
|
|
230
|
+
num_frames: Type.Optional(Type.Number({
|
|
231
|
+
description: "Number of frames to generate. Default: 81 (~5 seconds at 16fps).",
|
|
232
|
+
})),
|
|
233
|
+
resolution: Type.Optional(Type.String({
|
|
234
|
+
description: "Video resolution as 'WIDTHxHEIGHT' (e.g. '854x480', '1280x720'). Default: '854x480' (480p).",
|
|
235
|
+
})),
|
|
236
|
+
num_inference_steps: Type.Optional(Type.Number({
|
|
237
|
+
description: "Number of inference steps (higher = better quality, slower). Default: 30.",
|
|
238
|
+
})),
|
|
239
|
+
guidance_scale: Type.Optional(Type.Number({
|
|
240
|
+
description: "Guidance scale — how closely to follow the prompt. Default: 5.0.",
|
|
241
|
+
})),
|
|
242
|
+
seed: Type.Optional(Type.Number({
|
|
243
|
+
description: "Random seed for reproducible results. Omit for random.",
|
|
244
|
+
})),
|
|
245
|
+
});
|
|
246
|
+
function createVideoGenerateTool(cwd, sandbox, vault) {
|
|
247
|
+
return {
|
|
248
|
+
name: "video_generate",
|
|
249
|
+
label: "Generate Video",
|
|
250
|
+
description: "Generate a video from a text prompt using fal.ai (Wan 2.2 models). " +
|
|
251
|
+
"Output saved as MP4. Models: fal-ai/wan/v2.2-1.3b/text-to-video (default, faster), " +
|
|
252
|
+
"fal-ai/wan/v2.2-a14b/text-to-video (best quality). " +
|
|
253
|
+
"Video generation takes 1-5 minutes depending on model and resolution. " +
|
|
254
|
+
"Credentials resolved from: agent vault > FAL_KEY env var.",
|
|
255
|
+
parameters: VideoGenerateSchema,
|
|
256
|
+
async execute(_id, params, signal) {
|
|
257
|
+
const filePath = resolve(cwd, params.path);
|
|
258
|
+
assertPathAllowed(filePath, sandbox, "video_generate");
|
|
259
|
+
try {
|
|
260
|
+
return await generateVideo(filePath, params, vault, signal);
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
return {
|
|
264
|
+
content: [{ type: "text", text: `Video generation error: ${err.message}` }],
|
|
265
|
+
details: { error: err.message },
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
async function generateVideo(filePath, params, vault, signal) {
|
|
272
|
+
const apiKey = resolveFalKey(vault);
|
|
273
|
+
const model = params.model ?? "fal-ai/wan/v2.2-1.3b/text-to-video";
|
|
274
|
+
const input = {
|
|
275
|
+
prompt: params.prompt,
|
|
276
|
+
};
|
|
277
|
+
if (params.num_frames != null)
|
|
278
|
+
input.num_frames = params.num_frames;
|
|
279
|
+
if (params.num_inference_steps != null)
|
|
280
|
+
input.num_inference_steps = params.num_inference_steps;
|
|
281
|
+
if (params.guidance_scale != null)
|
|
282
|
+
input.guidance_scale = params.guidance_scale;
|
|
283
|
+
if (params.seed != null)
|
|
284
|
+
input.seed = params.seed;
|
|
285
|
+
// Parse resolution
|
|
286
|
+
if (params.resolution) {
|
|
287
|
+
const parts = params.resolution.split("x").map(Number);
|
|
288
|
+
if (parts.length === 2 && parts[0] > 0 && parts[1] > 0) {
|
|
289
|
+
input.resolution = { width: parts[0], height: parts[1] };
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const result = await falQueueRequest(model, input, apiKey, VIDEO_TIMEOUT, signal);
|
|
293
|
+
// fal.ai video response: { video: { url, content_type, file_name, file_size } }
|
|
294
|
+
const video = result.video;
|
|
295
|
+
if (!video?.url) {
|
|
296
|
+
throw new Error("No video in fal.ai response");
|
|
297
|
+
}
|
|
298
|
+
const videoResp = await fetch(video.url);
|
|
299
|
+
if (!videoResp.ok)
|
|
300
|
+
throw new Error(`Failed to download generated video: ${videoResp.status}`);
|
|
301
|
+
const buffer = Buffer.from(await videoResp.arrayBuffer());
|
|
302
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
303
|
+
writeFileSync(filePath, buffer);
|
|
304
|
+
const sizeMB = (buffer.byteLength / 1024 / 1024).toFixed(2);
|
|
305
|
+
const info = [
|
|
306
|
+
`Video saved: ${filePath}`,
|
|
307
|
+
`Size: ${sizeMB} MB`,
|
|
308
|
+
`Model: ${model}`,
|
|
309
|
+
];
|
|
310
|
+
return {
|
|
311
|
+
content: [{ type: "text", text: info.join("\n") }],
|
|
312
|
+
details: {
|
|
313
|
+
provider: "fal",
|
|
314
|
+
model,
|
|
315
|
+
path: filePath,
|
|
316
|
+
bytes: buffer.byteLength,
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
// ─── Tool: image_analyze ───
|
|
321
|
+
const ImageAnalyzeSchema = Type.Object({
|
|
322
|
+
path: Type.String({ description: "Path to the image file to analyze" }),
|
|
323
|
+
prompt: Type.Optional(Type.String({ description: "Question or instruction for the vision model (default: 'Describe this image in detail')" })),
|
|
324
|
+
provider: Type.Optional(Type.Union([
|
|
325
|
+
Type.Literal("openai"),
|
|
326
|
+
Type.Literal("anthropic"),
|
|
327
|
+
], { description: "Vision provider (default: openai)" })),
|
|
328
|
+
model: Type.Optional(Type.String({ description: "Model name. OpenAI: 'gpt-4.1-mini' (default). Anthropic: 'claude-sonnet-4-20250514' (default)." })),
|
|
329
|
+
max_tokens: Type.Optional(Type.Number({ description: "Max tokens in response (default: 1024)" })),
|
|
330
|
+
});
|
|
331
|
+
function createAnalyzeTool(cwd, sandbox, vault) {
|
|
332
|
+
return {
|
|
333
|
+
name: "image_analyze",
|
|
334
|
+
label: "Analyze Image",
|
|
335
|
+
description: "Analyze an image using AI vision models. Can describe contents, extract text (OCR), " +
|
|
336
|
+
"answer questions about the image, identify objects, read charts, etc. " +
|
|
337
|
+
"Providers: openai (GPT-4.1-mini, default), anthropic (Claude). " +
|
|
338
|
+
"Credentials resolved from: agent vault > OPENAI_API_KEY or ANTHROPIC_API_KEY env var.",
|
|
339
|
+
parameters: ImageAnalyzeSchema,
|
|
340
|
+
async execute(_id, params, signal) {
|
|
341
|
+
const filePath = resolve(cwd, params.path);
|
|
342
|
+
assertPathAllowed(filePath, sandbox, "image_analyze");
|
|
343
|
+
let fileBuffer;
|
|
344
|
+
try {
|
|
345
|
+
fileBuffer = readFileSync(filePath);
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
return {
|
|
349
|
+
content: [{ type: "text", text: `Error reading image file: ${err.message}` }],
|
|
350
|
+
details: { error: "file_read_error" },
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
if (fileBuffer.byteLength > MAX_IMAGE_SIZE) {
|
|
354
|
+
return {
|
|
355
|
+
content: [{ type: "text", text: `Image file too large: ${(fileBuffer.byteLength / 1024 / 1024).toFixed(1)} MB (max ${MAX_IMAGE_SIZE / 1024 / 1024} MB)` }],
|
|
356
|
+
details: { error: "file_too_large", size: fileBuffer.byteLength },
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
const provider = params.provider ?? "openai";
|
|
360
|
+
try {
|
|
361
|
+
if (provider === "openai") {
|
|
362
|
+
return await analyzeOpenAI(filePath, fileBuffer, params, vault, signal);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
return await analyzeAnthropic(filePath, fileBuffer, params, vault, signal);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
return {
|
|
370
|
+
content: [{ type: "text", text: `Image analysis error (${provider}): ${err.message}` }],
|
|
371
|
+
details: { provider, error: err.message },
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
async function analyzeOpenAI(filePath, fileBuffer, params, vault, signal) {
|
|
378
|
+
const apiKey = vault?.getKey("openai", "key") ?? requireEnv("OPENAI_API_KEY");
|
|
379
|
+
const model = params.model ?? "gpt-4.1-mini";
|
|
380
|
+
const prompt = params.prompt ?? "Describe this image in detail.";
|
|
381
|
+
const maxTokens = params.max_tokens ?? 1024;
|
|
382
|
+
const ext = extname(filePath).toLowerCase();
|
|
383
|
+
const mime = imageMime(ext);
|
|
384
|
+
const base64 = fileBuffer.toString("base64");
|
|
385
|
+
const dataUrl = `data:${mime};base64,${base64}`;
|
|
386
|
+
const controller = new AbortController();
|
|
387
|
+
const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);
|
|
388
|
+
if (signal)
|
|
389
|
+
signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
390
|
+
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
391
|
+
method: "POST",
|
|
392
|
+
headers: {
|
|
393
|
+
Authorization: `Bearer ${apiKey}`,
|
|
394
|
+
"Content-Type": "application/json",
|
|
395
|
+
},
|
|
396
|
+
body: JSON.stringify({
|
|
397
|
+
model,
|
|
398
|
+
max_tokens: maxTokens,
|
|
399
|
+
messages: [
|
|
400
|
+
{
|
|
401
|
+
role: "user",
|
|
402
|
+
content: [
|
|
403
|
+
{ type: "text", text: prompt },
|
|
404
|
+
{ type: "image_url", image_url: { url: dataUrl, detail: "auto" } },
|
|
405
|
+
],
|
|
406
|
+
},
|
|
407
|
+
],
|
|
408
|
+
}),
|
|
409
|
+
signal: controller.signal,
|
|
410
|
+
});
|
|
411
|
+
clearTimeout(timer);
|
|
412
|
+
if (!response.ok) {
|
|
413
|
+
const errText = await response.text();
|
|
414
|
+
throw new Error(`OpenAI Vision API ${response.status}: ${errText}`);
|
|
415
|
+
}
|
|
416
|
+
const data = await response.json();
|
|
417
|
+
const analysis = data.choices[0]?.message?.content ?? "";
|
|
418
|
+
const usage = data.usage;
|
|
419
|
+
return {
|
|
420
|
+
content: [{ type: "text", text: analysis }],
|
|
421
|
+
details: {
|
|
422
|
+
provider: "openai",
|
|
423
|
+
model,
|
|
424
|
+
path: filePath,
|
|
425
|
+
imageSize: fileBuffer.byteLength,
|
|
426
|
+
tokens: usage?.total_tokens,
|
|
427
|
+
promptTokens: usage?.prompt_tokens,
|
|
428
|
+
completionTokens: usage?.completion_tokens,
|
|
429
|
+
},
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
async function analyzeAnthropic(filePath, fileBuffer, params, vault, signal) {
|
|
433
|
+
const apiKey = vault?.getKey("anthropic", "key") ?? requireEnv("ANTHROPIC_API_KEY");
|
|
434
|
+
const model = params.model ?? "claude-sonnet-4-20250514";
|
|
435
|
+
const prompt = params.prompt ?? "Describe this image in detail.";
|
|
436
|
+
const maxTokens = params.max_tokens ?? 1024;
|
|
437
|
+
const ext = extname(filePath).toLowerCase();
|
|
438
|
+
const mime = imageMime(ext);
|
|
439
|
+
const base64 = fileBuffer.toString("base64");
|
|
440
|
+
// Anthropic only supports specific media types
|
|
441
|
+
const supportedTypes = ["image/jpeg", "image/png", "image/gif", "image/webp"];
|
|
442
|
+
const mediaType = supportedTypes.includes(mime) ? mime : "image/png";
|
|
443
|
+
const controller = new AbortController();
|
|
444
|
+
const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);
|
|
445
|
+
if (signal)
|
|
446
|
+
signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
447
|
+
const response = await fetch("https://api.anthropic.com/v1/messages", {
|
|
448
|
+
method: "POST",
|
|
449
|
+
headers: {
|
|
450
|
+
"x-api-key": apiKey,
|
|
451
|
+
"anthropic-version": "2023-06-01",
|
|
452
|
+
"Content-Type": "application/json",
|
|
453
|
+
},
|
|
454
|
+
body: JSON.stringify({
|
|
455
|
+
model,
|
|
456
|
+
max_tokens: maxTokens,
|
|
457
|
+
messages: [
|
|
458
|
+
{
|
|
459
|
+
role: "user",
|
|
460
|
+
content: [
|
|
461
|
+
{
|
|
462
|
+
type: "image",
|
|
463
|
+
source: {
|
|
464
|
+
type: "base64",
|
|
465
|
+
media_type: mediaType,
|
|
466
|
+
data: base64,
|
|
467
|
+
},
|
|
468
|
+
},
|
|
469
|
+
{ type: "text", text: prompt },
|
|
470
|
+
],
|
|
471
|
+
},
|
|
472
|
+
],
|
|
473
|
+
}),
|
|
474
|
+
signal: controller.signal,
|
|
475
|
+
});
|
|
476
|
+
clearTimeout(timer);
|
|
477
|
+
if (!response.ok) {
|
|
478
|
+
const errText = await response.text();
|
|
479
|
+
throw new Error(`Anthropic Vision API ${response.status}: ${errText}`);
|
|
480
|
+
}
|
|
481
|
+
const data = await response.json();
|
|
482
|
+
const analysis = data.content
|
|
483
|
+
.filter(b => b.type === "text" && b.text)
|
|
484
|
+
.map(b => b.text)
|
|
485
|
+
.join("\n");
|
|
486
|
+
const usage = data.usage;
|
|
487
|
+
return {
|
|
488
|
+
content: [{ type: "text", text: analysis }],
|
|
489
|
+
details: {
|
|
490
|
+
provider: "anthropic",
|
|
491
|
+
model,
|
|
492
|
+
path: filePath,
|
|
493
|
+
imageSize: fileBuffer.byteLength,
|
|
494
|
+
inputTokens: usage?.input_tokens,
|
|
495
|
+
outputTokens: usage?.output_tokens,
|
|
496
|
+
},
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
export const ALL_IMAGE_TOOL_NAMES = ["image_generate", "image_analyze", "video_generate"];
|
|
500
|
+
/**
|
|
501
|
+
* Create image & video tools for generation, vision analysis, and video creation.
|
|
502
|
+
*
|
|
503
|
+
* @param cwd - Working directory for resolving file paths
|
|
504
|
+
* @param allowedPaths - Sandbox paths for file validation
|
|
505
|
+
* @param allowedTools - Optional filter — only include tools whose names appear here.
|
|
506
|
+
* Supports wildcards expanded upstream (e.g. "image_*", "video_*").
|
|
507
|
+
* @param vault - Resolved vault for credential resolution (fal-ai, openai, anthropic).
|
|
508
|
+
* Credentials are resolved as: vault > environment variable.
|
|
509
|
+
*/
|
|
510
|
+
export function createImageTools(cwd, allowedPaths, allowedTools, vault) {
|
|
511
|
+
const sandbox = resolveAllowedPaths(cwd, allowedPaths);
|
|
512
|
+
const factories = {
|
|
513
|
+
image_generate: () => createGenerateTool(cwd, sandbox, vault),
|
|
514
|
+
image_analyze: () => createAnalyzeTool(cwd, sandbox, vault),
|
|
515
|
+
video_generate: () => createVideoGenerateTool(cwd, sandbox, vault),
|
|
516
|
+
};
|
|
517
|
+
const names = allowedTools
|
|
518
|
+
? ALL_IMAGE_TOOL_NAMES.filter(n => allowedTools.some(a => a.toLowerCase() === n))
|
|
519
|
+
: ALL_IMAGE_TOOL_NAMES;
|
|
520
|
+
return names.map(n => factories[n]());
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=image-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-tools.js","sourceRoot":"","sources":["../src/image-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @polpo-ai/tools — Agent tools for Polpo.
|
|
3
|
+
*
|
|
4
|
+
* Core tools (always available):
|
|
5
|
+
* read, write, edit, bash, glob, grep, ls,
|
|
6
|
+
* register_outcome, http_fetch, http_download,
|
|
7
|
+
* vault_get, vault_list
|
|
8
|
+
*
|
|
9
|
+
* Extended tools (opt-in, require optional deps):
|
|
10
|
+
* browser_*, email_*, excel_*, pdf_*, docx_*,
|
|
11
|
+
* image_*, audio_*, search_*, phone_*, whatsapp_*, memory_*
|
|
12
|
+
*/
|
|
13
|
+
export { createCodingTools, createAllTools, matchToolPattern, expandToolWildcards } from "./coding-tools.js";
|
|
14
|
+
export { createOutcomeTools } from "./outcome-tools.js";
|
|
15
|
+
export { createHttpTools } from "./http-tools.js";
|
|
16
|
+
export { createVaultToolsCore } from "./vault-tools.js";
|
|
17
|
+
export { createBrowserTools } from "./browser-tools.js";
|
|
18
|
+
export { createEmailTools } from "./email-tools.js";
|
|
19
|
+
export { createExcelTools } from "./excel-tools.js";
|
|
20
|
+
export { createPdfTools } from "./pdf-tools.js";
|
|
21
|
+
export { createDocxTools } from "./docx-tools.js";
|
|
22
|
+
export { createImageTools } from "./image-tools.js";
|
|
23
|
+
export { createAudioTools } from "./audio-tools.js";
|
|
24
|
+
export { createSearchTools } from "./search-tools.js";
|
|
25
|
+
export { createPhoneTools } from "./phone-tools.js";
|
|
26
|
+
export { createWhatsAppTools } from "./whatsapp-tools.js";
|
|
27
|
+
export { createMemoryTools } from "./memory-tools.js";
|
|
28
|
+
export { NodeFileSystem } from "./adapters/node-filesystem.js";
|
|
29
|
+
export { NodeShell } from "./adapters/node-shell.js";
|
|
30
|
+
export { assertPathAllowed, resolveAllowedPaths } from "./path-sandbox.js";
|
|
31
|
+
export { bashSafeEnv } from "./safe-env.js";
|
|
32
|
+
export type { ResolvedVault, WhatsAppStore } from "./types.js";
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG7G,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @polpo-ai/tools — Agent tools for Polpo.
|
|
3
|
+
*
|
|
4
|
+
* Core tools (always available):
|
|
5
|
+
* read, write, edit, bash, glob, grep, ls,
|
|
6
|
+
* register_outcome, http_fetch, http_download,
|
|
7
|
+
* vault_get, vault_list
|
|
8
|
+
*
|
|
9
|
+
* Extended tools (opt-in, require optional deps):
|
|
10
|
+
* browser_*, email_*, excel_*, pdf_*, docx_*,
|
|
11
|
+
* image_*, audio_*, search_*, phone_*, whatsapp_*, memory_*
|
|
12
|
+
*/
|
|
13
|
+
// Core tool factory
|
|
14
|
+
export { createCodingTools, createAllTools, matchToolPattern, expandToolWildcards } from "./coding-tools.js";
|
|
15
|
+
// Individual tool factories (for custom composition)
|
|
16
|
+
export { createOutcomeTools } from "./outcome-tools.js";
|
|
17
|
+
export { createHttpTools } from "./http-tools.js";
|
|
18
|
+
export { createVaultToolsCore } from "./vault-tools.js";
|
|
19
|
+
// Extended tool factories
|
|
20
|
+
export { createBrowserTools } from "./browser-tools.js";
|
|
21
|
+
export { createEmailTools } from "./email-tools.js";
|
|
22
|
+
export { createExcelTools } from "./excel-tools.js";
|
|
23
|
+
export { createPdfTools } from "./pdf-tools.js";
|
|
24
|
+
export { createDocxTools } from "./docx-tools.js";
|
|
25
|
+
export { createImageTools } from "./image-tools.js";
|
|
26
|
+
export { createAudioTools } from "./audio-tools.js";
|
|
27
|
+
export { createSearchTools } from "./search-tools.js";
|
|
28
|
+
export { createPhoneTools } from "./phone-tools.js";
|
|
29
|
+
export { createWhatsAppTools } from "./whatsapp-tools.js";
|
|
30
|
+
export { createMemoryTools } from "./memory-tools.js";
|
|
31
|
+
// Adapters (FileSystem/Shell implementations)
|
|
32
|
+
export { NodeFileSystem } from "./adapters/node-filesystem.js";
|
|
33
|
+
export { NodeShell } from "./adapters/node-shell.js";
|
|
34
|
+
// Security utilities
|
|
35
|
+
export { assertPathAllowed, resolveAllowedPaths } from "./path-sandbox.js";
|
|
36
|
+
export { bashSafeEnv } from "./safe-env.js";
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,oBAAoB;AACpB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7G,qDAAqD;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,0BAA0B;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory tools for agents — scoped to a single agent's private memory.
|
|
3
|
+
*
|
|
4
|
+
* These tools let an agent read and write its own persistent memory
|
|
5
|
+
* during direct-chat sessions. The agent scope is baked in at creation
|
|
6
|
+
* time so the agent cannot access other agents' or shared memory.
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentTool } from "@mariozechner/pi-agent-core";
|
|
9
|
+
import type { MemoryStore } from "@polpo-ai/core";
|
|
10
|
+
export declare const ALL_MEMORY_TOOL_NAMES: readonly ["memory_get", "memory_save", "memory_append", "memory_update"];
|
|
11
|
+
export type MemoryToolName = (typeof ALL_MEMORY_TOOL_NAMES)[number];
|
|
12
|
+
/**
|
|
13
|
+
* Create memory tools for an agent, scoped to that agent's private memory.
|
|
14
|
+
*
|
|
15
|
+
* @param store The MemoryStore instance
|
|
16
|
+
* @param agent The agent name — tools will only access `agent:<name>` scope
|
|
17
|
+
*/
|
|
18
|
+
export declare function createMemoryTools(store: MemoryStore, agent: string): AgentTool<any>[];
|
|
19
|
+
//# sourceMappingURL=memory-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tools.d.ts","sourceRoot":"","sources":["../src/memory-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,eAAO,MAAM,qBAAqB,0EAKxB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAqBpE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,GACZ,SAAS,CAAC,GAAG,CAAC,EAAE,CA4ElB"}
|