neoctl 0.1.17 → 0.1.19
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/agents/local-agent-task.js +1 -2
- package/dist/agents/local-agent-task.js.map +1 -1
- package/dist/agents/smoke-agents.js +4 -21
- package/dist/agents/smoke-agents.js.map +1 -1
- package/dist/context/prompts.js +0 -4
- package/dist/context/prompts.js.map +1 -1
- package/dist/core/query-engine.d.ts +1 -22
- package/dist/core/query-engine.js +12 -106
- package/dist/core/query-engine.js.map +1 -1
- package/dist/core/query.d.ts +1 -2
- package/dist/core/query.js +5 -59
- package/dist/core/query.js.map +1 -1
- package/dist/core/smoke-core-loop.js +6 -95
- package/dist/core/smoke-core-loop.js.map +1 -1
- package/dist/index.d.ts +1 -25
- package/dist/index.js +1 -25
- package/dist/index.js.map +1 -1
- package/dist/model/communication-logger.d.ts +1 -2
- package/dist/model/communication-logger.js +0 -3
- package/dist/model/communication-logger.js.map +1 -1
- package/dist/model/config.d.ts +4 -10
- package/dist/model/config.js +12 -61
- package/dist/model/config.js.map +1 -1
- package/dist/model/context-window.js +0 -1
- package/dist/model/context-window.js.map +1 -1
- package/dist/model/env.js +19 -35
- package/dist/model/env.js.map +1 -1
- package/dist/model/model-metadata.json +677 -726
- package/dist/model/openai-adapter.d.ts +1 -1
- package/dist/model/openai-chat-mapper.d.ts +1 -4
- package/dist/model/openai-chat-mapper.js +8 -30
- package/dist/model/openai-chat-mapper.js.map +1 -1
- package/dist/model/openai-mappers.d.ts +2 -5
- package/dist/model/openai-mappers.js +4 -17
- package/dist/model/openai-mappers.js.map +1 -1
- package/dist/model/openai-responses-mapper.d.ts +1 -1
- package/dist/model/openai-responses-mapper.js +1 -2
- package/dist/model/openai-responses-mapper.js.map +1 -1
- package/dist/model/provider-factory.js +0 -32
- package/dist/model/provider-factory.js.map +1 -1
- package/dist/model/smoke-openai.js +1 -1
- package/dist/model/smoke-openai.js.map +1 -1
- package/dist/model/smoke-responses-mapper.js +6 -6
- package/dist/model/smoke-responses-mapper.js.map +1 -1
- package/dist/repl/commands.d.ts +0 -15
- package/dist/repl/commands.js +0 -58
- package/dist/repl/commands.js.map +1 -1
- package/dist/repl/index.js +144 -970
- package/dist/repl/index.js.map +1 -1
- package/dist/repl/render.js +2 -0
- package/dist/repl/render.js.map +1 -1
- package/dist/repl/status-line.d.ts +1 -0
- package/dist/repl/status-line.js +34 -27
- package/dist/repl/status-line.js.map +1 -1
- package/dist/session/session-store.js +2 -2
- package/dist/session/session-store.js.map +1 -1
- package/dist/session/smoke-session.js +1 -22
- package/dist/session/smoke-session.js.map +1 -1
- package/dist/skills/skill-tool.d.ts +5 -85
- package/dist/skills/skill-tool.js +14 -173
- package/dist/skills/skill-tool.js.map +1 -1
- package/dist/skills/smoke-skills.js +5 -54
- package/dist/skills/smoke-skills.js.map +1 -1
- package/dist/tools/builtins/search-providers.d.ts +1 -15
- package/dist/tools/builtins/search-providers.js +1 -195
- package/dist/tools/builtins/search-providers.js.map +1 -1
- package/dist/tools/builtins/search-tool.js +2 -2
- package/dist/tools/builtins/search-tool.js.map +1 -1
- package/dist/tools/registry.d.ts +0 -1
- package/dist/tools/registry.js +0 -11
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run-tool-use.js +1 -1
- package/dist/tools/run-tool-use.js.map +1 -1
- package/dist/tools/smoke-tool-system.js +9 -43
- package/dist/tools/smoke-tool-system.js.map +1 -1
- package/dist/tools/tool.d.ts +1 -9
- package/dist/tools/tool.js.map +1 -1
- package/package.json +1 -1
- package/scripts/build-standalone.mjs +139 -139
- package/dist/model/deepseek-adapter.d.ts +0 -29
- package/dist/model/deepseek-adapter.js +0 -108
- package/dist/model/deepseek-adapter.js.map +0 -1
- package/dist/model/kimi-adapter.d.ts +0 -29
- package/dist/model/kimi-adapter.js +0 -108
- package/dist/model/kimi-adapter.js.map +0 -1
- package/dist/model/smoke-deepseek-mapper.d.ts +0 -1
- package/dist/model/smoke-deepseek-mapper.js +0 -65
- package/dist/model/smoke-deepseek-mapper.js.map +0 -1
- package/dist/open-directory.d.ts +0 -1
- package/dist/open-directory.js +0 -26
- package/dist/open-directory.js.map +0 -1
- package/dist/paths.d.ts +0 -7
- package/dist/paths.js +0 -12
- package/dist/paths.js.map +0 -1
- package/dist/session/session-export.d.ts +0 -33
- package/dist/session/session-export.js +0 -351
- package/dist/session/session-export.js.map +0 -1
- package/dist/session/simple-session-runtime.d.ts +0 -74
- package/dist/session/simple-session-runtime.js +0 -171
- package/dist/session/simple-session-runtime.js.map +0 -1
- package/dist/skills/skill-filesystem.d.ts +0 -32
- package/dist/skills/skill-filesystem.js +0 -371
- package/dist/skills/skill-filesystem.js.map +0 -1
- package/dist/skills/skill-management-tools.d.ts +0 -36
- package/dist/skills/skill-management-tools.js +0 -188
- package/dist/skills/skill-management-tools.js.map +0 -1
- package/dist/tips.d.ts +0 -10
- package/dist/tips.js +0 -168
- package/dist/tips.js.map +0 -1
- package/dist/tools/builtins/image-generation-tool.d.ts +0 -68
- package/dist/tools/builtins/image-generation-tool.js +0 -315
- package/dist/tools/builtins/image-generation-tool.js.map +0 -1
- package/dist/ui/display-message.d.ts +0 -101
- package/dist/ui/display-message.js +0 -113
- package/dist/ui/display-message.js.map +0 -1
- package/dist/web/html.d.ts +0 -1
- package/dist/web/html.js +0 -858
- package/dist/web/html.js.map +0 -1
- package/dist/web/index.d.ts +0 -2
- package/dist/web/index.js +0 -1810
- package/dist/web/index.js.map +0 -1
package/dist/tips.js
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
export const appTips = [
|
|
2
|
-
{
|
|
3
|
-
id: "ask-directly",
|
|
4
|
-
title: "Describe the goal directly",
|
|
5
|
-
placeholder: "Tip: Type the task you want done, e.g. “summarize this project structure”",
|
|
6
|
-
detail: "You can describe goals, constraints, and expected output in plain language. More specific requests usually produce better results.",
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
id: "slash-help",
|
|
10
|
-
title: "View commands",
|
|
11
|
-
placeholder: "Tip: Type /help to see available commands",
|
|
12
|
-
detail: "Use /help to list built-in commands and their usage.",
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
id: "slash-completion",
|
|
16
|
-
title: "Complete slash commands",
|
|
17
|
-
placeholder: "Tip: Type /, use ↑/↓ to select, and Tab to complete",
|
|
18
|
-
detail: "Slash commands show completions as you type. Use arrow keys to select, Tab to complete, and Enter to run.",
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
id: "history",
|
|
22
|
-
title: "Reuse previous input",
|
|
23
|
-
placeholder: "Tip: Press ↑ on an empty prompt to recall previous input",
|
|
24
|
-
detail: "Use ↑/↓ to browse input history so you can quickly retry or edit earlier prompts.",
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
id: "interrupt",
|
|
28
|
-
title: "Interrupt or exit",
|
|
29
|
-
placeholder: "Tip: Ctrl+C clears input or interrupts work; press again on empty input to exit",
|
|
30
|
-
detail: "Ctrl+C clears non-empty input, requests interruption while work is running, and exits after a second press on an empty prompt.",
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
id: "queue",
|
|
34
|
-
title: "Queue the next message",
|
|
35
|
-
placeholder: "Tip: You can type while the assistant is busy; Enter queues the next message",
|
|
36
|
-
detail: "When work is running, submit another prompt to queue it. If needed, press Esc to bring queued input back to the editor.",
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
id: "paste",
|
|
40
|
-
title: "Paste content",
|
|
41
|
-
placeholder: "Tip: Paste text directly; long text may be folded into an attachment reference",
|
|
42
|
-
detail: "Short pasted text is inserted directly. Longer pasted text can be folded into a [text_...] reference and sent with your message.",
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: "image-paste",
|
|
46
|
-
title: "Paste images",
|
|
47
|
-
placeholder: "Tip: With vision-capable models, paste screenshots and reference them as [img#1]",
|
|
48
|
-
detail: "If the current model supports image input, you can paste images or screenshots from the clipboard and submit them with your prompt.",
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
id: "sessions",
|
|
52
|
-
title: "Resume sessions",
|
|
53
|
-
placeholder: "Tip: Type /sessions to browse and resume saved sessions",
|
|
54
|
-
detail: "Use /sessions to open saved sessions and continue working with previous context.",
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
id: "model",
|
|
58
|
-
title: "Switch models",
|
|
59
|
-
placeholder: "Tip: Type /model to view or switch model and reasoning effort",
|
|
60
|
-
detail: "Use /model to inspect the current model, or pass a model id and reasoning effort such as /model gpt-5 high.",
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
id: "compact",
|
|
64
|
-
title: "Compact long context",
|
|
65
|
-
placeholder: "Tip: Use /compact in long sessions to compress earlier context",
|
|
66
|
-
detail: "Manual compaction preserves important context while reducing pressure on the model context window.",
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
id: "pure",
|
|
70
|
-
title: "Clean up after blocks",
|
|
71
|
-
placeholder: "Tip: If an upstream WAF or risk block occurs, try /pure to sanitize context",
|
|
72
|
-
detail: "/pure performs a more conservative context cleanup that can help recover after upstream safety or WAF blocks.",
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
id: "export",
|
|
76
|
-
title: "Export a transcript",
|
|
77
|
-
placeholder: "Tip: Type /export <absolute-path.md> to export the current transcript",
|
|
78
|
-
detail: "Use /export to save the current session as Markdown for review, sharing, or archiving.",
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
id: "cost",
|
|
82
|
-
title: "Check usage",
|
|
83
|
-
placeholder: "Tip: Type /cost to show token usage for this REPL session",
|
|
84
|
-
detail: "/cost displays accumulated request and token usage for the current session.",
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
id: "state",
|
|
88
|
-
title: "Inspect runtime state",
|
|
89
|
-
placeholder: "Tip: Type /state to inspect engine state for troubleshooting",
|
|
90
|
-
detail: "/state shows query engine state and is useful when debugging configuration, context, or runtime behavior.",
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
id: "login",
|
|
94
|
-
title: "Configure providers",
|
|
95
|
-
placeholder: "Tip: Type /login to configure and save a model provider",
|
|
96
|
-
detail: "Use /login when setting up the app for the first time or switching provider credentials.",
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
id: "logs",
|
|
100
|
-
title: "Enable communication logs",
|
|
101
|
-
placeholder: "Tip: Use /log <directory> to capture model communication logs",
|
|
102
|
-
detail: "Use /log with an absolute directory to write model communication logs; use /log off to disable them.",
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
id: "plan",
|
|
106
|
-
title: "Ask for a plan",
|
|
107
|
-
placeholder: "Tip: For complex work, ask the assistant to plan first and verify each step",
|
|
108
|
-
detail: "For multi-step engineering tasks, ask for a short plan, incremental edits, and concrete validation at the end.",
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
id: "constraints",
|
|
112
|
-
title: "State constraints",
|
|
113
|
-
placeholder: "Tip: Add constraints like “do not change public APIs” or “only edit src/web”",
|
|
114
|
-
detail: "Mention scope, style, compatibility, and things to avoid up front to reduce rework.",
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
id: "validation",
|
|
118
|
-
title: "Request validation",
|
|
119
|
-
placeholder: "Tip: Ask to run npm test, typecheck, or a project-specific command after changes",
|
|
120
|
-
detail: "If you know the right validation command, include it in the request so the assistant can verify the work precisely.",
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
id: "reset",
|
|
124
|
-
title: "Start fresh",
|
|
125
|
-
placeholder: "Tip: Type /reset to clear the current transcript without leaving the REPL",
|
|
126
|
-
detail: "/reset clears the visible conversation and adds a reset marker so you can start a fresh thread in the same session.",
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
id: "focus-files",
|
|
130
|
-
title: "Point to relevant files",
|
|
131
|
-
placeholder: "Tip: Mention exact files or symbols, e.g. “check src/repl/index.ts PromptLine”",
|
|
132
|
-
detail: "Naming files, functions, errors, or commands helps the assistant inspect the right context first and avoid broad searches.",
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
id: "review-diff",
|
|
136
|
-
title: "Review before finishing",
|
|
137
|
-
placeholder: "Tip: Ask to show or summarize the diff before wrapping up a change",
|
|
138
|
-
detail: "For risky edits, ask for a diff summary or specific files changed before running validation and finalizing.",
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
id: "current-docs",
|
|
142
|
-
title: "Use current docs",
|
|
143
|
-
placeholder: "Tip: For fast-moving APIs, ask the assistant to search the web before changing code",
|
|
144
|
-
detail: "When behavior depends on current packages, SDKs, or service docs, request a web search so the answer is not based only on local code.",
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
id: "parallel-investigation",
|
|
148
|
-
title: "Split independent work",
|
|
149
|
-
placeholder: "Tip: For independent checks, ask the assistant to investigate them in parallel",
|
|
150
|
-
detail: "Independent searches, audits, or comparisons can be delegated to subagents so findings come back faster and with clearer scope.",
|
|
151
|
-
},
|
|
152
|
-
];
|
|
153
|
-
export function tipAt(index) {
|
|
154
|
-
return appTips[positiveModulo(index, appTips.length)] ?? appTips[0];
|
|
155
|
-
}
|
|
156
|
-
export function initialTipIndex(seed) {
|
|
157
|
-
let hash = 0;
|
|
158
|
-
for (const char of seed)
|
|
159
|
-
hash = (hash * 31 + char.charCodeAt(0)) | 0;
|
|
160
|
-
return positiveModulo(hash, appTips.length);
|
|
161
|
-
}
|
|
162
|
-
export function formatTipLine(tip) {
|
|
163
|
-
return `Tip: ${tip.title} — ${tip.detail}`;
|
|
164
|
-
}
|
|
165
|
-
function positiveModulo(value, modulo) {
|
|
166
|
-
return ((value % modulo) + modulo) % modulo;
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=tips.js.map
|
package/dist/tips.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tips.js","sourceRoot":"","sources":["../src/tips.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import type { Tool } from "../tool.js";
|
|
2
|
-
export type ImageGenerationSize = "auto" | "1024x1024" | "1536x1024" | "1024x1536";
|
|
3
|
-
export type ImageGenerationQuality = "auto" | "low" | "medium" | "high";
|
|
4
|
-
export type ImageGenerationFormat = "png" | "jpeg" | "webp";
|
|
5
|
-
export type OpenAIImageGenerationResponseFormat = ImageGenerationFormat | "jpg";
|
|
6
|
-
export type ImageGenerationBackground = "auto" | "transparent" | "opaque";
|
|
7
|
-
export type ImageGenerationModeration = "auto" | "low";
|
|
8
|
-
export interface ImageGenerationToolInput {
|
|
9
|
-
prompt: string;
|
|
10
|
-
model?: string;
|
|
11
|
-
size?: ImageGenerationSize;
|
|
12
|
-
quality?: ImageGenerationQuality;
|
|
13
|
-
outputFormat?: ImageGenerationFormat;
|
|
14
|
-
background?: ImageGenerationBackground;
|
|
15
|
-
moderation?: ImageGenerationModeration;
|
|
16
|
-
n?: number;
|
|
17
|
-
}
|
|
18
|
-
export interface ImageGenerationResult {
|
|
19
|
-
index: number;
|
|
20
|
-
mimeType: string;
|
|
21
|
-
base64: string;
|
|
22
|
-
dataUrl: string;
|
|
23
|
-
revisedPrompt?: string;
|
|
24
|
-
}
|
|
25
|
-
export interface ImageGenerationToolTiming {
|
|
26
|
-
/** Unix epoch milliseconds captured immediately before the OpenAI image request starts. */
|
|
27
|
-
startedAt: number;
|
|
28
|
-
/** ISO-8601 timestamp captured from startedAt for UI display. */
|
|
29
|
-
startedAtIso: string;
|
|
30
|
-
/** Unix epoch milliseconds captured when the tool finishes or fails. */
|
|
31
|
-
finishedAt: number;
|
|
32
|
-
/** ISO-8601 timestamp captured from finishedAt for UI display. */
|
|
33
|
-
finishedAtIso: string;
|
|
34
|
-
/** Total elapsed time in milliseconds. */
|
|
35
|
-
duration: number;
|
|
36
|
-
/** Alias of duration for consumers that expect elapsed milliseconds. */
|
|
37
|
-
elapsed: number;
|
|
38
|
-
/** Explicit millisecond aliases for consumers that prefer unit-suffixed names. */
|
|
39
|
-
durationMs: number;
|
|
40
|
-
elapsedMs: number;
|
|
41
|
-
}
|
|
42
|
-
export interface ImageGenerationToolOutput extends ImageGenerationToolTiming {
|
|
43
|
-
provider: "openai";
|
|
44
|
-
model: string;
|
|
45
|
-
prompt: string;
|
|
46
|
-
size: ImageGenerationSize;
|
|
47
|
-
quality: ImageGenerationQuality;
|
|
48
|
-
outputFormat: ImageGenerationFormat;
|
|
49
|
-
background: ImageGenerationBackground;
|
|
50
|
-
returnedImages: number;
|
|
51
|
-
images: ImageGenerationResult[];
|
|
52
|
-
raw?: unknown;
|
|
53
|
-
}
|
|
54
|
-
export interface CreateOpenAIImageGenerationToolOptions {
|
|
55
|
-
apiKey?: string;
|
|
56
|
-
baseUrl?: string;
|
|
57
|
-
model?: string;
|
|
58
|
-
timeoutMs?: number;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* OpenAI-only image generation tool backed by the Images API.
|
|
62
|
-
*
|
|
63
|
-
* The tool is intentionally exposed only when MODEL_PROVIDER=openai. Other providers
|
|
64
|
-
* should not receive a drawable tool definition; the default system prompt tells the
|
|
65
|
-
* model that image generation is unavailable in that configuration.
|
|
66
|
-
*/
|
|
67
|
-
export declare function createOpenAIImageGenerationTool(options?: CreateOpenAIImageGenerationToolOptions): Tool<ImageGenerationToolInput>;
|
|
68
|
-
export declare const openAIImageGenerationTool: Tool<ImageGenerationToolInput>;
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com";
|
|
2
|
-
const DEFAULT_IMAGE_MODEL = "gpt-image-1";
|
|
3
|
-
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
4
|
-
const MAX_IMAGES = 4;
|
|
5
|
-
/**
|
|
6
|
-
* OpenAI-only image generation tool backed by the Images API.
|
|
7
|
-
*
|
|
8
|
-
* The tool is intentionally exposed only when MODEL_PROVIDER=openai. Other providers
|
|
9
|
-
* should not receive a drawable tool definition; the default system prompt tells the
|
|
10
|
-
* model that image generation is unavailable in that configuration.
|
|
11
|
-
*/
|
|
12
|
-
export function createOpenAIImageGenerationTool(options = {}) {
|
|
13
|
-
return {
|
|
14
|
-
name: "image2",
|
|
15
|
-
aliases: ["draw_image", "generate_image"],
|
|
16
|
-
description: "Generate images with OpenAI's Images API. Use this when the user asks you to draw, create, generate, or render an image. Return the generated image data URLs in the tool result for the UI to display. This tool is available only when MODEL_PROVIDER=openai; with other providers, state that this model does not have a drawing tool.",
|
|
17
|
-
inputSchema: {
|
|
18
|
-
type: "object",
|
|
19
|
-
properties: {
|
|
20
|
-
prompt: { type: "string", description: "Detailed image prompt. Include subject, style, composition, colors, text to render, aspect ratio intent, and any safety-preserving constraints." },
|
|
21
|
-
model: { type: "string", description: `Optional OpenAI image model. Defaults to OPENAI_IMAGE_MODEL or ${DEFAULT_IMAGE_MODEL}.` },
|
|
22
|
-
size: { type: "string", enum: ["auto", "1024x1024", "1536x1024", "1024x1536"], description: "Output image size. Use 1024x1024 for square, 1536x1024 for landscape, 1024x1536 for portrait. Defaults to auto." },
|
|
23
|
-
quality: { type: "string", enum: ["auto", "low", "medium", "high"], description: "Rendering quality. Defaults to auto." },
|
|
24
|
-
outputFormat: { type: "string", enum: ["png", "jpeg", "webp"], description: "Returned image format. Defaults to png." },
|
|
25
|
-
background: { type: "string", enum: ["auto", "transparent", "opaque"], description: "Background handling for supported models. Defaults to auto." },
|
|
26
|
-
moderation: { type: "string", enum: ["auto", "low"], description: "OpenAI image moderation setting for supported models. Defaults to auto." },
|
|
27
|
-
n: { type: "integer", description: `Number of images to generate, 1-${MAX_IMAGES}. Defaults to 1.` },
|
|
28
|
-
},
|
|
29
|
-
required: ["prompt"],
|
|
30
|
-
additionalProperties: false,
|
|
31
|
-
},
|
|
32
|
-
metadata: {
|
|
33
|
-
readOnly: false,
|
|
34
|
-
concurrent: true,
|
|
35
|
-
visible: true,
|
|
36
|
-
maxResultSizeChars: 24000,
|
|
37
|
-
},
|
|
38
|
-
validate(input) {
|
|
39
|
-
const record = input;
|
|
40
|
-
return {
|
|
41
|
-
prompt: record.prompt ?? "",
|
|
42
|
-
model: record.model,
|
|
43
|
-
size: record.size ?? "auto",
|
|
44
|
-
quality: record.quality ?? "auto",
|
|
45
|
-
outputFormat: record.outputFormat ?? "png",
|
|
46
|
-
background: record.background ?? "auto",
|
|
47
|
-
moderation: record.moderation ?? "auto",
|
|
48
|
-
n: record.n ?? 1,
|
|
49
|
-
};
|
|
50
|
-
},
|
|
51
|
-
validateInput(input) {
|
|
52
|
-
if (!input.prompt.trim())
|
|
53
|
-
return { ok: false, message: "image2.prompt cannot be empty" };
|
|
54
|
-
if (input.model !== undefined && !input.model.trim())
|
|
55
|
-
return { ok: false, message: "image2.model cannot be empty" };
|
|
56
|
-
if (!isImageSize(input.size))
|
|
57
|
-
return { ok: false, message: "image2.size must be auto, 1024x1024, 1536x1024, or 1024x1536" };
|
|
58
|
-
if (!isImageQuality(input.quality))
|
|
59
|
-
return { ok: false, message: "image2.quality must be auto, low, medium, or high" };
|
|
60
|
-
if (!isImageFormat(input.outputFormat))
|
|
61
|
-
return { ok: false, message: "image2.outputFormat must be png, jpeg, or webp" };
|
|
62
|
-
if (!isImageBackground(input.background))
|
|
63
|
-
return { ok: false, message: "image2.background must be auto, transparent, or opaque" };
|
|
64
|
-
if (!isImageModeration(input.moderation))
|
|
65
|
-
return { ok: false, message: "image2.moderation must be auto or low" };
|
|
66
|
-
const count = input.n ?? 1;
|
|
67
|
-
if (!Number.isInteger(count) || count < 1 || count > MAX_IMAGES)
|
|
68
|
-
return { ok: false, message: `image2.n must be between 1 and ${MAX_IMAGES}` };
|
|
69
|
-
return { ok: true, value: { ...input, n: count } };
|
|
70
|
-
},
|
|
71
|
-
isConcurrencySafe() {
|
|
72
|
-
return true;
|
|
73
|
-
},
|
|
74
|
-
async call(input, context, callOptions) {
|
|
75
|
-
const apiKey = resolveApiKey(options.apiKey);
|
|
76
|
-
if (!apiKey) {
|
|
77
|
-
return {
|
|
78
|
-
ok: false,
|
|
79
|
-
output: {
|
|
80
|
-
provider: "openai",
|
|
81
|
-
error: "OpenAI image generation requires OPENAI_IMAGE_API_KEY or OPENAI_API_KEY.",
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
const baseUrl = stripTrailingSlash(options.baseUrl?.trim() || process.env.OPENAI_IMAGE_BASE_URL?.trim() || process.env.OPENAI_BASE_URL?.trim() || DEFAULT_OPENAI_BASE_URL);
|
|
86
|
-
const model = input.model?.trim() || options.model?.trim() || process.env.OPENAI_IMAGE_MODEL?.trim() || DEFAULT_IMAGE_MODEL;
|
|
87
|
-
const timeoutMs = options.timeoutMs ?? parsePositiveNumber(process.env.OPENAI_IMAGE_TIMEOUT_MS) ?? parsePositiveNumber(process.env.MODEL_TIMEOUT_MS) ?? DEFAULT_TIMEOUT_MS;
|
|
88
|
-
callOptions.onProgress?.({ toolName: "image2", message: `Generating image with OpenAI ${model}` });
|
|
89
|
-
const startedAt = Date.now();
|
|
90
|
-
try {
|
|
91
|
-
const response = await callOpenAIImageGeneration({
|
|
92
|
-
apiKey,
|
|
93
|
-
baseUrl,
|
|
94
|
-
timeoutMs,
|
|
95
|
-
signal: context.abortSignal,
|
|
96
|
-
input: { ...input, model },
|
|
97
|
-
});
|
|
98
|
-
const images = extractGeneratedImages(response, input.outputFormat ?? "png");
|
|
99
|
-
const timing = imageGenerationTiming(startedAt);
|
|
100
|
-
const output = {
|
|
101
|
-
...timing,
|
|
102
|
-
provider: "openai",
|
|
103
|
-
model,
|
|
104
|
-
prompt: input.prompt,
|
|
105
|
-
size: input.size ?? "auto",
|
|
106
|
-
quality: input.quality ?? "auto",
|
|
107
|
-
outputFormat: input.outputFormat ?? "png",
|
|
108
|
-
background: input.background ?? "auto",
|
|
109
|
-
returnedImages: images.length,
|
|
110
|
-
images,
|
|
111
|
-
raw: compactRawResponse(response),
|
|
112
|
-
};
|
|
113
|
-
return {
|
|
114
|
-
ok: images.length > 0,
|
|
115
|
-
output,
|
|
116
|
-
summary: images.length ? `${images.length} image(s) generated in ${timing.duration}ms` : `OpenAI returned no image data after ${timing.duration}ms`,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
return {
|
|
121
|
-
ok: false,
|
|
122
|
-
output: {
|
|
123
|
-
...imageGenerationTiming(startedAt),
|
|
124
|
-
provider: "openai",
|
|
125
|
-
model,
|
|
126
|
-
prompt: input.prompt,
|
|
127
|
-
error: error instanceof Error ? error.message : String(error),
|
|
128
|
-
},
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
mapResult(result) {
|
|
133
|
-
return compactImageGenerationOutput(result.output);
|
|
134
|
-
},
|
|
135
|
-
renderToolResultMessage(result, request) {
|
|
136
|
-
return createImageGenerationToolResultMessage(result, request?.id ?? "");
|
|
137
|
-
},
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
export const openAIImageGenerationTool = createOpenAIImageGenerationTool();
|
|
141
|
-
async function callOpenAIImageGeneration(options) {
|
|
142
|
-
const controller = new AbortController();
|
|
143
|
-
const abort = () => controller.abort(options.signal?.reason);
|
|
144
|
-
const timeout = setTimeout(() => controller.abort(new Error(`Image generation request timed out after ${options.timeoutMs}ms`)), options.timeoutMs);
|
|
145
|
-
options.signal?.addEventListener("abort", abort, { once: true });
|
|
146
|
-
try {
|
|
147
|
-
const response = await fetch(`${options.baseUrl}/v1/images/generations`, {
|
|
148
|
-
method: "POST",
|
|
149
|
-
headers: {
|
|
150
|
-
Accept: "application/json",
|
|
151
|
-
"Content-Type": "application/json",
|
|
152
|
-
Authorization: `Bearer ${options.apiKey}`,
|
|
153
|
-
},
|
|
154
|
-
body: JSON.stringify(buildOpenAIImageRequestBody(options.input)),
|
|
155
|
-
signal: controller.signal,
|
|
156
|
-
});
|
|
157
|
-
const text = await response.text();
|
|
158
|
-
const body = text ? parseJsonObject(text) : {};
|
|
159
|
-
if (!response.ok) {
|
|
160
|
-
throw new Error(`OpenAI image generation HTTP ${response.status}: ${openAIErrorMessage(body) ?? text.slice(0, 1000)}`);
|
|
161
|
-
}
|
|
162
|
-
return body;
|
|
163
|
-
}
|
|
164
|
-
finally {
|
|
165
|
-
clearTimeout(timeout);
|
|
166
|
-
options.signal?.removeEventListener("abort", abort);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
function buildOpenAIImageRequestBody(input) {
|
|
170
|
-
return dropUndefined({
|
|
171
|
-
model: input.model,
|
|
172
|
-
prompt: input.prompt,
|
|
173
|
-
n: input.n ?? 1,
|
|
174
|
-
size: input.size ?? "auto",
|
|
175
|
-
quality: input.quality ?? "auto",
|
|
176
|
-
output_format: input.outputFormat ?? "png",
|
|
177
|
-
background: input.background === "auto" ? undefined : input.background,
|
|
178
|
-
moderation: input.moderation === "auto" ? undefined : input.moderation,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
function imageGenerationTiming(startedAt, finishedAt = Date.now()) {
|
|
182
|
-
const duration = Math.max(0, finishedAt - startedAt);
|
|
183
|
-
return {
|
|
184
|
-
startedAt,
|
|
185
|
-
startedAtIso: new Date(startedAt).toISOString(),
|
|
186
|
-
finishedAt,
|
|
187
|
-
finishedAtIso: new Date(finishedAt).toISOString(),
|
|
188
|
-
duration,
|
|
189
|
-
elapsed: duration,
|
|
190
|
-
durationMs: duration,
|
|
191
|
-
elapsedMs: duration,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
function createImageGenerationToolResultMessage(result, toolUseId) {
|
|
195
|
-
const output = result.output;
|
|
196
|
-
const blocks = [{
|
|
197
|
-
type: "tool_result",
|
|
198
|
-
toolUseId,
|
|
199
|
-
name: "image2",
|
|
200
|
-
ok: result.ok,
|
|
201
|
-
output: compactImageGenerationOutput(output),
|
|
202
|
-
}];
|
|
203
|
-
if (result.ok && isImageGenerationToolOutput(output)) {
|
|
204
|
-
for (const image of output.images) {
|
|
205
|
-
blocks.push({ type: "image", mimeType: image.mimeType, data: image.base64, label: `Generated image ${image.index + 1}` });
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return {
|
|
209
|
-
id: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,
|
|
210
|
-
role: "tool_result",
|
|
211
|
-
createdAt: new Date().toISOString(),
|
|
212
|
-
blocks,
|
|
213
|
-
metadata: result.ok ? { generatedImages: true, tool: "image2" } : undefined,
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
function compactImageGenerationOutput(output) {
|
|
217
|
-
if (!isImageGenerationToolOutput(output))
|
|
218
|
-
return output;
|
|
219
|
-
return {
|
|
220
|
-
...output,
|
|
221
|
-
images: output.images.map((image) => ({
|
|
222
|
-
...image,
|
|
223
|
-
base64: `[base64 image omitted from model context; image ${image.index}, ${image.mimeType}]`,
|
|
224
|
-
dataUrl: `[data URL omitted from model context; image ${image.index}, ${image.mimeType}]`,
|
|
225
|
-
})),
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
function isImageGenerationToolOutput(value) {
|
|
229
|
-
return isRecord(value) && value.provider === "openai" && Array.isArray(value.images);
|
|
230
|
-
}
|
|
231
|
-
function extractGeneratedImages(response, format) {
|
|
232
|
-
const data = Array.isArray(response.data) ? response.data : [];
|
|
233
|
-
return data.flatMap((item, index) => {
|
|
234
|
-
if (!isRecord(item))
|
|
235
|
-
return [];
|
|
236
|
-
const base64 = stringFrom(item.b64_json ?? item.image_base64 ?? item.base64_json ?? item.base64);
|
|
237
|
-
if (!base64)
|
|
238
|
-
return [];
|
|
239
|
-
const mimeType = `image/${format === "jpg" ? "jpeg" : format}`;
|
|
240
|
-
return [{
|
|
241
|
-
index,
|
|
242
|
-
mimeType,
|
|
243
|
-
base64,
|
|
244
|
-
dataUrl: `data:${mimeType};base64,${base64}`,
|
|
245
|
-
revisedPrompt: stringFrom(item.revised_prompt),
|
|
246
|
-
}];
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
function resolveApiKey(configured) {
|
|
250
|
-
return configured?.trim() || process.env.OPENAI_IMAGE_API_KEY?.trim() || process.env.OPENAI_API_KEY?.trim() || undefined;
|
|
251
|
-
}
|
|
252
|
-
function stripTrailingSlash(value) {
|
|
253
|
-
return value.replace(/\/+$/, "");
|
|
254
|
-
}
|
|
255
|
-
function parsePositiveNumber(value) {
|
|
256
|
-
if (!value)
|
|
257
|
-
return undefined;
|
|
258
|
-
const parsed = Number(value);
|
|
259
|
-
return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
|
|
260
|
-
}
|
|
261
|
-
function parseJsonObject(text) {
|
|
262
|
-
try {
|
|
263
|
-
const value = JSON.parse(text);
|
|
264
|
-
return isRecord(value) ? value : { value };
|
|
265
|
-
}
|
|
266
|
-
catch {
|
|
267
|
-
return { text };
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
function openAIErrorMessage(body) {
|
|
271
|
-
const error = isRecord(body.error) ? body.error : undefined;
|
|
272
|
-
return stringFrom(error?.message);
|
|
273
|
-
}
|
|
274
|
-
function compactRawResponse(response) {
|
|
275
|
-
const data = Array.isArray(response.data) ? response.data : undefined;
|
|
276
|
-
return {
|
|
277
|
-
...response,
|
|
278
|
-
data: data?.map((item) => {
|
|
279
|
-
if (!isRecord(item))
|
|
280
|
-
return item;
|
|
281
|
-
return {
|
|
282
|
-
...item,
|
|
283
|
-
b64_json: item.b64_json ? "[base64 image omitted]" : undefined,
|
|
284
|
-
image_base64: item.image_base64 ? "[base64 image omitted]" : undefined,
|
|
285
|
-
base64_json: item.base64_json ? "[base64 image omitted]" : undefined,
|
|
286
|
-
base64: item.base64 ? "[base64 image omitted]" : undefined,
|
|
287
|
-
};
|
|
288
|
-
}),
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
function dropUndefined(value) {
|
|
292
|
-
return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
|
|
293
|
-
}
|
|
294
|
-
function stringFrom(value) {
|
|
295
|
-
return typeof value === "string" ? value : undefined;
|
|
296
|
-
}
|
|
297
|
-
function isRecord(value) {
|
|
298
|
-
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
299
|
-
}
|
|
300
|
-
function isImageSize(value) {
|
|
301
|
-
return value === "auto" || value === "1024x1024" || value === "1536x1024" || value === "1024x1536";
|
|
302
|
-
}
|
|
303
|
-
function isImageQuality(value) {
|
|
304
|
-
return value === "auto" || value === "low" || value === "medium" || value === "high";
|
|
305
|
-
}
|
|
306
|
-
function isImageFormat(value) {
|
|
307
|
-
return value === "png" || value === "jpeg" || value === "webp";
|
|
308
|
-
}
|
|
309
|
-
function isImageBackground(value) {
|
|
310
|
-
return value === "auto" || value === "transparent" || value === "opaque";
|
|
311
|
-
}
|
|
312
|
-
function isImageModeration(value) {
|
|
313
|
-
return value === "auto" || value === "low";
|
|
314
|
-
}
|
|
315
|
-
//# sourceMappingURL=image-generation-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image-generation-tool.js","sourceRoot":"","sources":["../../../src/tools/builtins/image-generation-tool.ts"],"names":[],"mappings":"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"}
|