call-ai 0.18.16-dev → 0.18.18-dev
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/image.js +97 -66
- package/image.js.map +1 -1
- package/package.json +9 -3
- package/types.d.ts +0 -1
package/image.js
CHANGED
|
@@ -1,80 +1,111 @@
|
|
|
1
1
|
import { callAiFetch, joinUrlParts } from "./utils.js";
|
|
2
2
|
import { callAiEnv } from "./env.js";
|
|
3
|
+
import { PACKAGE_VERSION } from "./version.js";
|
|
3
4
|
export async function imageGen(prompt, options = {}) {
|
|
4
|
-
const { model = "gpt-image-1", apiKey = callAiEnv.CALLAI_API_KEY, size = "1024x1024" } = options;
|
|
5
|
+
const { model = "gpt-image-1", apiKey = callAiEnv.CALLAI_API_KEY, debug = false, size = "1024x1024" } = options;
|
|
5
6
|
if (!apiKey) {
|
|
6
7
|
throw new Error("API key is required for image generation. Provide via options.apiKey or set window.CALLAI_API_KEY");
|
|
7
8
|
}
|
|
9
|
+
if (debug) {
|
|
10
|
+
console.log(`[imageGen:${PACKAGE_VERSION}] Generating image with prompt: ${prompt.substring(0, 50)}...`);
|
|
11
|
+
console.log(`[imageGen:${PACKAGE_VERSION}] Using model: ${model}`);
|
|
12
|
+
}
|
|
8
13
|
const customOrigin = options.imgUrl || callAiEnv.CALLAI_IMG_URL;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
14
|
+
try {
|
|
15
|
+
if (!options.images || options.images.length === 0) {
|
|
16
|
+
const origin = customOrigin || callAiEnv.def.CALLAI_CHAT_URL;
|
|
17
|
+
const generateEndpoint = joinUrlParts(origin, "/api/openai-image/generate");
|
|
18
|
+
if (!apiKey) {
|
|
19
|
+
throw new Error("API key is required for image generation (simple)");
|
|
20
|
+
}
|
|
21
|
+
const headers = new Headers({
|
|
22
|
+
Authorization: `Bearer ${apiKey}`,
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
});
|
|
25
|
+
const response = await callAiFetch(options)(generateEndpoint, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers,
|
|
28
|
+
body: JSON.stringify({
|
|
29
|
+
model,
|
|
30
|
+
prompt,
|
|
31
|
+
size,
|
|
32
|
+
...(options.quality && { quality: options.quality }),
|
|
33
|
+
...(options.style && { style: options.style }),
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
const errorData = await response.text();
|
|
38
|
+
throw new Error(`Image generation failed: ${response.status} ${response.statusText} - ${errorData}`);
|
|
39
|
+
}
|
|
40
|
+
const responseText = await response.text();
|
|
41
|
+
if (debug) {
|
|
42
|
+
console.log(`[imageGen:${PACKAGE_VERSION}] Raw response:`, responseText.substring(0, 500) + "...");
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const result = JSON.parse(responseText);
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
catch (parseError) {
|
|
49
|
+
if (debug) {
|
|
50
|
+
console.error(`[imageGen:${PACKAGE_VERSION}] JSON Parse Error:`, parseError);
|
|
51
|
+
console.error(`[imageGen:${PACKAGE_VERSION}] Response text length:`, responseText.length);
|
|
52
|
+
console.error(`[imageGen:${PACKAGE_VERSION}] Response sample:`, responseText.substring(0, 1000));
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : "Unknown error"}`);
|
|
55
|
+
}
|
|
37
56
|
}
|
|
38
|
-
|
|
39
|
-
|
|
57
|
+
else {
|
|
58
|
+
const formData = new FormData();
|
|
59
|
+
formData.append("model", model);
|
|
60
|
+
formData.append("prompt", prompt);
|
|
61
|
+
options.images.forEach((image, index) => {
|
|
62
|
+
formData.append(`image_${index}`, image);
|
|
63
|
+
});
|
|
64
|
+
formData.append("size", size);
|
|
65
|
+
if (options.quality)
|
|
66
|
+
formData.append("quality", options.quality);
|
|
67
|
+
if (options.style)
|
|
68
|
+
formData.append("style", options.style);
|
|
69
|
+
const origin = customOrigin || callAiEnv.def.CALLAI_CHAT_URL;
|
|
70
|
+
const editEndpoint = joinUrlParts(origin, "/api/openai-image/edit");
|
|
71
|
+
if (!apiKey) {
|
|
72
|
+
throw new Error("API key is required for image generation (edit)");
|
|
73
|
+
}
|
|
74
|
+
const headers = new Headers({
|
|
75
|
+
Authorization: `Bearer ${apiKey}`,
|
|
76
|
+
});
|
|
77
|
+
const response = await callAiFetch(options)(editEndpoint, {
|
|
78
|
+
method: "POST",
|
|
79
|
+
headers,
|
|
80
|
+
body: formData,
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
const errorData = await response.text();
|
|
84
|
+
throw new Error(`Image editing failed: ${response.status} ${response.statusText} - ${errorData}`);
|
|
85
|
+
}
|
|
86
|
+
const responseText = await response.text();
|
|
87
|
+
if (debug) {
|
|
88
|
+
console.log(`[imageGen:${PACKAGE_VERSION}] Raw response:`, responseText.substring(0, 500) + "...");
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const result = JSON.parse(responseText);
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
catch (parseError) {
|
|
95
|
+
if (debug) {
|
|
96
|
+
console.error(`[imageGen:${PACKAGE_VERSION}] JSON Parse Error:`, parseError);
|
|
97
|
+
console.error(`[imageGen:${PACKAGE_VERSION}] Response text length:`, responseText.length);
|
|
98
|
+
console.error(`[imageGen:${PACKAGE_VERSION}] Response sample:`, responseText.substring(0, 1000));
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : "Unknown error"}`);
|
|
101
|
+
}
|
|
40
102
|
}
|
|
41
103
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
formData.append("prompt", prompt);
|
|
46
|
-
options.images.forEach((image, index) => {
|
|
47
|
-
formData.append(`image_${index}`, image);
|
|
48
|
-
});
|
|
49
|
-
formData.append("size", size);
|
|
50
|
-
if (options.quality)
|
|
51
|
-
formData.append("quality", options.quality);
|
|
52
|
-
if (options.style)
|
|
53
|
-
formData.append("style", options.style);
|
|
54
|
-
const editEndpoint = options.endpoint || joinUrlParts(customOrigin || callAiEnv.def.CALLAI_CHAT_URL, "/api/openai-image/edit");
|
|
55
|
-
if (!apiKey) {
|
|
56
|
-
throw new Error("API key is required for image generation (edit)");
|
|
57
|
-
}
|
|
58
|
-
const headers = new Headers({
|
|
59
|
-
Authorization: `Bearer ${apiKey}`,
|
|
60
|
-
});
|
|
61
|
-
const response = await callAiFetch(options)(editEndpoint, {
|
|
62
|
-
method: "POST",
|
|
63
|
-
headers,
|
|
64
|
-
body: formData,
|
|
65
|
-
});
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
const errorData = await response.text();
|
|
68
|
-
throw new Error(`Image editing failed: ${response.status} ${response.statusText} - ${errorData}`);
|
|
69
|
-
}
|
|
70
|
-
const responseText = await response.text();
|
|
71
|
-
try {
|
|
72
|
-
const result = JSON.parse(responseText);
|
|
73
|
-
return result;
|
|
74
|
-
}
|
|
75
|
-
catch (parseError) {
|
|
76
|
-
throw new Error(`Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : "Unknown error"}`);
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (debug) {
|
|
106
|
+
console.error(`[imageGen:${PACKAGE_VERSION}] Error:`, error);
|
|
77
107
|
}
|
|
108
|
+
throw error;
|
|
78
109
|
}
|
|
79
110
|
}
|
|
80
111
|
//# sourceMappingURL=image.js.map
|
package/image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.js","sourceRoot":"","sources":["../jsr/image.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../jsr/image.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "call-ai",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.18-dev",
|
|
4
4
|
"description": "Lightweight library for making AI API calls with streaming support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -25,12 +25,18 @@
|
|
|
25
25
|
"Meno Abels"
|
|
26
26
|
],
|
|
27
27
|
"license": "Apache-2.0",
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@fireproof/core-cli": "^0.23.15",
|
|
30
|
+
"@types/node": "^24.9.1",
|
|
31
|
+
"@vitest/browser-playwright": "^4.0.10",
|
|
32
|
+
"typescript": "^5.9.3"
|
|
33
|
+
},
|
|
28
34
|
"engines": {
|
|
29
35
|
"node": ">=20.0.0"
|
|
30
36
|
},
|
|
31
37
|
"dependencies": {
|
|
32
|
-
"@adviser/cement": "0.
|
|
33
|
-
"@fireproof/core-runtime": "0.
|
|
38
|
+
"@adviser/cement": "^0.4.66",
|
|
39
|
+
"@fireproof/core-runtime": "^0.23.15"
|
|
34
40
|
},
|
|
35
41
|
"scripts": {
|
|
36
42
|
"build": "core-cli tsc"
|