Skip to content

Commit 072e11b

Browse files
authored
Merge pull request #1057 from proteanx/veniceimage
feat: add venice.ai image generation
2 parents 7ad8141 + c425ec8 commit 072e11b

File tree

6 files changed

+49
-4
lines changed

6 files changed

+49
-4
lines changed

.env.example

+1
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ VENICE_API_KEY= # generate from venice settings
230230
SMALL_VENICE_MODEL= # Default: llama-3.3-70b
231231
MEDIUM_VENICE_MODEL= # Default: llama-3.3-70b
232232
LARGE_VENICE_MODEL= # Default: llama-3.1-405b
233+
IMAGE_VENICE_MODEL= # Default: fluently-xl
233234

234235
# fal.ai Configuration
235236
FAL_API_KEY=

agent/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,7 @@ export async function createAgent(
464464
: null,
465465
getSecret(character, "FAL_API_KEY") ||
466466
getSecret(character, "OPENAI_API_KEY") ||
467+
getSecret(character, "VENICE_API_KEY") ||
467468
getSecret(character, "HEURIST_API_KEY")
468469
? imageGenerationPlugin
469470
: null,

packages/core/src/generation.ts

+36-1
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,8 @@ export const generateImage = async (
954954
: (runtime.getSetting("HEURIST_API_KEY") ??
955955
runtime.getSetting("TOGETHER_API_KEY") ??
956956
runtime.getSetting("FAL_API_KEY") ??
957-
runtime.getSetting("OPENAI_API_KEY"));
957+
runtime.getSetting("OPENAI_API_KEY") ??
958+
runtime.getSetting("VENICE_API_KEY"));
958959

959960
try {
960961
if (runtime.imageModelProvider === ModelProviderName.HEURIST) {
@@ -1100,6 +1101,40 @@ export const generateImage = async (
11001101
});
11011102

11021103
const base64s = await Promise.all(base64Promises);
1104+
return { success: true, data: base64s };
1105+
} else if (runtime.imageModelProvider === ModelProviderName.VENICE) {
1106+
const response = await fetch(
1107+
"https://api.venice.ai/api/v1/image/generate",
1108+
{
1109+
method: "POST",
1110+
headers: {
1111+
Authorization: `Bearer ${apiKey}`,
1112+
"Content-Type": "application/json",
1113+
},
1114+
body: JSON.stringify({
1115+
model: data.modelId || "fluently-xl",
1116+
prompt: data.prompt,
1117+
negative_prompt: data.negativePrompt,
1118+
width: data.width || 1024,
1119+
height: data.height || 1024,
1120+
steps: data.numIterations || 20,
1121+
}),
1122+
}
1123+
);
1124+
1125+
const result = await response.json();
1126+
1127+
if (!result.images || !Array.isArray(result.images)) {
1128+
throw new Error("Invalid response format from Venice AI");
1129+
}
1130+
1131+
const base64s = result.images.map((base64String) => {
1132+
if (!base64String) {
1133+
throw new Error("Empty base64 string in Venice AI response");
1134+
}
1135+
return `data:image/png;base64,${base64String}`;
1136+
});
1137+
11031138
return { success: true, data: base64s };
11041139
} else {
11051140
let targetSize = `${data.width}x${data.height}`;

packages/core/src/models.ts

+1
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,7 @@ export const models: Models = {
463463
[ModelClass.SMALL]: settings.SMALL_VENICE_MODEL || "llama-3.3-70b",
464464
[ModelClass.MEDIUM]: settings.MEDIUM_VENICE_MODEL || "llama-3.3-70b",
465465
[ModelClass.LARGE]: settings.LARGE_VENICE_MODEL || "llama-3.1-405b",
466+
[ModelClass.IMAGE]: settings.IMAGE_VENICE_MODEL || "fluently-xl",
466467
},
467468
},
468469
};

packages/plugin-image-generation/src/environment.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const imageGenEnvSchema = z
88
HEURIST_API_KEY: z.string().optional(),
99
FAL_API_KEY: z.string().optional(),
1010
OPENAI_API_KEY: z.string().optional(),
11+
VENICE_API_KEY: z.string().optional(),
1112
})
1213
.refine(
1314
(data) => {
@@ -16,12 +17,13 @@ export const imageGenEnvSchema = z
1617
data.TOGETHER_API_KEY ||
1718
data.HEURIST_API_KEY ||
1819
data.FAL_API_KEY ||
19-
data.OPENAI_API_KEY
20+
data.OPENAI_API_KEY ||
21+
data.VENICE_API_KEY
2022
);
2123
},
2224
{
2325
message:
24-
"At least one of ANTHROPIC_API_KEY, TOGETHER_API_KEY, HEURIST_API_KEY, FAL_API_KEY or OPENAI_API_KEY is required",
26+
"At least one of ANTHROPIC_API_KEY, TOGETHER_API_KEY, HEURIST_API_KEY, FAL_API_KEY, OPENAI_API_KEY or VENICE_API_KEY is required",
2527
}
2628
);
2729

@@ -46,6 +48,9 @@ export async function validateImageGenConfig(
4648
OPENAI_API_KEY:
4749
runtime.getSetting("OPENAI_API_KEY") ||
4850
process.env.OPENAI_API_KEY,
51+
VENICE_API_KEY:
52+
runtime.getSetting("VENICE_API_KEY") ||
53+
process.env.VENICE_API_KEY,
4954
};
5055

5156
return imageGenEnvSchema.parse(config);

packages/plugin-image-generation/src/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,15 @@ const imageGeneration: Action = {
8484
const heuristApiKeyOk = !!runtime.getSetting("HEURIST_API_KEY");
8585
const falApiKeyOk = !!runtime.getSetting("FAL_API_KEY");
8686
const openAiApiKeyOk = !!runtime.getSetting("OPENAI_API_KEY");
87+
const veniceApiKeyOk = !!runtime.getSetting("VENICE_API_KEY");
8788

8889
return (
8990
anthropicApiKeyOk ||
9091
togetherApiKeyOk ||
9192
heuristApiKeyOk ||
9293
falApiKeyOk ||
93-
openAiApiKeyOk
94+
openAiApiKeyOk ||
95+
veniceApiKeyOk
9496
);
9597
},
9698
handler: async (

0 commit comments

Comments
 (0)