neoctl 0.1.13 → 0.1.14
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 +103 -0
- package/dist/context/prompts.js +4 -0
- package/dist/context/prompts.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/repl/index.js +11 -0
- package/dist/repl/index.js.map +1 -1
- package/dist/session/simple-session-runtime.d.ts +74 -0
- package/dist/session/simple-session-runtime.js +171 -0
- package/dist/session/simple-session-runtime.js.map +1 -0
- package/dist/tools/builtins/image-generation-tool.d.ts +51 -0
- package/dist/tools/builtins/image-generation-tool.js +298 -0
- package/dist/tools/builtins/image-generation-tool.js.map +1 -0
- package/dist/tools/registry.d.ts +1 -0
- package/dist/tools/registry.js +11 -0
- 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/tool.d.ts +1 -1
- package/dist/ui/display-message.d.ts +101 -0
- package/dist/ui/display-message.js +113 -0
- package/dist/ui/display-message.js.map +1 -0
- package/dist/web/index.js +11 -0
- package/dist/web/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { QueryEngineOptions } from "../core/query-engine.js";
|
|
2
|
+
import { QueryEngine } from "../core/query-engine.js";
|
|
3
|
+
import type { AgentEvent } from "../types/events.js";
|
|
4
|
+
import type { Message, MessageBlock } from "../types/messages.js";
|
|
5
|
+
import type { DisplayAgentEvent, DisplayImageAttachment, DisplayMessage, DisplayMessageOptions } from "../ui/display-message.js";
|
|
6
|
+
import type { SessionStoreSnapshot, SessionSummary } from "./session-store.js";
|
|
7
|
+
export type SimpleSessionRuntimeEventListener = (event: AgentEvent, context: SimpleSessionRuntimeEventContext) => void | Promise<void>;
|
|
8
|
+
export type SimpleSessionRuntimeDisplayEventListener = (event: DisplayAgentEvent, context: SimpleSessionRuntimeEventContext) => void | Promise<void>;
|
|
9
|
+
export interface SimpleSessionRuntimeEventContext {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SimpleSessionRuntimeOptions extends Omit<QueryEngineOptions, "session"> {
|
|
13
|
+
/**
|
|
14
|
+
* Base directory for all sessions managed by this runtime.
|
|
15
|
+
* For simple multi-user isolation, create one runtime per user or pass a per-user rootDir.
|
|
16
|
+
*/
|
|
17
|
+
sessionRootDir?: string;
|
|
18
|
+
session?: Omit<NonNullable<QueryEngineOptions["session"]>, "sessionId" | "rootDir" | "resume">;
|
|
19
|
+
}
|
|
20
|
+
export interface SimpleSessionRuntimeGetOptions {
|
|
21
|
+
/** Resume transcript when the engine is first created. Defaults to true. */
|
|
22
|
+
resume?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface SimpleSessionRuntimeNewSessionOptions {
|
|
25
|
+
/** Optional concrete session id. If omitted, QueryEngine creates one. */
|
|
26
|
+
sessionId?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SimpleSessionRuntimeSendOptions {
|
|
29
|
+
abortSignal?: AbortSignal;
|
|
30
|
+
blocks?: MessageBlock[];
|
|
31
|
+
displayText?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Behavior when another send is already running for the same session.
|
|
34
|
+
* Defaults to "reject".
|
|
35
|
+
*/
|
|
36
|
+
busyBehavior?: "reject" | "interrupt";
|
|
37
|
+
}
|
|
38
|
+
export interface SimpleSessionRuntimeSnapshot {
|
|
39
|
+
activeSessions: string[];
|
|
40
|
+
busySessions: string[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Lightweight session runtime for simple web/Vue integrations.
|
|
44
|
+
*
|
|
45
|
+
* It keeps exactly one active QueryEngine per session id, rejects concurrent writes
|
|
46
|
+
* to the same session by default, and can broadcast sendUserText events to listeners.
|
|
47
|
+
* Existing QueryEngine and SessionStore behavior is not changed.
|
|
48
|
+
*/
|
|
49
|
+
export declare class SimpleSessionRuntime {
|
|
50
|
+
private readonly options;
|
|
51
|
+
private readonly engines;
|
|
52
|
+
private readonly busy;
|
|
53
|
+
private readonly controllers;
|
|
54
|
+
private readonly listeners;
|
|
55
|
+
private readonly displayListeners;
|
|
56
|
+
constructor(options: SimpleSessionRuntimeOptions);
|
|
57
|
+
getOrCreateEngine(sessionId: string, options?: SimpleSessionRuntimeGetOptions): Promise<QueryEngine>;
|
|
58
|
+
newSession(options?: SimpleSessionRuntimeNewSessionOptions): Promise<SessionStoreSnapshot>;
|
|
59
|
+
resumeSession(sessionId: string): Promise<SessionStoreSnapshot>;
|
|
60
|
+
listSessions(limit?: number): Promise<SessionSummary[]>;
|
|
61
|
+
deleteSession(sessionId: string): Promise<boolean>;
|
|
62
|
+
getMessages(sessionId: string): Promise<Message[]>;
|
|
63
|
+
getDisplayMessages(sessionId: string, options?: DisplayMessageOptions): Promise<DisplayMessage[]>;
|
|
64
|
+
getDisplayImages(sessionId: string, options?: DisplayMessageOptions): Promise<DisplayImageAttachment[]>;
|
|
65
|
+
sendUserText(sessionId: string, text: string, options?: SimpleSessionRuntimeSendOptions): AsyncGenerator<AgentEvent>;
|
|
66
|
+
abort(sessionId: string): boolean;
|
|
67
|
+
isBusy(sessionId: string): boolean;
|
|
68
|
+
onEvent(listener: SimpleSessionRuntimeEventListener): () => void;
|
|
69
|
+
onDisplayEvent(listener: SimpleSessionRuntimeDisplayEventListener, options?: DisplayMessageOptions): () => void;
|
|
70
|
+
release(sessionId: string): void;
|
|
71
|
+
snapshot(): SimpleSessionRuntimeSnapshot;
|
|
72
|
+
private createEngine;
|
|
73
|
+
private emit;
|
|
74
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { QueryEngine } from "../core/query-engine.js";
|
|
2
|
+
import { extractMessageImages, toDisplayAgentEvent, toDisplayMessages } from "../ui/display-message.js";
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight session runtime for simple web/Vue integrations.
|
|
5
|
+
*
|
|
6
|
+
* It keeps exactly one active QueryEngine per session id, rejects concurrent writes
|
|
7
|
+
* to the same session by default, and can broadcast sendUserText events to listeners.
|
|
8
|
+
* Existing QueryEngine and SessionStore behavior is not changed.
|
|
9
|
+
*/
|
|
10
|
+
export class SimpleSessionRuntime {
|
|
11
|
+
options;
|
|
12
|
+
engines = new Map();
|
|
13
|
+
busy = new Set();
|
|
14
|
+
controllers = new Map();
|
|
15
|
+
listeners = new Set();
|
|
16
|
+
displayListeners = new Set();
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
async getOrCreateEngine(sessionId, options = {}) {
|
|
21
|
+
const normalizedSessionId = normalizeSessionId(sessionId);
|
|
22
|
+
const existing = this.engines.get(normalizedSessionId);
|
|
23
|
+
if (existing) {
|
|
24
|
+
await existing.initialized;
|
|
25
|
+
return existing.engine;
|
|
26
|
+
}
|
|
27
|
+
const engine = this.createEngine(normalizedSessionId, options.resume ?? true);
|
|
28
|
+
const initialized = engine.initialize();
|
|
29
|
+
const managed = { engine, initialized };
|
|
30
|
+
this.engines.set(normalizedSessionId, managed);
|
|
31
|
+
try {
|
|
32
|
+
await initialized;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
this.engines.delete(normalizedSessionId);
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
return engine;
|
|
39
|
+
}
|
|
40
|
+
async newSession(options = {}) {
|
|
41
|
+
const engine = this.createEngine(options.sessionId, false);
|
|
42
|
+
const snapshot = await engine.newSession();
|
|
43
|
+
this.engines.set(snapshot.sessionId, { engine, initialized: Promise.resolve() });
|
|
44
|
+
return snapshot;
|
|
45
|
+
}
|
|
46
|
+
async resumeSession(sessionId) {
|
|
47
|
+
const engine = await this.getOrCreateEngine(sessionId, { resume: true });
|
|
48
|
+
const snapshot = engine.snapshot().session;
|
|
49
|
+
if (!snapshot)
|
|
50
|
+
throw new Error("session transcripts are disabled");
|
|
51
|
+
return snapshot;
|
|
52
|
+
}
|
|
53
|
+
async listSessions(limit = 20) {
|
|
54
|
+
const engine = this.createEngine(undefined, false);
|
|
55
|
+
return engine.listSessions(limit);
|
|
56
|
+
}
|
|
57
|
+
async deleteSession(sessionId) {
|
|
58
|
+
const normalizedSessionId = normalizeSessionId(sessionId);
|
|
59
|
+
if (this.busy.has(normalizedSessionId))
|
|
60
|
+
throw new Error(`session is busy: ${normalizedSessionId}`);
|
|
61
|
+
this.abort(normalizedSessionId);
|
|
62
|
+
this.engines.delete(normalizedSessionId);
|
|
63
|
+
const engine = this.createEngine(undefined, false);
|
|
64
|
+
return engine.deleteSession(normalizedSessionId);
|
|
65
|
+
}
|
|
66
|
+
async getMessages(sessionId) {
|
|
67
|
+
const engine = await this.getOrCreateEngine(sessionId, { resume: true });
|
|
68
|
+
return engine.getHistoryMessages();
|
|
69
|
+
}
|
|
70
|
+
async getDisplayMessages(sessionId, options = {}) {
|
|
71
|
+
return toDisplayMessages(await this.getMessages(sessionId), options);
|
|
72
|
+
}
|
|
73
|
+
async getDisplayImages(sessionId, options = { imageMode: "data-url" }) {
|
|
74
|
+
return extractMessageImages(await this.getMessages(sessionId), options);
|
|
75
|
+
}
|
|
76
|
+
async *sendUserText(sessionId, text, options = {}) {
|
|
77
|
+
const normalizedSessionId = normalizeSessionId(sessionId);
|
|
78
|
+
if (this.busy.has(normalizedSessionId)) {
|
|
79
|
+
if (options.busyBehavior === "interrupt") {
|
|
80
|
+
this.abort(normalizedSessionId);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
throw new Error(`session is busy: ${normalizedSessionId}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const engine = await this.getOrCreateEngine(normalizedSessionId, { resume: true });
|
|
87
|
+
const controller = new AbortController();
|
|
88
|
+
const externalAbort = options.abortSignal;
|
|
89
|
+
const abortFromExternal = () => controller.abort(externalAbort?.reason);
|
|
90
|
+
if (externalAbort?.aborted)
|
|
91
|
+
abortFromExternal();
|
|
92
|
+
else
|
|
93
|
+
externalAbort?.addEventListener("abort", abortFromExternal, { once: true });
|
|
94
|
+
this.busy.add(normalizedSessionId);
|
|
95
|
+
this.controllers.set(normalizedSessionId, controller);
|
|
96
|
+
try {
|
|
97
|
+
for await (const event of engine.sendUserText(text, {
|
|
98
|
+
abortSignal: controller.signal,
|
|
99
|
+
blocks: options.blocks,
|
|
100
|
+
displayText: options.displayText,
|
|
101
|
+
})) {
|
|
102
|
+
await this.emit(event, { sessionId: normalizedSessionId });
|
|
103
|
+
yield event;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
externalAbort?.removeEventListener("abort", abortFromExternal);
|
|
108
|
+
if (this.controllers.get(normalizedSessionId) === controller)
|
|
109
|
+
this.controllers.delete(normalizedSessionId);
|
|
110
|
+
this.busy.delete(normalizedSessionId);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
abort(sessionId) {
|
|
114
|
+
const controller = this.controllers.get(normalizeSessionId(sessionId));
|
|
115
|
+
if (!controller)
|
|
116
|
+
return false;
|
|
117
|
+
controller.abort();
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
isBusy(sessionId) {
|
|
121
|
+
return this.busy.has(normalizeSessionId(sessionId));
|
|
122
|
+
}
|
|
123
|
+
onEvent(listener) {
|
|
124
|
+
this.listeners.add(listener);
|
|
125
|
+
return () => this.listeners.delete(listener);
|
|
126
|
+
}
|
|
127
|
+
onDisplayEvent(listener, options = { imageMode: "data-url" }) {
|
|
128
|
+
const entry = { listener, options };
|
|
129
|
+
this.displayListeners.add(entry);
|
|
130
|
+
return () => this.displayListeners.delete(entry);
|
|
131
|
+
}
|
|
132
|
+
release(sessionId) {
|
|
133
|
+
const normalizedSessionId = normalizeSessionId(sessionId);
|
|
134
|
+
this.abort(normalizedSessionId);
|
|
135
|
+
this.engines.delete(normalizedSessionId);
|
|
136
|
+
this.busy.delete(normalizedSessionId);
|
|
137
|
+
}
|
|
138
|
+
snapshot() {
|
|
139
|
+
return {
|
|
140
|
+
activeSessions: [...this.engines.keys()],
|
|
141
|
+
busySessions: [...this.busy],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
createEngine(sessionId, resume) {
|
|
145
|
+
return new QueryEngine({
|
|
146
|
+
...this.options,
|
|
147
|
+
session: {
|
|
148
|
+
...this.options.session,
|
|
149
|
+
enabled: this.options.session?.enabled ?? true,
|
|
150
|
+
rootDir: this.options.sessionRootDir,
|
|
151
|
+
sessionId,
|
|
152
|
+
resume,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
async emit(event, context) {
|
|
157
|
+
for (const listener of this.listeners) {
|
|
158
|
+
await listener(event, context);
|
|
159
|
+
}
|
|
160
|
+
for (const { listener, options } of this.displayListeners) {
|
|
161
|
+
await listener(toDisplayAgentEvent(event, options), context);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function normalizeSessionId(sessionId) {
|
|
166
|
+
const normalized = sessionId.trim();
|
|
167
|
+
if (!normalized)
|
|
168
|
+
throw new Error("sessionId is required");
|
|
169
|
+
return normalized;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=simple-session-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-session-runtime.js","sourceRoot":"","sources":["../../src/session/simple-session-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
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 ImageGenerationToolOutput {
|
|
26
|
+
provider: "openai";
|
|
27
|
+
model: string;
|
|
28
|
+
prompt: string;
|
|
29
|
+
size: ImageGenerationSize;
|
|
30
|
+
quality: ImageGenerationQuality;
|
|
31
|
+
outputFormat: ImageGenerationFormat;
|
|
32
|
+
background: ImageGenerationBackground;
|
|
33
|
+
returnedImages: number;
|
|
34
|
+
images: ImageGenerationResult[];
|
|
35
|
+
raw?: unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface CreateOpenAIImageGenerationToolOptions {
|
|
38
|
+
apiKey?: string;
|
|
39
|
+
baseUrl?: string;
|
|
40
|
+
model?: string;
|
|
41
|
+
timeoutMs?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* OpenAI-only image generation tool backed by the Images API.
|
|
45
|
+
*
|
|
46
|
+
* The tool is intentionally exposed only when MODEL_PROVIDER=openai. Other providers
|
|
47
|
+
* should not receive a drawable tool definition; the default system prompt tells the
|
|
48
|
+
* model that image generation is unavailable in that configuration.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createOpenAIImageGenerationTool(options?: CreateOpenAIImageGenerationToolOptions): Tool<ImageGenerationToolInput>;
|
|
51
|
+
export declare const openAIImageGenerationTool: Tool<ImageGenerationToolInput>;
|
|
@@ -0,0 +1,298 @@
|
|
|
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
|
+
try {
|
|
90
|
+
const response = await callOpenAIImageGeneration({
|
|
91
|
+
apiKey,
|
|
92
|
+
baseUrl,
|
|
93
|
+
timeoutMs,
|
|
94
|
+
signal: context.abortSignal,
|
|
95
|
+
input: { ...input, model },
|
|
96
|
+
});
|
|
97
|
+
const images = extractGeneratedImages(response, input.outputFormat ?? "png");
|
|
98
|
+
const output = {
|
|
99
|
+
provider: "openai",
|
|
100
|
+
model,
|
|
101
|
+
prompt: input.prompt,
|
|
102
|
+
size: input.size ?? "auto",
|
|
103
|
+
quality: input.quality ?? "auto",
|
|
104
|
+
outputFormat: input.outputFormat ?? "png",
|
|
105
|
+
background: input.background ?? "auto",
|
|
106
|
+
returnedImages: images.length,
|
|
107
|
+
images,
|
|
108
|
+
raw: compactRawResponse(response),
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
ok: images.length > 0,
|
|
112
|
+
output,
|
|
113
|
+
summary: images.length ? `${images.length} image(s) generated` : "OpenAI returned no image data",
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
return {
|
|
118
|
+
ok: false,
|
|
119
|
+
output: {
|
|
120
|
+
provider: "openai",
|
|
121
|
+
model,
|
|
122
|
+
prompt: input.prompt,
|
|
123
|
+
error: error instanceof Error ? error.message : String(error),
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
mapResult(result) {
|
|
129
|
+
return compactImageGenerationOutput(result.output);
|
|
130
|
+
},
|
|
131
|
+
renderToolResultMessage(result, request) {
|
|
132
|
+
return createImageGenerationToolResultMessage(result, request?.id ?? "");
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export const openAIImageGenerationTool = createOpenAIImageGenerationTool();
|
|
137
|
+
async function callOpenAIImageGeneration(options) {
|
|
138
|
+
const controller = new AbortController();
|
|
139
|
+
const abort = () => controller.abort(options.signal?.reason);
|
|
140
|
+
const timeout = setTimeout(() => controller.abort(new Error(`Image generation request timed out after ${options.timeoutMs}ms`)), options.timeoutMs);
|
|
141
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
142
|
+
try {
|
|
143
|
+
const response = await fetch(`${options.baseUrl}/v1/images/generations`, {
|
|
144
|
+
method: "POST",
|
|
145
|
+
headers: {
|
|
146
|
+
Accept: "application/json",
|
|
147
|
+
"Content-Type": "application/json",
|
|
148
|
+
Authorization: `Bearer ${options.apiKey}`,
|
|
149
|
+
},
|
|
150
|
+
body: JSON.stringify(buildOpenAIImageRequestBody(options.input)),
|
|
151
|
+
signal: controller.signal,
|
|
152
|
+
});
|
|
153
|
+
const text = await response.text();
|
|
154
|
+
const body = text ? parseJsonObject(text) : {};
|
|
155
|
+
if (!response.ok) {
|
|
156
|
+
throw new Error(`OpenAI image generation HTTP ${response.status}: ${openAIErrorMessage(body) ?? text.slice(0, 1000)}`);
|
|
157
|
+
}
|
|
158
|
+
return body;
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
clearTimeout(timeout);
|
|
162
|
+
options.signal?.removeEventListener("abort", abort);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function buildOpenAIImageRequestBody(input) {
|
|
166
|
+
return dropUndefined({
|
|
167
|
+
model: input.model,
|
|
168
|
+
prompt: input.prompt,
|
|
169
|
+
n: input.n ?? 1,
|
|
170
|
+
size: input.size ?? "auto",
|
|
171
|
+
quality: input.quality ?? "auto",
|
|
172
|
+
output_format: input.outputFormat ?? "png",
|
|
173
|
+
background: input.background === "auto" ? undefined : input.background,
|
|
174
|
+
moderation: input.moderation === "auto" ? undefined : input.moderation,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
function createImageGenerationToolResultMessage(result, toolUseId) {
|
|
178
|
+
const output = result.output;
|
|
179
|
+
const blocks = [{
|
|
180
|
+
type: "tool_result",
|
|
181
|
+
toolUseId,
|
|
182
|
+
name: "image2",
|
|
183
|
+
ok: result.ok,
|
|
184
|
+
output: compactImageGenerationOutput(output),
|
|
185
|
+
}];
|
|
186
|
+
if (result.ok && isImageGenerationToolOutput(output)) {
|
|
187
|
+
for (const image of output.images) {
|
|
188
|
+
blocks.push({ type: "image", mimeType: image.mimeType, data: image.base64, label: `Generated image ${image.index + 1}` });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
id: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,
|
|
193
|
+
role: "tool_result",
|
|
194
|
+
createdAt: new Date().toISOString(),
|
|
195
|
+
blocks,
|
|
196
|
+
metadata: result.ok ? { generatedImages: true, tool: "image2" } : undefined,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function compactImageGenerationOutput(output) {
|
|
200
|
+
if (!isImageGenerationToolOutput(output))
|
|
201
|
+
return output;
|
|
202
|
+
return {
|
|
203
|
+
...output,
|
|
204
|
+
images: output.images.map((image) => ({
|
|
205
|
+
...image,
|
|
206
|
+
base64: `[base64 image omitted from model context; image ${image.index}, ${image.mimeType}]`,
|
|
207
|
+
dataUrl: `[data URL omitted from model context; image ${image.index}, ${image.mimeType}]`,
|
|
208
|
+
})),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function isImageGenerationToolOutput(value) {
|
|
212
|
+
return isRecord(value) && value.provider === "openai" && Array.isArray(value.images);
|
|
213
|
+
}
|
|
214
|
+
function extractGeneratedImages(response, format) {
|
|
215
|
+
const data = Array.isArray(response.data) ? response.data : [];
|
|
216
|
+
return data.flatMap((item, index) => {
|
|
217
|
+
if (!isRecord(item))
|
|
218
|
+
return [];
|
|
219
|
+
const base64 = stringFrom(item.b64_json ?? item.image_base64 ?? item.base64_json ?? item.base64);
|
|
220
|
+
if (!base64)
|
|
221
|
+
return [];
|
|
222
|
+
const mimeType = `image/${format === "jpg" ? "jpeg" : format}`;
|
|
223
|
+
return [{
|
|
224
|
+
index,
|
|
225
|
+
mimeType,
|
|
226
|
+
base64,
|
|
227
|
+
dataUrl: `data:${mimeType};base64,${base64}`,
|
|
228
|
+
revisedPrompt: stringFrom(item.revised_prompt),
|
|
229
|
+
}];
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
function resolveApiKey(configured) {
|
|
233
|
+
return configured?.trim() || process.env.OPENAI_IMAGE_API_KEY?.trim() || process.env.OPENAI_API_KEY?.trim() || undefined;
|
|
234
|
+
}
|
|
235
|
+
function stripTrailingSlash(value) {
|
|
236
|
+
return value.replace(/\/+$/, "");
|
|
237
|
+
}
|
|
238
|
+
function parsePositiveNumber(value) {
|
|
239
|
+
if (!value)
|
|
240
|
+
return undefined;
|
|
241
|
+
const parsed = Number(value);
|
|
242
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
|
|
243
|
+
}
|
|
244
|
+
function parseJsonObject(text) {
|
|
245
|
+
try {
|
|
246
|
+
const value = JSON.parse(text);
|
|
247
|
+
return isRecord(value) ? value : { value };
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return { text };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function openAIErrorMessage(body) {
|
|
254
|
+
const error = isRecord(body.error) ? body.error : undefined;
|
|
255
|
+
return stringFrom(error?.message);
|
|
256
|
+
}
|
|
257
|
+
function compactRawResponse(response) {
|
|
258
|
+
const data = Array.isArray(response.data) ? response.data : undefined;
|
|
259
|
+
return {
|
|
260
|
+
...response,
|
|
261
|
+
data: data?.map((item) => {
|
|
262
|
+
if (!isRecord(item))
|
|
263
|
+
return item;
|
|
264
|
+
return {
|
|
265
|
+
...item,
|
|
266
|
+
b64_json: item.b64_json ? "[base64 image omitted]" : undefined,
|
|
267
|
+
image_base64: item.image_base64 ? "[base64 image omitted]" : undefined,
|
|
268
|
+
base64_json: item.base64_json ? "[base64 image omitted]" : undefined,
|
|
269
|
+
base64: item.base64 ? "[base64 image omitted]" : undefined,
|
|
270
|
+
};
|
|
271
|
+
}),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function dropUndefined(value) {
|
|
275
|
+
return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
|
|
276
|
+
}
|
|
277
|
+
function stringFrom(value) {
|
|
278
|
+
return typeof value === "string" ? value : undefined;
|
|
279
|
+
}
|
|
280
|
+
function isRecord(value) {
|
|
281
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
282
|
+
}
|
|
283
|
+
function isImageSize(value) {
|
|
284
|
+
return value === "auto" || value === "1024x1024" || value === "1536x1024" || value === "1024x1536";
|
|
285
|
+
}
|
|
286
|
+
function isImageQuality(value) {
|
|
287
|
+
return value === "auto" || value === "low" || value === "medium" || value === "high";
|
|
288
|
+
}
|
|
289
|
+
function isImageFormat(value) {
|
|
290
|
+
return value === "png" || value === "jpeg" || value === "webp";
|
|
291
|
+
}
|
|
292
|
+
function isImageBackground(value) {
|
|
293
|
+
return value === "auto" || value === "transparent" || value === "opaque";
|
|
294
|
+
}
|
|
295
|
+
function isImageModeration(value) {
|
|
296
|
+
return value === "auto" || value === "low";
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=image-generation-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-generation-tool.js","sourceRoot":"","sources":["../../../src/tools/builtins/image-generation-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/registry.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare class ToolRegistry {
|
|
|
10
10
|
register(tool: Tool<any>): void;
|
|
11
11
|
get(name: string): Tool<any> | undefined;
|
|
12
12
|
getByAlias(name: string): Tool<any> | undefined;
|
|
13
|
+
unregister(name: string): boolean;
|
|
13
14
|
definitions(context?: ToolUseContext, options?: ToolPoolOptions): ToolDefinition[];
|
|
14
15
|
names(): string[];
|
|
15
16
|
list(context?: ToolUseContext, options?: ToolPoolOptions): Tool<any>[];
|
package/dist/tools/registry.js
CHANGED
|
@@ -19,6 +19,17 @@ export class ToolRegistry {
|
|
|
19
19
|
const canonical = this.aliases.get(name);
|
|
20
20
|
return canonical ? this.tools.get(canonical) : undefined;
|
|
21
21
|
}
|
|
22
|
+
unregister(name) {
|
|
23
|
+
const tool = this.tools.get(name);
|
|
24
|
+
if (!tool)
|
|
25
|
+
return false;
|
|
26
|
+
this.tools.delete(name);
|
|
27
|
+
for (const alias of tool.aliases ?? []) {
|
|
28
|
+
if (this.aliases.get(alias) === name)
|
|
29
|
+
this.aliases.delete(alias);
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
22
33
|
definitions(context, options = {}) {
|
|
23
34
|
return this.visibleTools(context, options).map((tool) => ({
|
|
24
35
|
name: tool.name,
|