neoctl 0.2.40 → 0.2.42
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 +43 -585
- package/dist/context/prompts.js +2 -1
- package/dist/context/prompts.js.map +1 -1
- package/dist/core/run-agent.js +2 -0
- package/dist/core/run-agent.js.map +1 -1
- package/dist/repl/index.js +13 -1
- package/dist/repl/index.js.map +1 -1
- package/dist/tools/builtins/image-capabilities.d.ts +21 -0
- package/dist/tools/builtins/image-capabilities.js +97 -0
- package/dist/tools/builtins/image-capabilities.js.map +1 -0
- package/dist/tools/builtins/image-generation-tool.d.ts +14 -7
- package/dist/tools/builtins/image-generation-tool.js +141 -143
- package/dist/tools/builtins/image-generation-tool.js.map +1 -1
- package/dist/tools/builtins/image-output-verification.d.ts +14 -0
- package/dist/tools/builtins/image-output-verification.js +183 -0
- package/dist/tools/builtins/image-output-verification.js.map +1 -0
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.js +6 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run-tool-use.js +5 -0
- package/dist/tools/run-tool-use.js.map +1 -1
- package/dist/web/image-result-metadata.d.ts +20 -0
- package/dist/web/image-result-metadata.js +20 -0
- package/dist/web/image-result-metadata.js.map +1 -0
- package/dist/web/index.d.ts +4 -1
- package/dist/web/index.js +20 -5
- package/dist/web/index.js.map +1 -1
- package/docs/prompt-config.md +1 -1
- package/package.json +22 -20
- package/dist/agents/agent-report-security.test.d.ts +0 -1
- package/dist/agents/agent-report-security.test.js +0 -301
- package/dist/agents/agent-report-security.test.js.map +0 -1
- package/dist/agents/agent-tool-persistence.test.d.ts +0 -1
- package/dist/agents/agent-tool-persistence.test.js +0 -319
- package/dist/agents/agent-tool-persistence.test.js.map +0 -1
- package/dist/agents/coordination-boundary.test.d.ts +0 -1
- package/dist/agents/coordination-boundary.test.js +0 -58
- package/dist/agents/coordination-boundary.test.js.map +0 -1
- package/dist/agents/live-preview-redaction-security.test.d.ts +0 -1
- package/dist/agents/live-preview-redaction-security.test.js +0 -286
- package/dist/agents/live-preview-redaction-security.test.js.map +0 -1
- package/dist/agents/no-nested-delegation.test.d.ts +0 -1
- package/dist/agents/no-nested-delegation.test.js +0 -38
- package/dist/agents/no-nested-delegation.test.js.map +0 -1
- package/dist/agents/obs07-11-run-facts.test.d.ts +0 -1
- package/dist/agents/obs07-11-run-facts.test.js +0 -459
- package/dist/agents/obs07-11-run-facts.test.js.map +0 -1
- package/dist/agents/smoke-agent-lifecycle.d.ts +0 -1
- package/dist/agents/smoke-agent-lifecycle.js +0 -192
- package/dist/agents/smoke-agent-lifecycle.js.map +0 -1
- package/dist/agents/smoke-agents.d.ts +0 -1
- package/dist/agents/smoke-agents.js +0 -362
- package/dist/agents/smoke-agents.js.map +0 -1
- package/dist/context/prompt-config.test.d.ts +0 -1
- package/dist/context/prompt-config.test.js +0 -128
- package/dist/context/prompt-config.test.js.map +0 -1
- package/dist/context/smoke-context.d.ts +0 -1
- package/dist/context/smoke-context.js +0 -502
- package/dist/context/smoke-context.js.map +0 -1
- package/dist/core/obs04-visible-data.test.d.ts +0 -1
- package/dist/core/obs04-visible-data.test.js +0 -147
- package/dist/core/obs04-visible-data.test.js.map +0 -1
- package/dist/core/query-session-settings.test.d.ts +0 -1
- package/dist/core/query-session-settings.test.js +0 -252
- package/dist/core/query-session-settings.test.js.map +0 -1
- package/dist/core/run-agent-pause.test.d.ts +0 -1
- package/dist/core/run-agent-pause.test.js +0 -52
- package/dist/core/run-agent-pause.test.js.map +0 -1
- package/dist/core/run-agent-persistence.test.d.ts +0 -1
- package/dist/core/run-agent-persistence.test.js +0 -222
- package/dist/core/run-agent-persistence.test.js.map +0 -1
- package/dist/core/session-prompt-inheritance.test.d.ts +0 -1
- package/dist/core/session-prompt-inheritance.test.js +0 -132
- package/dist/core/session-prompt-inheritance.test.js.map +0 -1
- package/dist/core/session-settings-prompt.test.d.ts +0 -1
- package/dist/core/session-settings-prompt.test.js +0 -266
- package/dist/core/session-settings-prompt.test.js.map +0 -1
- package/dist/core/smoke-core-loop.d.ts +0 -1
- package/dist/core/smoke-core-loop.js +0 -290
- package/dist/core/smoke-core-loop.js.map +0 -1
- package/dist/core/smoke-image-integrity.d.ts +0 -1
- package/dist/core/smoke-image-integrity.js +0 -67
- package/dist/core/smoke-image-integrity.js.map +0 -1
- package/dist/execution/docker.test.d.ts +0 -1
- package/dist/execution/docker.test.js +0 -57
- package/dist/execution/docker.test.js.map +0 -1
- package/dist/model/openai-native-image-guard.test.d.ts +0 -1
- package/dist/model/openai-native-image-guard.test.js +0 -101
- package/dist/model/openai-native-image-guard.test.js.map +0 -1
- package/dist/model/openai-responses-instructions.test.d.ts +0 -1
- package/dist/model/openai-responses-instructions.test.js +0 -64
- package/dist/model/openai-responses-instructions.test.js.map +0 -1
- package/dist/model/smoke-openai.d.ts +0 -1
- package/dist/model/smoke-openai.js +0 -44
- package/dist/model/smoke-openai.js.map +0 -1
- package/dist/model/smoke-responses-mapper.d.ts +0 -1
- package/dist/model/smoke-responses-mapper.js +0 -156
- package/dist/model/smoke-responses-mapper.js.map +0 -1
- package/dist/plugins/smoke-plugin-system.d.ts +0 -1
- package/dist/plugins/smoke-plugin-system.js +0 -63
- package/dist/plugins/smoke-plugin-system.js.map +0 -1
- package/dist/repl/smoke-run-command.d.ts +0 -1
- package/dist/repl/smoke-run-command.js +0 -43
- package/dist/repl/smoke-run-command.js.map +0 -1
- package/dist/secrets/smoke-secrets.d.ts +0 -1
- package/dist/secrets/smoke-secrets.js +0 -73
- package/dist/secrets/smoke-secrets.js.map +0 -1
- package/dist/session/session-store-safety.test.d.ts +0 -1
- package/dist/session/session-store-safety.test.js +0 -107
- package/dist/session/session-store-safety.test.js.map +0 -1
- package/dist/session/smoke-session.d.ts +0 -1
- package/dist/session/smoke-session.js +0 -233
- package/dist/session/smoke-session.js.map +0 -1
- package/dist/skills/smoke-skills.d.ts +0 -1
- package/dist/skills/smoke-skills.js +0 -109
- package/dist/skills/smoke-skills.js.map +0 -1
- package/dist/tasks/subagent-tools.test.d.ts +0 -1
- package/dist/tasks/subagent-tools.test.js +0 -159
- package/dist/tasks/subagent-tools.test.js.map +0 -1
- package/dist/tasks/task-ack-size.test.d.ts +0 -1
- package/dist/tasks/task-ack-size.test.js +0 -101
- package/dist/tasks/task-ack-size.test.js.map +0 -1
- package/dist/tasks/task-persistence.test.d.ts +0 -1
- package/dist/tasks/task-persistence.test.js +0 -331
- package/dist/tasks/task-persistence.test.js.map +0 -1
- package/dist/tools/smoke-exec-process.d.ts +0 -1
- package/dist/tools/smoke-exec-process.js +0 -127
- package/dist/tools/smoke-exec-process.js.map +0 -1
- package/dist/tools/smoke-terminal-output-chain.d.ts +0 -1
- package/dist/tools/smoke-terminal-output-chain.js +0 -245
- package/dist/tools/smoke-terminal-output-chain.js.map +0 -1
- package/dist/tools/smoke-tool-system.d.ts +0 -1
- package/dist/tools/smoke-tool-system.js +0 -412
- package/dist/tools/smoke-tool-system.js.map +0 -1
- package/dist/tools/terminal-background-history.test.d.ts +0 -1
- package/dist/tools/terminal-background-history.test.js +0 -77
- package/dist/tools/terminal-background-history.test.js.map +0 -1
- package/dist/tools/terminal-output-persistence.test.d.ts +0 -1
- package/dist/tools/terminal-output-persistence.test.js +0 -50
- package/dist/tools/terminal-output-persistence.test.js.map +0 -1
- package/dist/tools/terminal-output-store.test.d.ts +0 -1
- package/dist/tools/terminal-output-store.test.js +0 -364
- package/dist/tools/terminal-output-store.test.js.map +0 -1
- package/dist/web/agent-content-detail.test.d.ts +0 -1
- package/dist/web/agent-content-detail.test.js +0 -307
- package/dist/web/agent-content-detail.test.js.map +0 -1
- package/dist/web/agent-parent-messages.test.d.ts +0 -1
- package/dist/web/agent-parent-messages.test.js +0 -58
- package/dist/web/agent-parent-messages.test.js.map +0 -1
- package/dist/web/agent-tool-payload-security.test.d.ts +0 -1
- package/dist/web/agent-tool-payload-security.test.js +0 -120
- package/dist/web/agent-tool-payload-security.test.js.map +0 -1
- package/dist/web/prompt-config-protocol.test.d.ts +0 -1
- package/dist/web/prompt-config-protocol.test.js +0 -78
- package/dist/web/prompt-config-protocol.test.js.map +0 -1
- package/dist/web/session-prompt-integration.test.d.ts +0 -1
- package/dist/web/session-prompt-integration.test.js +0 -57
- package/dist/web/session-prompt-integration.test.js.map +0 -1
- package/dist/web/session-settings.test.d.ts +0 -1
- package/dist/web/session-settings.test.js +0 -254
- package/dist/web/session-settings.test.js.map +0 -1
- package/dist/web/smoke-agent-content-http.d.ts +0 -1
- package/dist/web/smoke-agent-content-http.js +0 -446
- package/dist/web/smoke-agent-content-http.js.map +0 -1
- package/dist/web/smoke-plan-payload.d.ts +0 -1
- package/dist/web/smoke-plan-payload.js +0 -30
- package/dist/web/smoke-plan-payload.js.map +0 -1
- package/dist/web/smoke-runtime-context-protocol.d.ts +0 -1
- package/dist/web/smoke-runtime-context-protocol.js +0 -42
- package/dist/web/smoke-runtime-context-protocol.js.map +0 -1
- package/dist/web/smoke-status-semantics.d.ts +0 -1
- package/dist/web/smoke-status-semantics.js +0 -90
- package/dist/web/smoke-status-semantics.js.map +0 -1
- package/dist/web/smoke-task-session-entrypoints.d.ts +0 -1
- package/dist/web/smoke-task-session-entrypoints.js +0 -96
- package/dist/web/smoke-task-session-entrypoints.js.map +0 -1
- package/dist/web/smoke-terminal-output-http.d.ts +0 -1
- package/dist/web/smoke-terminal-output-http.js +0 -377
- package/dist/web/smoke-terminal-output-http.js.map +0 -1
- package/dist/web/smoke-tool-call-detail.d.ts +0 -1
- package/dist/web/smoke-tool-call-detail.js +0 -106
- package/dist/web/smoke-tool-call-detail.js.map +0 -1
- package/dist/web/smoke-tool-call-http.d.ts +0 -1
- package/dist/web/smoke-tool-call-http.js +0 -100
- package/dist/web/smoke-tool-call-http.js.map +0 -1
- package/dist/web/smoke-tool-detail-fields-http.d.ts +0 -1
- package/dist/web/smoke-tool-detail-fields-http.js +0 -121
- package/dist/web/smoke-tool-detail-fields-http.js.map +0 -1
- package/dist/web/smoke-web-agent-tasks.d.ts +0 -1
- package/dist/web/smoke-web-agent-tasks.js +0 -50
- package/dist/web/smoke-web-agent-tasks.js.map +0 -1
- package/dist/web/smoke-web-history.d.ts +0 -1
- package/dist/web/smoke-web-history.js +0 -183
- package/dist/web/smoke-web-history.js.map +0 -1
- package/dist/web/smoke-web-queue.d.ts +0 -1
- package/dist/web/smoke-web-queue.js +0 -7
- package/dist/web/smoke-web-queue.js.map +0 -1
- package/dist/web/smoke-web-terminal-tasks.d.ts +0 -1
- package/dist/web/smoke-web-terminal-tasks.js +0 -238
- package/dist/web/smoke-web-terminal-tasks.js.map +0 -1
- package/dist/web/terminal-presentation.test.d.ts +0 -1
- package/dist/web/terminal-presentation.test.js +0 -33
- package/dist/web/terminal-presentation.test.js.map +0 -1
- package/dist/web/tool-detail-fields.test.d.ts +0 -1
- package/dist/web/tool-detail-fields.test.js +0 -121
- package/dist/web/tool-detail-fields.test.js.map +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { JsonSchema } from "../tool.js";
|
|
2
|
+
export declare const IMAGE_MODELS: readonly ["gpt-image-2.5-sunburst", "gpt-image-2.5-flare", "gpt-image-2"];
|
|
3
|
+
export type OpenAIImageModel = typeof IMAGE_MODELS[number];
|
|
4
|
+
export declare const DEFAULT_OPENAI_IMAGE_MODEL: OpenAIImageModel;
|
|
5
|
+
export declare const IMAGE_QUALITIES: readonly ["auto", "low", "medium", "high", "xhigh", "max"];
|
|
6
|
+
export declare const IMAGE_SIZE_RULES = "auto or WIDTHxHEIGHT: both edges multiples of 16, each <=3840, aspect ratio <=3:1, total pixels 655360..8294400";
|
|
7
|
+
export declare const IMAGE_SELECTION_GUIDE = "Prefer the GPT Image 2.5 family. Default to gpt-image-2.5-sunburst with quality=auto for final artwork, precise edits, subject/identity preservation, typography, and demanding layouts. Use gpt-image-2.5-flare when the task explicitly prioritizes speed/interactive iteration. Keep quality=auto unless a controlled tier is appropriate or requested: low for explicitly rough fast drafts, medium for iterative composition previews, high for controlled final production, xhigh for demanding text/layout/detail, max for an explicit maximum-tier request. These are selection heuristics, not guarantees that higher tiers improve every prompt. Respect explicit user tier choices. Cost is not a selection criterion. Use gpt-image-2 only when explicitly requested or necessary for confirmed compatibility; never silently switch models or lower quality. Select size for the intended layout, PNG for lossless art/transparency, JPEG for opaque photos, WebP for web assets. Review warnings and actual output metadata: a compatible gateway may accept but ignore parameters. Quality echo differences are informational: they do not prove an internal downgrade. Distinguish requested settings, upstream-reported settings, and byte-verified properties. Output images report hasAlphaChannel separately from hasTransparentPixels: an alpha channel may be fully opaque; PNG palette/color-key transparency may exist without a separate alpha channel. Missing hasTransparentPixels means unknown, not false.";
|
|
8
|
+
export interface ImageWarning {
|
|
9
|
+
code: string;
|
|
10
|
+
field: string;
|
|
11
|
+
message: string;
|
|
12
|
+
requested?: unknown;
|
|
13
|
+
actual?: unknown;
|
|
14
|
+
remedy?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const IMAGE_INPUT_SCHEMA: JsonSchema;
|
|
17
|
+
export declare function imageValidationError(model: string, field: string, reason: string): string;
|
|
18
|
+
export declare function validImageSize(value: unknown): boolean;
|
|
19
|
+
/** Validate unknown values before any trim, coercion, network request or file write. */
|
|
20
|
+
export declare function normalizeImageInput(value: unknown, configuredModel?: string): Record<string, unknown>;
|
|
21
|
+
export declare function imageInputWarnings(input: Record<string, unknown>): ImageWarning[];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { validateJsonSchema } from "../schema.js";
|
|
2
|
+
export const IMAGE_MODELS = ["gpt-image-2.5-sunburst", "gpt-image-2.5-flare", "gpt-image-2"];
|
|
3
|
+
export const DEFAULT_OPENAI_IMAGE_MODEL = "gpt-image-2.5-sunburst";
|
|
4
|
+
export const IMAGE_QUALITIES = ["auto", "low", "medium", "high", "xhigh", "max"];
|
|
5
|
+
export const IMAGE_SIZE_RULES = "auto or WIDTHxHEIGHT: both edges multiples of 16, each <=3840, aspect ratio <=3:1, total pixels 655360..8294400";
|
|
6
|
+
export const IMAGE_SELECTION_GUIDE = "Prefer the GPT Image 2.5 family. Default to gpt-image-2.5-sunburst with quality=auto for final artwork, precise edits, subject/identity preservation, typography, and demanding layouts. Use gpt-image-2.5-flare when the task explicitly prioritizes speed/interactive iteration. Keep quality=auto unless a controlled tier is appropriate or requested: low for explicitly rough fast drafts, medium for iterative composition previews, high for controlled final production, xhigh for demanding text/layout/detail, max for an explicit maximum-tier request. These are selection heuristics, not guarantees that higher tiers improve every prompt. Respect explicit user tier choices. Cost is not a selection criterion. Use gpt-image-2 only when explicitly requested or necessary for confirmed compatibility; never silently switch models or lower quality. Select size for the intended layout, PNG for lossless art/transparency, JPEG for opaque photos, WebP for web assets. Review warnings and actual output metadata: a compatible gateway may accept but ignore parameters. Quality echo differences are informational: they do not prove an internal downgrade. Distinguish requested settings, upstream-reported settings, and byte-verified properties. Output images report hasAlphaChannel separately from hasTransparentPixels: an alpha channel may be fully opaque; PNG palette/color-key transparency may exist without a separate alpha channel. Missing hasTransparentPixels means unknown, not false.";
|
|
7
|
+
const sourceSchema = {
|
|
8
|
+
type: "object", additionalProperties: false,
|
|
9
|
+
properties: Object.fromEntries(["base64", "data", "dataUrl", "mimeType", "name", "label"].map(key => [key, { type: "string" }])),
|
|
10
|
+
};
|
|
11
|
+
export const IMAGE_INPUT_SCHEMA = {
|
|
12
|
+
type: "object", additionalProperties: false, required: ["semanticName", "prompt"],
|
|
13
|
+
properties: {
|
|
14
|
+
mode: { type: "string", enum: ["generate", "edit"], description: "generate (default) creates a new image; edit modifies source images." },
|
|
15
|
+
semanticName: { type: "string", description: "Required meaningful Chinese/English image name used for the label and filename. Do not use generic image, 图片, output, result, gen, or img." },
|
|
16
|
+
prompt: { type: "string", description: "Detailed scene/layout/text requirements. In edit mode specify exactly what must change and what must remain unchanged." },
|
|
17
|
+
model: { type: "string", enum: [...IMAGE_MODELS], description: `Defaults to configured OPENAI_IMAGE_MODEL or ${DEFAULT_OPENAI_IMAGE_MODEL}. ${IMAGE_SELECTION_GUIDE}` },
|
|
18
|
+
quality: { type: "string", enum: [...IMAGE_QUALITIES], description: "2.5: auto, low, medium, high, xhigh, max. Default auto on all models. Explicit legacy gpt-image-2 rejects xhigh/max. Do not lower quality to save money. auto lets the upstream choose and is not guaranteed to mean max." },
|
|
19
|
+
size: { type: "string", description: `${IMAGE_SIZE_RULES}. Defaults to auto. Examples: 1024x1024, 1536x1024, 1024x1536, 2048x2048, 3840x2160, 2160x3840. Gateways may resize: inspect actual dimensions and warnings.` },
|
|
20
|
+
outputFormat: { type: "string", enum: ["png", "jpeg", "webp"], description: "Default png. PNG for lossless artwork/transparent assets; JPEG for opaque photography; WebP for web delivery/transparency. Actual bytes are inspected, not assumed from this request." },
|
|
21
|
+
background: { type: "string", enum: ["auto", "opaque", "transparent"], description: "Default auto. transparent requires png or webp. Also explicitly request an isolated subject and true transparency in prompt. Gateway support is verified from output where possible." },
|
|
22
|
+
moderation: { type: "string", enum: ["auto", "low"], description: "Default auto. low is the upstream less-restrictive moderation preset, not a safety bypass. Acceptance does not prove that a gateway applied this setting." },
|
|
23
|
+
n: { type: "integer", minimum: 1, maximum: 4, description: "Number of requested images, 1..4; default 1. Returned count is verified and mismatches produce warnings." },
|
|
24
|
+
image: { ...sourceSchema, description: "One explicit edit source. Exactly one of base64/data/dataUrl. PNG/JPEG/WebP; raw base64 requires matching mimeType. Maximum 50 MiB per image." },
|
|
25
|
+
images: { type: "array", minItems: 1, maxItems: 16, items: sourceSchema, description: "Explicit edit sources, maximum 16 total including image and imageRefs." },
|
|
26
|
+
imageRefs: { type: "array", minItems: 1, maxItems: 16, items: { type: "string" }, description: "Prior conversation image IDs/labels/numeric refs. Prefer stable image IDs. Unknown/ambiguous references are errors, never silently use a different image." },
|
|
27
|
+
useLatestImage: { type: "boolean", description: "Default true: in edit mode, use latest available conversation image only when no explicit source or refs are given." },
|
|
28
|
+
outputDir: { type: "string", description: "Optional output directory; defaults to session image directory." },
|
|
29
|
+
outputPath: { type: "string", description: "Optional single-image filename hint; final name derives from semanticName and actual image format. n must be 1. If outputDir is also set, outputPath takes precedence with a warning." },
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export function imageValidationError(model, field, reason) {
|
|
33
|
+
return `image_create validation failed for model ${model}: ${field} ${reason}.`;
|
|
34
|
+
}
|
|
35
|
+
export function validImageSize(value) {
|
|
36
|
+
if (value === "auto")
|
|
37
|
+
return true;
|
|
38
|
+
if (typeof value !== "string" || !/^\d{3,4}x\d{3,4}$/u.test(value))
|
|
39
|
+
return false;
|
|
40
|
+
const [w, h] = value.split("x").map(Number);
|
|
41
|
+
return w > 0 && h > 0 && w <= 3840 && h <= 3840 && w % 16 === 0 && h % 16 === 0
|
|
42
|
+
&& Math.max(w, h) / Math.min(w, h) <= 3 && w * h >= 655360 && w * h <= 8294400;
|
|
43
|
+
}
|
|
44
|
+
/** Validate unknown values before any trim, coercion, network request or file write. */
|
|
45
|
+
export function normalizeImageInput(value, configuredModel) {
|
|
46
|
+
const record = value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
47
|
+
const model = typeof record.model === "string" ? record.model.trim() : configuredModel?.trim() || DEFAULT_OPENAI_IMAGE_MODEL;
|
|
48
|
+
const fail = (field, reason) => { throw new Error(imageValidationError(model, field, reason)); };
|
|
49
|
+
const clean = value && typeof value === "object" && !Array.isArray(value) ? Object.fromEntries(Object.entries(record).filter(([, v]) => v !== undefined)) : value;
|
|
50
|
+
const validation = validateJsonSchema(clean, IMAGE_INPUT_SCHEMA);
|
|
51
|
+
if (!validation.ok)
|
|
52
|
+
fail("input", validation.message);
|
|
53
|
+
if (!IMAGE_MODELS.includes(model))
|
|
54
|
+
fail("model", `must be one of ${IMAGE_MODELS.join(", ")}; update OPENAI_IMAGE_MODEL if configured incorrectly`);
|
|
55
|
+
const input = { mode: "generate", size: "auto", quality: "auto", outputFormat: "png", background: "auto", moderation: "auto", n: 1, useLatestImage: true, ...clean, model };
|
|
56
|
+
if (typeof input.prompt !== "string" || !input.prompt.trim())
|
|
57
|
+
fail("prompt", "must be a non-empty string");
|
|
58
|
+
if ([...input.prompt].length > 32000)
|
|
59
|
+
fail("prompt", "must not exceed 32000 characters");
|
|
60
|
+
if (!validImageSize(input.size))
|
|
61
|
+
fail("size", `must be ${IMAGE_SIZE_RULES}; received ${JSON.stringify(input.size)}`);
|
|
62
|
+
if (model === "gpt-image-2" && ["max", "xhigh"].includes(String(input.quality)))
|
|
63
|
+
fail("quality", `${input.quality} is only available for 2.5 models; select gpt-image-2.5-sunburst or use high with gpt-image-2`);
|
|
64
|
+
if (input.background === "transparent" && input.outputFormat === "jpeg")
|
|
65
|
+
fail("outputFormat", "jpeg cannot store transparency; use png or webp with background=transparent, or request background=opaque");
|
|
66
|
+
if (!Number.isInteger(input.n) || Number(input.n) < 1 || Number(input.n) > 4)
|
|
67
|
+
fail("n", "must be an integer between 1 and 4");
|
|
68
|
+
if (record.useLatestImage !== undefined && typeof record.useLatestImage !== "boolean")
|
|
69
|
+
fail("useLatestImage", "must be boolean");
|
|
70
|
+
for (const key of ["outputDir", "outputPath"]) {
|
|
71
|
+
const v = record[key];
|
|
72
|
+
if (v !== undefined && (typeof v !== "string" || !v.trim() || /[\u0000-\u001f]/u.test(v)))
|
|
73
|
+
fail(key, "must be a non-empty path without control characters");
|
|
74
|
+
}
|
|
75
|
+
if (record.outputPath !== undefined && input.n !== 1)
|
|
76
|
+
fail("outputPath", "requires n=1; use outputDir for multiple images");
|
|
77
|
+
for (const key of ["images", "imageRefs"]) {
|
|
78
|
+
const v = record[key];
|
|
79
|
+
if (v !== undefined && (!Array.isArray(v) || v.length < 1 || v.length > 16))
|
|
80
|
+
fail(key, "must contain 1..16 entries");
|
|
81
|
+
}
|
|
82
|
+
if (Array.isArray(record.imageRefs) && record.imageRefs.some(ref => typeof ref !== "string" || !ref.trim()))
|
|
83
|
+
fail("imageRefs", "must contain non-empty strings");
|
|
84
|
+
const count = (record.image ? 1 : 0) + (Array.isArray(record.images) ? record.images.length : 0) + (Array.isArray(record.imageRefs) ? record.imageRefs.length : 0);
|
|
85
|
+
if (count > 16)
|
|
86
|
+
fail("images", "maximum 16 total source images including image, images and imageRefs");
|
|
87
|
+
return input;
|
|
88
|
+
}
|
|
89
|
+
export function imageInputWarnings(input) {
|
|
90
|
+
const warnings = [];
|
|
91
|
+
if (input.mode === "generate" && (input.image || input.images || input.imageRefs))
|
|
92
|
+
warnings.push({ code: "UNUSED_EDIT_SOURCES", field: "mode", message: "Sources were provided in generate mode and will not be sent. This is a new image, not an edit.", remedy: "Use mode=edit to preserve or modify source images." });
|
|
93
|
+
if (input.outputDir && input.outputPath)
|
|
94
|
+
warnings.push({ code: "OUTPUT_PATH_PRECEDENCE", field: "outputDir", message: "Both outputDir and outputPath were supplied; outputPath takes precedence." });
|
|
95
|
+
return warnings;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=image-capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-capabilities.js","sourceRoot":"","sources":["../../../src/tools/builtins/image-capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { Tool } from "../tool.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { type ImageWarning } from "./image-capabilities.js";
|
|
3
|
+
import { type ImageByteMetadata } from "./image-output-verification.js";
|
|
4
|
+
export { DEFAULT_OPENAI_IMAGE_MODEL } from "./image-capabilities.js";
|
|
5
|
+
export type { OpenAIImageModel } from "./image-capabilities.js";
|
|
6
|
+
export type ImageGenerationSize = "auto" | `${number}x${number}`;
|
|
7
|
+
export type ImageGenerationQuality = "auto" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
4
8
|
export type ImageGenerationFormat = "png" | "jpeg" | "webp";
|
|
5
9
|
export type OpenAIImageGenerationResponseFormat = ImageGenerationFormat | "jpg";
|
|
6
10
|
export type ImageGenerationBackground = "auto" | "transparent" | "opaque";
|
|
7
11
|
export type ImageGenerationModeration = "auto" | "low";
|
|
8
|
-
export type OpenAIImageModel = "gpt-image-2";
|
|
9
12
|
export type ImageToolMode = "generate" | "edit";
|
|
10
13
|
export interface ImageEditInputImage {
|
|
11
14
|
/** Base64 image bytes, either raw or a data URL. */
|
|
@@ -44,12 +47,11 @@ export interface ImageGenerationToolInput {
|
|
|
44
47
|
useLatestImage?: boolean;
|
|
45
48
|
/** Directory where generated image files should be saved. Defaults to a session/agent image directory. */
|
|
46
49
|
outputDir?: string;
|
|
47
|
-
/**
|
|
50
|
+
/** Single-image path hint; semanticName and verified format determine the filename. Requires n=1. */
|
|
48
51
|
outputPath?: string;
|
|
49
52
|
}
|
|
50
|
-
export interface ImageGenerationResult {
|
|
53
|
+
export interface ImageGenerationResult extends ImageByteMetadata {
|
|
51
54
|
index: number;
|
|
52
|
-
mimeType: string;
|
|
53
55
|
base64: string;
|
|
54
56
|
dataUrl: string;
|
|
55
57
|
revisedPrompt?: string;
|
|
@@ -91,6 +93,11 @@ export interface ImageGenerationToolOutput extends ImageGenerationToolTiming {
|
|
|
91
93
|
sourceImages?: number;
|
|
92
94
|
imageRefs?: string[];
|
|
93
95
|
images: ImageGenerationResult[];
|
|
96
|
+
/** Explicit request, never confused with actual image properties. */
|
|
97
|
+
requested: Record<string, unknown>;
|
|
98
|
+
/** Upstream report, not independent proof of model/compute. */
|
|
99
|
+
actual: Record<string, unknown>;
|
|
100
|
+
warnings: ImageWarning[];
|
|
94
101
|
raw?: unknown;
|
|
95
102
|
}
|
|
96
103
|
export interface CreateOpenAIImageGenerationToolOptions {
|
|
@@ -99,7 +106,6 @@ export interface CreateOpenAIImageGenerationToolOptions {
|
|
|
99
106
|
model?: string;
|
|
100
107
|
timeoutMs?: number;
|
|
101
108
|
}
|
|
102
|
-
export declare const DEFAULT_OPENAI_IMAGE_MODEL: OpenAIImageModel;
|
|
103
109
|
export declare const DEFAULT_IMAGE_TIMEOUT_MS = 360000;
|
|
104
110
|
/**
|
|
105
111
|
* OpenAI-only image generation tool backed by the Images API.
|
|
@@ -110,3 +116,4 @@ export declare const DEFAULT_IMAGE_TIMEOUT_MS = 360000;
|
|
|
110
116
|
*/
|
|
111
117
|
export declare function createOpenAIImageGenerationTool(options?: CreateOpenAIImageGenerationToolOptions): Tool<ImageGenerationToolInput>;
|
|
112
118
|
export declare const openAIImageGenerationTool: Tool<ImageGenerationToolInput>;
|
|
119
|
+
export declare function normalizeImageBaseUrl(value: string): string;
|