@@ -481,10 +524,12 @@ export default function ImageGallery({
if (e.ctrlKey) {
// Ctrl+Enter: Submit and keep prompt for iteration
e.preventDefault();
+ setErrorMessage?.(null); // Clear error message
onLightboxPromptSubmit(lightboxPrompt, images[safeIndex].path);
} else {
// Enter: Submit and clear prompt
e.preventDefault();
+ setErrorMessage?.(null); // Clear error message
onLightboxPromptSubmit(lightboxPrompt, images[safeIndex].path);
setLightboxPrompt('');
}
@@ -500,8 +545,14 @@ export default function ImageGallery({
e.stopPropagation();
e.preventDefault();
navigateHistory('down');
+ } else if (e.key.startsWith('Arrow')) {
+ // Stop all arrow key propagation when textarea is focused (except the Ctrl+ variants above)
+ e.stopPropagation();
+ } else if (e.key === 'Delete' || e.key === 'Backspace') {
+ // Stop Delete and Backspace propagation when textarea is focused
+ // Users should be able to delete text normally without triggering image deletion
+ e.stopPropagation();
}
- // Delete key: Let it bubble up to lightbox handler for image deletion
// Shift+Enter: Allow new line (default textarea behavior)
// All other keys: Normal textarea behavior without interference
}}
@@ -541,6 +592,7 @@ export default function ImageGallery({
onClick={(e) => {
e.stopPropagation();
if (lightboxPrompt.trim() && !isGenerating) {
+ setErrorMessage?.(null); // Clear error message
onLightboxPromptSubmit(lightboxPrompt, images[safeIndex].path);
setLightboxPrompt('');
// Keep lightbox open to show generation progress
@@ -581,14 +633,34 @@ export default function ImageGallery({
{/* Delete Confirmation Dialog */}
{showDeleteConfirm && (
-
+
{
+ if (e.key === 'Enter') {
+ e.stopPropagation();
+ e.preventDefault();
+ confirmDelete(rememberChoice);
+ setRememberChoice(false);
+ } else if (e.key === 'Escape') {
+ e.stopPropagation();
+ e.preventDefault();
+ setShowDeleteConfirm(false);
+ setRememberChoice(false);
+ }
+ }}
+ tabIndex={0}
+ autoFocus
+ >
Delete Image?
-
+
Are you sure you want to delete "{images[Math.max(0, Math.min(currentIndex, images.length - 1))]?.path.split(/[/\\]/).pop()}"?
+
+ Press Enter to confirm or Escape to cancel
+
@@ -490,6 +495,8 @@ const PromptForm: React.FC
= ({
// Double click picks the image and closes modal
openFileFromHistory(imagePath);
}}
+ errorMessage={errorMessage}
+ setErrorMessage={setErrorMessage}
/>
)}
diff --git a/packages/kbot/gui/tauri-app/src/hooks/useTauriListeners.ts b/packages/kbot/gui/tauri-app/src/hooks/useTauriListeners.ts
index 529196e0..4b9d3d28 100644
--- a/packages/kbot/gui/tauri-app/src/hooks/useTauriListeners.ts
+++ b/packages/kbot/gui/tauri-app/src/hooks/useTauriListeners.ts
@@ -16,6 +16,7 @@ interface TauriListenersProps extends InitCallbacks {
setPromptHistory: (history: string[]) => void;
setFileHistory: (fileHistory: string[]) => void;
addToFileHistory: (filePath: string) => Promise
;
+ setErrorMessage?: (message: string | null) => void;
}
export function useTauriListeners({
@@ -33,7 +34,8 @@ export function useTauriListeners({
setCurrentIndex,
setPromptHistory,
setFileHistory,
- addToFileHistory
+ addToFileHistory,
+ setErrorMessage
}: TauriListenersProps) {
useEffect(() => {
let unlistenConfig: (() => void) | undefined;
@@ -131,6 +133,11 @@ export function useTauriListeners({
log.error('β Generation failed', errorData);
setIsGenerating(false);
setFiles(prev => prev.filter(file => !file.path.startsWith('generating_')));
+
+ // Display error message to user
+ if (setErrorMessage && errorData?.error) {
+ setErrorMessage(errorData.error);
+ }
}),
tauriApi.listen(TauriEvent.GENERATION_COMPLETE, (event: any) => {
const completionData = event.payload;
diff --git a/packages/kbot/gui/tauri-app/src/lib/init.ts b/packages/kbot/gui/tauri-app/src/lib/init.ts
index 93377cdf..6900928e 100644
--- a/packages/kbot/gui/tauri-app/src/lib/init.ts
+++ b/packages/kbot/gui/tauri-app/src/lib/init.ts
@@ -92,12 +92,21 @@ export async function loadStore(
}
log.info('π Attempting to load prompts from store...');
- const configDir = await tauriApi.path.appDataDir();
- log.debug(`π Data directory: ${configDir}`);
- const storePath = await tauriApi.path.join(configDir, STORE_FILE_NAME);
- log.debug(`π Store path resolved to: ${storePath}`);
- const content = await tauriApi.fs.readTextFile(storePath);
+ // Try BaseDirectory approach first
+ const BaseDir = tauriApi.fs.BaseDirectory;
+ let content: string;
+
+ if (BaseDir && BaseDir.AppData !== undefined) {
+ log.debug(`π Reading store using BaseDirectory.AppData`);
+ content = await tauriApi.fs.readTextFile(STORE_FILE_NAME, { baseDir: BaseDir.AppData });
+ } else {
+ // Fallback to absolute path
+ const configDir = await tauriApi.path.appDataDir();
+ const storePath = await tauriApi.path.join(configDir, STORE_FILE_NAME);
+ log.debug(`π Reading store using absolute path: ${storePath}`);
+ content = await tauriApi.fs.readTextFile(storePath);
+ }
if (content) {
const data = JSON.parse(content);
@@ -140,19 +149,36 @@ export async function loadStore(
// Create initial empty store
try {
const initialPrompts: PromptTemplate[] = [];
- const configDir = await tauriApi.path.appDataDir();
- const storePath = await tauriApi.path.join(configDir, STORE_FILE_NAME);
- log.debug(`π Ensuring directory exists: ${configDir}`);
-
- // Tauri should create the APPDATA directory automatically, but let's verify
- log.debug(`π APPDATA directory should exist: ${configDir}`);
+ // Use BaseDirectory.AppData approach for better compatibility
+ const BaseDir = tauriApi.fs.BaseDirectory;
+ log.debug(`π BaseDirectory available:`, BaseDir ? Object.keys(BaseDir) : 'none');
const initialData = JSON.stringify({ prompts: initialPrompts }, null, 2);
- log.debug(`πΎ Writing initial store data to: ${storePath}`);
- await tauriApi.fs.writeTextFile(storePath, initialData);
- log.info(`β
Initial store created successfully at ${storePath}`);
+ // Try to write using BaseDirectory first (most reliable)
+ if (BaseDir && BaseDir.AppData !== undefined) {
+ log.debug(`πΎ Writing store using BaseDirectory.AppData (value: ${BaseDir.AppData})`);
+ await tauriApi.fs.writeTextFile(STORE_FILE_NAME, initialData, { baseDir: BaseDir.AppData });
+ log.info(`β
Initial store created successfully using BaseDirectory.AppData`);
+ } else {
+ // Fallback to absolute path approach with directory creation
+ const configDir = await tauriApi.path.appDataDir();
+ const storePath = await tauriApi.path.join(configDir, STORE_FILE_NAME);
+ log.debug(`πΎ Writing store using absolute path: ${storePath}`);
+
+ // Try to create the directory first using mkdir
+ try {
+ await tauriApi.fs.createDir(configDir, { recursive: true });
+ log.debug(`β
Directory created: ${configDir}`);
+ } catch (dirError) {
+ log.debug(`π Directory creation failed or already exists: ${(dirError as Error).message}`);
+ }
+
+ // Now try to write the file
+ await tauriApi.fs.writeTextFile(storePath, initialData);
+ log.info(`β
Initial store created successfully at ${storePath}`);
+ }
setPrompts(initialPrompts);
return initialPrompts;
@@ -298,15 +324,21 @@ export async function saveToStore(updates: {
try {
log.debug('πΎ Starting save prompts process...');
- const dataDir = await tauriApi.path.appDataDir();
- log.debug(`π Got data dir: ${dataDir}`);
- const storePath = await tauriApi.path.join(dataDir, STORE_FILE_NAME);
- log.debug(`π Store path: ${storePath}`);
+
+ // Try BaseDirectory approach first
+ const BaseDir = tauriApi.fs.BaseDirectory;
// Load existing data first to merge
let existingData = { prompts: [], history: [], fileHistory: [] };
try {
- const existingContent = await tauriApi.fs.readTextFile(storePath);
+ let existingContent: string;
+ if (BaseDir && BaseDir.AppData !== undefined) {
+ existingContent = await tauriApi.fs.readTextFile(STORE_FILE_NAME, { baseDir: BaseDir.AppData });
+ } else {
+ const dataDir = await tauriApi.path.appDataDir();
+ const storePath = await tauriApi.path.join(dataDir, STORE_FILE_NAME);
+ existingContent = await tauriApi.fs.readTextFile(storePath);
+ }
if (existingContent) {
existingData = JSON.parse(existingContent);
}
@@ -329,7 +361,23 @@ export async function saveToStore(updates: {
dataLength: dataToSave.length
});
- await tauriApi.fs.writeTextFile(storePath, dataToSave);
+ // Write using the same approach as loading
+ if (BaseDir && BaseDir.AppData !== undefined) {
+ await tauriApi.fs.writeTextFile(STORE_FILE_NAME, dataToSave, { baseDir: BaseDir.AppData });
+ } else {
+ const dataDir = await tauriApi.path.appDataDir();
+ const storePath = await tauriApi.path.join(dataDir, STORE_FILE_NAME);
+
+ // Ensure directory exists before writing
+ try {
+ await tauriApi.fs.createDir(dataDir, { recursive: true });
+ log.debug(`β
Directory ensured: ${dataDir}`);
+ } catch (dirError) {
+ log.debug(`π Directory creation failed or already exists: ${(dirError as Error).message}`);
+ }
+
+ await tauriApi.fs.writeTextFile(storePath, dataToSave);
+ }
log.info(`β
Store saved with ${mergedData.prompts.length} prompts, ${mergedData.history.length} history, ${mergedData.fileHistory.length} files`);
} catch (error) {
log.error('Failed to save prompts', {
diff --git a/packages/kbot/gui/tauri-app/src/lib/tauriApi.ts b/packages/kbot/gui/tauri-app/src/lib/tauriApi.ts
index a63a5ce7..dcd3937e 100644
--- a/packages/kbot/gui/tauri-app/src/lib/tauriApi.ts
+++ b/packages/kbot/gui/tauri-app/src/lib/tauriApi.ts
@@ -3,7 +3,7 @@ import {
TauriEvent
} from '../constants';
import { PromptTemplate } from '../types';
-
+// import { BaseDirectory } from '@tauri-apps/plugin-fs'
// Dynamically import Tauri APIs
let invoke: any;
let open: any;
@@ -12,6 +12,7 @@ let readFile: any;
let writeFile: any;
let readTextFile: any;
let writeTextFile: any;
+let mkdir: any;
let BaseDirectory: any;
let listen: any;
let getCurrentWindow: any;
@@ -59,6 +60,12 @@ const apiInitializationPromise = (async () => {
// Test if we can actually use the APIs (this will throw if not in Tauri)
await windowApi.getCurrentWindow();
+ // Debug: Check what's available in pathApi
+ console.log('π pathApi keys:', Object.keys(pathApi));
+ console.log('π pathApi.BaseDirectory:', pathApi.BaseDirectory);
+ console.log('π fsApi keys:', Object.keys(fsApi));
+ console.log('π fsApi.BaseDirectory:', fsApi.BaseDirectory);
+
// Assign all APIs
getCurrentWindow = windowApi.getCurrentWindow;
getCurrentWebview = webviewApi.getCurrentWebview;
@@ -70,7 +77,8 @@ const apiInitializationPromise = (async () => {
writeFile = fsApi.writeFile;
readTextFile = fsApi.readTextFile;
writeTextFile = fsApi.writeTextFile;
- BaseDirectory = fsApi.BaseDirectory;
+ mkdir = fsApi.mkdir;
+ BaseDirectory = pathApi.BaseDirectory || fsApi.BaseDirectory;
fetch = httpApi.fetch;
appConfigDir = pathApi.appConfigDir;
appDataDir = pathApi.appDataDir;
@@ -155,7 +163,13 @@ export const tauriApi = {
return writeTextFile(...args);
}
},
- BaseDirectory: () => BaseDirectory,
+ createDir: async (path: string, options?: { baseDir?: any; recursive?: boolean }) => {
+ await ensureTauriApi();
+ if (mkdir) {
+ return mkdir(path, options);
+ }
+ },
+ BaseDirectory: BaseDirectory,
},
dialog: {
open: async (...args: Parameters) => {
diff --git a/packages/kbot/schema.json b/packages/kbot/schema.json
index aff814c2..1679f713 100644
--- a/packages/kbot/schema.json
+++ b/packages/kbot/schema.json
@@ -119,7 +119,7 @@
},
"model": {
"type": "string",
- "description": "AI model to use for processing. Available models:\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenRouter models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nagentica-org/deepcoder-14b-preview | paid\nagentica-org/deepcoder-14b-preview:free | free\nai21/jamba-large-1.7 | paid\nai21/jamba-mini-1.7 | paid\naion-labs/aion-1.0 | paid\naion-labs/aion-1.0-mini | paid\naion-labs/aion-rp-llama-3.1-8b | paid\nalfredpros/codellama-7b-instruct-solidity | paid\nallenai/molmo-7b-d | paid\nallenai/olmo-2-0325-32b-instruct | paid\namazon/nova-lite-v1 | paid\namazon/nova-micro-v1 | paid\namazon/nova-pro-v1 | paid\nanthropic/claude-3-haiku | paid\nanthropic/claude-3-opus | paid\nanthropic/claude-3.5-haiku | paid\nanthropic/claude-3.5-haiku-20241022 | paid\nanthropic/claude-3.5-sonnet | paid\nanthropic/claude-3.5-sonnet-20240620 | paid\nanthropic/claude-3.7-sonnet | paid\nanthropic/claude-3.7-sonnet:thinking | paid\nanthropic/claude-opus-4 | paid\nanthropic/claude-opus-4.1 | paid\nanthropic/claude-sonnet-4 | paid\narcee-ai/coder-large | paid\narcee-ai/maestro-reasoning | paid\narcee-ai/spotlight | paid\narcee-ai/virtuoso-large | paid\narliai/qwq-32b-arliai-rpr-v1 | paid\narliai/qwq-32b-arliai-rpr-v1:free | free\nopenrouter/auto | paid\nbaidu/ernie-4.5-21b-a3b | paid\nbaidu/ernie-4.5-300b-a47b | paid\nbaidu/ernie-4.5-vl-28b-a3b | paid\nbaidu/ernie-4.5-vl-424b-a47b | paid\nbytedance/seed-oss-36b-instruct | paid\nbytedance/ui-tars-1.5-7b | paid\ndeepcogito/cogito-v2-preview-llama-109b-moe | paid\ncohere/command | paid\ncohere/command-a | paid\ncohere/command-r | paid\ncohere/command-r-03-2024 | paid\ncohere/command-r-08-2024 | paid\ncohere/command-r-plus | paid\ncohere/command-r-plus-04-2024 | paid\ncohere/command-r-plus-08-2024 | paid\ncohere/command-r7b-12-2024 | paid\ndeepcogito/cogito-v2-preview-deepseek-671b | paid\ndeepseek/deepseek-prover-v2 | paid\ndeepseek/deepseek-r1-0528-qwen3-8b | paid\ndeepseek/deepseek-r1-0528-qwen3-8b:free | free\ndeepseek/deepseek-chat | paid\ndeepseek/deepseek-chat-v3-0324 | paid\ndeepseek/deepseek-chat-v3-0324:free | free\ndeepseek/deepseek-chat-v3.1 | paid\ndeepseek/deepseek-chat-v3.1:free | free\ndeepseek/deepseek-v3.1-base | paid\ndeepseek/deepseek-r1 | paid\ndeepseek/deepseek-r1:free | free\ndeepseek/deepseek-r1-0528 | paid\ndeepseek/deepseek-r1-0528:free | free\ndeepseek/deepseek-r1-distill-llama-70b | paid\ndeepseek/deepseek-r1-distill-llama-70b:free | free\ndeepseek/deepseek-r1-distill-llama-8b | paid\ndeepseek/deepseek-r1-distill-qwen-14b | paid\ndeepseek/deepseek-r1-distill-qwen-14b:free | free\ndeepseek/deepseek-r1-distill-qwen-32b | paid\ncognitivecomputations/dolphin-mixtral-8x22b | paid\ncognitivecomputations/dolphin3.0-mistral-24b | paid\ncognitivecomputations/dolphin3.0-mistral-24b:free | free\ncognitivecomputations/dolphin3.0-r1-mistral-24b | paid\ncognitivecomputations/dolphin3.0-r1-mistral-24b:free | free\neleutherai/llemma_7b | paid\nalpindale/goliath-120b | paid\ngoogle/gemini-flash-1.5 | paid\ngoogle/gemini-flash-1.5-8b | paid\ngoogle/gemini-pro-1.5 | paid\ngoogle/gemini-2.0-flash-001 | paid\ngoogle/gemini-2.0-flash-exp:free | free\ngoogle/gemini-2.0-flash-lite-001 | paid\ngoogle/gemini-2.5-flash | paid\ngoogle/gemini-2.5-flash-image-preview | paid\ngoogle/gemini-2.5-flash-lite | paid\ngoogle/gemini-2.5-flash-lite-preview-06-17 | paid\ngoogle/gemini-2.5-pro | paid\ngoogle/gemini-2.5-pro-preview-05-06 | paid\ngoogle/gemini-2.5-pro-preview | paid\ngoogle/gemma-2-27b-it | paid\ngoogle/gemma-2-9b-it | paid\ngoogle/gemma-2-9b-it:free | free\ngoogle/gemma-3-12b-it | paid\ngoogle/gemma-3-12b-it:free | free\ngoogle/gemma-3-27b-it | paid\ngoogle/gemma-3-27b-it:free | free\ngoogle/gemma-3-4b-it | paid\ngoogle/gemma-3-4b-it:free | free\ngoogle/gemma-3n-e2b-it:free | free\ngoogle/gemma-3n-e4b-it | paid\ngoogle/gemma-3n-e4b-it:free | free\ninception/mercury | paid\ninception/mercury-coder | paid\ninflection/inflection-3-pi | paid\ninflection/inflection-3-productivity | paid\nliquid/lfm-3b | paid\nliquid/lfm-7b | paid\nmeta-llama/llama-guard-3-8b | paid\nanthracite-org/magnum-v2-72b | paid\nanthracite-org/magnum-v4-72b | paid\nmancer/weaver | paid\nmeituan/longcat-flash-chat | paid\nmeta-llama/llama-3-70b-instruct | paid\nmeta-llama/llama-3-8b-instruct | paid\nmeta-llama/llama-3.1-405b | paid\nmeta-llama/llama-3.1-405b-instruct | paid\nmeta-llama/llama-3.1-405b-instruct:free | free\nmeta-llama/llama-3.1-70b-instruct | paid\nmeta-llama/llama-3.1-8b-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct | paid\nmeta-llama/llama-3.2-1b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct:free | free\nmeta-llama/llama-3.2-90b-vision-instruct | paid\nmeta-llama/llama-3.3-70b-instruct | paid\nmeta-llama/llama-3.3-70b-instruct:free | free\nmeta-llama/llama-3.3-8b-instruct:free | free\nmeta-llama/llama-4-maverick | paid\nmeta-llama/llama-4-maverick:free | free\nmeta-llama/llama-4-scout | paid\nmeta-llama/llama-4-scout:free | free\nmeta-llama/llama-guard-4-12b | paid\nmeta-llama/llama-guard-2-8b | paid\nmicrosoft/mai-ds-r1 | paid\nmicrosoft/mai-ds-r1:free | free\nmicrosoft/phi-4 | paid\nmicrosoft/phi-4-multimodal-instruct | paid\nmicrosoft/phi-4-reasoning-plus | paid\nmicrosoft/phi-3-medium-128k-instruct | paid\nmicrosoft/phi-3-mini-128k-instruct | paid\nmicrosoft/phi-3.5-mini-128k-instruct | paid\nsophosympatheia/midnight-rose-70b | paid\nminimax/minimax-m1 | paid\nminimax/minimax-01 | paid\nmistralai/mistral-large | paid\nmistralai/mistral-large-2407 | paid\nmistralai/mistral-large-2411 | paid\nmistralai/mistral-small | paid\nmistralai/mistral-tiny | paid\nmistralai/codestral-2501 | paid\nmistralai/codestral-2508 | paid\nmistralai/devstral-medium | paid\nmistralai/devstral-small | paid\nmistralai/devstral-small-2505 | paid\nmistralai/devstral-small-2505:free | free\nmistralai/magistral-medium-2506 | paid\nmistralai/magistral-medium-2506:thinking | paid\nmistralai/magistral-small-2506 | paid\nmistralai/ministral-3b | paid\nmistralai/ministral-8b | paid\nmistralai/mistral-7b-instruct | paid\nmistralai/mistral-7b-instruct:free | free\nmistralai/mistral-7b-instruct-v0.1 | paid\nmistralai/mistral-7b-instruct-v0.3 | paid\nmistralai/mistral-medium-3 | paid\nmistralai/mistral-medium-3.1 | paid\nmistralai/mistral-nemo | paid\nmistralai/mistral-nemo:free | free\nmistralai/mistral-small-24b-instruct-2501 | paid\nmistralai/mistral-small-24b-instruct-2501:free | free\nmistralai/mistral-small-3.1-24b-instruct | paid\nmistralai/mistral-small-3.1-24b-instruct:free | free\nmistralai/mistral-small-3.2-24b-instruct | paid\nmistralai/mistral-small-3.2-24b-instruct:free | free\nmistralai/mixtral-8x22b-instruct | paid\nmistralai/mixtral-8x7b-instruct | paid\nmistralai/pixtral-12b | paid\nmistralai/pixtral-large-2411 | paid\nmistralai/mistral-saba | paid\nmoonshotai/kimi-dev-72b | paid\nmoonshotai/kimi-dev-72b:free | free\nmoonshotai/kimi-k2 | paid\nmoonshotai/kimi-k2:free | free\nmoonshotai/kimi-k2-0905 | paid\nmoonshotai/kimi-vl-a3b-thinking | paid\nmoonshotai/kimi-vl-a3b-thinking:free | free\nmorph/morph-v3-fast | paid\nmorph/morph-v3-large | paid\ngryphe/mythomax-l2-13b | paid\nneversleep/llama-3-lumimaid-70b | paid\nneversleep/llama-3.1-lumimaid-8b | paid\nneversleep/noromaid-20b | paid\nnousresearch/deephermes-3-llama-3-8b-preview:free | free\nnousresearch/deephermes-3-mistral-24b-preview | paid\nnousresearch/hermes-3-llama-3.1-405b | paid\nnousresearch/hermes-3-llama-3.1-70b | paid\nnousresearch/hermes-4-405b | paid\nnousresearch/hermes-4-70b | paid\nnousresearch/hermes-2-pro-llama-3-8b | paid\nnvidia/llama-3.1-nemotron-70b-instruct | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1 | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1:free | free\nnvidia/nemotron-nano-9b-v2 | paid\nnvidia/nemotron-nano-9b-v2:free | free\nopenai/chatgpt-4o-latest | paid\nopenai/codex-mini | paid\nopenai/gpt-3.5-turbo | paid\nopenai/gpt-3.5-turbo-0613 | paid\nopenai/gpt-3.5-turbo-16k | paid\nopenai/gpt-3.5-turbo-instruct | paid\nopenai/gpt-4 | paid\nopenai/gpt-4-0314 | paid\nopenai/gpt-4-turbo | paid\nopenai/gpt-4-1106-preview | paid\nopenai/gpt-4-turbo-preview | paid\nopenai/gpt-4.1 | paid\nopenai/gpt-4.1-mini | paid\nopenai/gpt-4.1-nano | paid\nopenai/gpt-4o | paid\nopenai/gpt-4o-2024-05-13 | paid\nopenai/gpt-4o-2024-08-06 | paid\nopenai/gpt-4o-2024-11-20 | paid\nopenai/gpt-4o:extended | paid\nopenai/gpt-4o-audio-preview | paid\nopenai/gpt-4o-search-preview | paid\nopenai/gpt-4o-mini | paid\nopenai/gpt-4o-mini-2024-07-18 | paid\nopenai/gpt-4o-mini-search-preview | paid\nopenai/gpt-5 | paid\nopenai/gpt-5-chat | paid\nopenai/gpt-5-mini | paid\nopenai/gpt-5-nano | paid\nopenai/gpt-oss-120b | paid\nopenai/gpt-oss-120b:free | free\nopenai/gpt-oss-20b | paid\nopenai/gpt-oss-20b:free | free\nopenai/o1 | paid\nopenai/o1-mini | paid\nopenai/o1-mini-2024-09-12 | paid\nopenai/o1-pro | paid\nopenai/o3 | paid\nopenai/o3-mini | paid\nopenai/o3-mini-high | paid\nopenai/o3-pro | paid\nopenai/o4-mini | paid\nopenai/o4-mini-high | paid\nperplexity/r1-1776 | paid\nperplexity/sonar | paid\nperplexity/sonar-deep-research | paid\nperplexity/sonar-pro | paid\nperplexity/sonar-reasoning | paid\nperplexity/sonar-reasoning-pro | paid\nqwen/qwen-plus-2025-07-28 | paid\nqwen/qwen-plus-2025-07-28:thinking | paid\nqwen/qwen-vl-max | paid\nqwen/qwen-vl-plus | paid\nqwen/qwen-max | paid\nqwen/qwen-plus | paid\nqwen/qwen-turbo | paid\nqwen/qwen2.5-vl-32b-instruct | paid\nqwen/qwen2.5-vl-32b-instruct:free | free\nqwen/qwen2.5-vl-72b-instruct | paid\nqwen/qwen2.5-vl-72b-instruct:free | free\nqwen/qwen-2.5-vl-7b-instruct | paid\nqwen/qwen3-14b | paid\nqwen/qwen3-14b:free | free\nqwen/qwen3-235b-a22b | paid\nqwen/qwen3-235b-a22b:free | free\nqwen/qwen3-235b-a22b-2507 | paid\nqwen/qwen3-235b-a22b-thinking-2507 | paid\nqwen/qwen3-30b-a3b | paid\nqwen/qwen3-30b-a3b:free | free\nqwen/qwen3-30b-a3b-instruct-2507 | paid\nqwen/qwen3-30b-a3b-thinking-2507 | paid\nqwen/qwen3-32b | paid\nqwen/qwen3-4b:free | free\nqwen/qwen3-8b | paid\nqwen/qwen3-8b:free | free\nqwen/qwen3-coder-30b-a3b-instruct | paid\nqwen/qwen3-coder | paid\nqwen/qwen3-coder:free | free\nqwen/qwen3-max | paid\nqwen/qwen3-next-80b-a3b-instruct | paid\nqwen/qwen3-next-80b-a3b-thinking | paid\nqwen/qwq-32b | paid\nqwen/qwq-32b:free | free\nqwen/qwq-32b-preview | paid\nqwen/qwen-2.5-72b-instruct | paid\nqwen/qwen-2.5-72b-instruct:free | free\nqwen/qwen-2.5-7b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct:free | free\nrekaai/reka-flash-3:free | free\nundi95/remm-slerp-l2-13b | paid\nsao10k/l3-lunaris-8b | paid\nsao10k/l3-euryale-70b | paid\nsao10k/l3.1-euryale-70b | paid\nsao10k/l3.3-euryale-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b:free | free\nopenrouter/sonoma-dusk-alpha | paid\nopenrouter/sonoma-sky-alpha | paid\nraifle/sorcererlm-8x22b | paid\nstepfun-ai/step3 | paid\nswitchpoint/router | paid\ntencent/hunyuan-a13b-instruct | paid\ntencent/hunyuan-a13b-instruct:free | free\nthedrummer/anubis-70b-v1.1 | paid\nthedrummer/anubis-pro-105b-v1 | paid\nthedrummer/rocinante-12b | paid\nthedrummer/skyfall-36b-v2 | paid\nthedrummer/unslopnemo-12b | paid\nthudm/glm-4-32b | paid\nthudm/glm-4.1v-9b-thinking | paid\nthudm/glm-z1-32b | paid\ntngtech/deepseek-r1t-chimera | paid\ntngtech/deepseek-r1t-chimera:free | free\ntngtech/deepseek-r1t2-chimera:free | free\ncognitivecomputations/dolphin-mistral-24b-venice-edition:free | free\nmicrosoft/wizardlm-2-8x22b | paid\nx-ai/grok-2-1212 | paid\nx-ai/grok-2-vision-1212 | paid\nx-ai/grok-3 | paid\nx-ai/grok-3-beta | paid\nx-ai/grok-3-mini | paid\nx-ai/grok-3-mini-beta | paid\nx-ai/grok-4 | paid\nx-ai/grok-code-fast-1 | paid\nz-ai/glm-4-32b | paid\nz-ai/glm-4.5 | paid\nz-ai/glm-4.5-air | paid\nz-ai/glm-4.5-air:free | free\nz-ai/glm-4.5v | paid\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenAI models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nbabbage-002\nchatgpt-4o-latest\ncodex-mini-latest\ndall-e-2\ndall-e-3\ndavinci-002\ngpt-3.5-turbo\ngpt-3.5-turbo-0125\ngpt-3.5-turbo-1106\ngpt-3.5-turbo-16k\ngpt-3.5-turbo-instruct\ngpt-3.5-turbo-instruct-0914\ngpt-4\ngpt-4-0125-preview\ngpt-4-0613\ngpt-4-1106-preview\ngpt-4-turbo\ngpt-4-turbo-2024-04-09\ngpt-4-turbo-preview\ngpt-4.1\ngpt-4.1-2025-04-14\ngpt-4.1-mini\ngpt-4.1-mini-2025-04-14\ngpt-4.1-nano\ngpt-4.1-nano-2025-04-14\ngpt-4o\ngpt-4o-2024-05-13\ngpt-4o-2024-08-06\ngpt-4o-2024-11-20\ngpt-4o-audio-preview\ngpt-4o-audio-preview-2024-10-01\ngpt-4o-audio-preview-2024-12-17\ngpt-4o-audio-preview-2025-06-03\ngpt-4o-mini\ngpt-4o-mini-2024-07-18\ngpt-4o-mini-audio-preview\ngpt-4o-mini-audio-preview-2024-12-17\ngpt-4o-mini-realtime-preview\ngpt-4o-mini-realtime-preview-2024-12-17\ngpt-4o-mini-search-preview\ngpt-4o-mini-search-preview-2025-03-11\ngpt-4o-mini-transcribe\ngpt-4o-mini-tts\ngpt-4o-realtime-preview\ngpt-4o-realtime-preview-2024-10-01\ngpt-4o-realtime-preview-2024-12-17\ngpt-4o-realtime-preview-2025-06-03\ngpt-4o-search-preview\ngpt-4o-search-preview-2025-03-11\ngpt-4o-transcribe\ngpt-5\ngpt-5-2025-08-07\ngpt-5-chat-latest\ngpt-5-mini\ngpt-5-mini-2025-08-07\ngpt-5-nano\ngpt-5-nano-2025-08-07\ngpt-audio\ngpt-audio-2025-08-28\ngpt-image-1\ngpt-realtime\ngpt-realtime-2025-08-28\no1\no1-2024-12-17\no1-mini\no1-mini-2024-09-12\no1-pro\no1-pro-2025-03-19\no3\no3-2025-04-16\no3-mini\no3-mini-2025-01-31\no4-mini\no4-mini-2025-04-16\no4-mini-deep-research\no4-mini-deep-research-2025-06-26\nomni-moderation-2024-09-26\nomni-moderation-latest\ntext-embedding-3-large\ntext-embedding-3-small\ntext-embedding-ada-002\ntts-1\ntts-1-1106\ntts-1-hd\ntts-1-hd-1106\nwhisper-1\n-----\n\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m Deepseek models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\ndeepseek-chat\ndeepseek-reasoner\n-----\n"
+ "description": "AI model to use for processing. Available models:\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenRouter models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nagentica-org/deepcoder-14b-preview | paid\nagentica-org/deepcoder-14b-preview:free | free\nai21/jamba-large-1.7 | paid\nai21/jamba-mini-1.7 | paid\naion-labs/aion-1.0 | paid\naion-labs/aion-1.0-mini | paid\naion-labs/aion-rp-llama-3.1-8b | paid\nalfredpros/codellama-7b-instruct-solidity | paid\nallenai/molmo-7b-d | paid\nallenai/olmo-2-0325-32b-instruct | paid\namazon/nova-lite-v1 | paid\namazon/nova-micro-v1 | paid\namazon/nova-pro-v1 | paid\nanthropic/claude-3-haiku | paid\nanthropic/claude-3-opus | paid\nanthropic/claude-3.5-haiku | paid\nanthropic/claude-3.5-haiku-20241022 | paid\nanthropic/claude-3.5-sonnet | paid\nanthropic/claude-3.5-sonnet-20240620 | paid\nanthropic/claude-3.7-sonnet | paid\nanthropic/claude-3.7-sonnet:thinking | paid\nanthropic/claude-opus-4 | paid\nanthropic/claude-opus-4.1 | paid\nanthropic/claude-sonnet-4 | paid\narcee-ai/afm-4.5b | paid\narcee-ai/coder-large | paid\narcee-ai/maestro-reasoning | paid\narcee-ai/spotlight | paid\narcee-ai/virtuoso-large | paid\narliai/qwq-32b-arliai-rpr-v1 | paid\narliai/qwq-32b-arliai-rpr-v1:free | free\nopenrouter/auto | paid\nbaidu/ernie-4.5-21b-a3b | paid\nbaidu/ernie-4.5-300b-a47b | paid\nbaidu/ernie-4.5-vl-28b-a3b | paid\nbaidu/ernie-4.5-vl-424b-a47b | paid\nbytedance/seed-oss-36b-instruct | paid\nbytedance/ui-tars-1.5-7b | paid\ndeepcogito/cogito-v2-preview-llama-109b-moe | paid\ncohere/command | paid\ncohere/command-a | paid\ncohere/command-r | paid\ncohere/command-r-03-2024 | paid\ncohere/command-r-08-2024 | paid\ncohere/command-r-plus | paid\ncohere/command-r-plus-04-2024 | paid\ncohere/command-r-plus-08-2024 | paid\ncohere/command-r7b-12-2024 | paid\ndeepcogito/cogito-v2-preview-deepseek-671b | paid\ndeepseek/deepseek-prover-v2 | paid\ndeepseek/deepseek-r1-0528-qwen3-8b | paid\ndeepseek/deepseek-r1-0528-qwen3-8b:free | free\ndeepseek/deepseek-chat | paid\ndeepseek/deepseek-chat-v3-0324 | paid\ndeepseek/deepseek-chat-v3-0324:free | free\ndeepseek/deepseek-chat-v3.1 | paid\ndeepseek/deepseek-chat-v3.1:free | free\ndeepseek/deepseek-v3.1-base | paid\ndeepseek/deepseek-r1 | paid\ndeepseek/deepseek-r1:free | free\ndeepseek/deepseek-r1-0528 | paid\ndeepseek/deepseek-r1-0528:free | free\ndeepseek/deepseek-r1-distill-llama-70b | paid\ndeepseek/deepseek-r1-distill-llama-70b:free | free\ndeepseek/deepseek-r1-distill-llama-8b | paid\ndeepseek/deepseek-r1-distill-qwen-14b | paid\ndeepseek/deepseek-r1-distill-qwen-32b | paid\ncognitivecomputations/dolphin3.0-mistral-24b | paid\ncognitivecomputations/dolphin3.0-mistral-24b:free | free\ncognitivecomputations/dolphin3.0-r1-mistral-24b | paid\ncognitivecomputations/dolphin3.0-r1-mistral-24b:free | free\neleutherai/llemma_7b | paid\nalpindale/goliath-120b | paid\ngoogle/gemini-flash-1.5 | paid\ngoogle/gemini-flash-1.5-8b | paid\ngoogle/gemini-pro-1.5 | paid\ngoogle/gemini-2.0-flash-001 | paid\ngoogle/gemini-2.0-flash-exp:free | free\ngoogle/gemini-2.0-flash-lite-001 | paid\ngoogle/gemini-2.5-flash | paid\ngoogle/gemini-2.5-flash-image-preview | paid\ngoogle/gemini-2.5-flash-lite | paid\ngoogle/gemini-2.5-flash-lite-preview-06-17 | paid\ngoogle/gemini-2.5-pro | paid\ngoogle/gemini-2.5-pro-preview-05-06 | paid\ngoogle/gemini-2.5-pro-preview | paid\ngoogle/gemma-2-27b-it | paid\ngoogle/gemma-2-9b-it | paid\ngoogle/gemma-2-9b-it:free | free\ngoogle/gemma-3-12b-it | paid\ngoogle/gemma-3-12b-it:free | free\ngoogle/gemma-3-27b-it | paid\ngoogle/gemma-3-27b-it:free | free\ngoogle/gemma-3-4b-it | paid\ngoogle/gemma-3-4b-it:free | free\ngoogle/gemma-3n-e2b-it:free | free\ngoogle/gemma-3n-e4b-it | paid\ngoogle/gemma-3n-e4b-it:free | free\ninception/mercury | paid\ninception/mercury-coder | paid\ninflection/inflection-3-pi | paid\ninflection/inflection-3-productivity | paid\nliquid/lfm-3b | paid\nliquid/lfm-7b | paid\nmeta-llama/llama-guard-3-8b | paid\nanthracite-org/magnum-v2-72b | paid\nanthracite-org/magnum-v4-72b | paid\nmancer/weaver | paid\nmeituan/longcat-flash-chat | paid\nmeta-llama/llama-3-70b-instruct | paid\nmeta-llama/llama-3-8b-instruct | paid\nmeta-llama/llama-3.1-405b | paid\nmeta-llama/llama-3.1-405b-instruct | paid\nmeta-llama/llama-3.1-405b-instruct:free | free\nmeta-llama/llama-3.1-70b-instruct | paid\nmeta-llama/llama-3.1-8b-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct | paid\nmeta-llama/llama-3.2-1b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct:free | free\nmeta-llama/llama-3.2-90b-vision-instruct | paid\nmeta-llama/llama-3.3-70b-instruct | paid\nmeta-llama/llama-3.3-70b-instruct:free | free\nmeta-llama/llama-3.3-8b-instruct:free | free\nmeta-llama/llama-4-maverick | paid\nmeta-llama/llama-4-maverick:free | free\nmeta-llama/llama-4-scout | paid\nmeta-llama/llama-4-scout:free | free\nmeta-llama/llama-guard-4-12b | paid\nmeta-llama/llama-guard-2-8b | paid\nmicrosoft/mai-ds-r1 | paid\nmicrosoft/mai-ds-r1:free | free\nmicrosoft/phi-4 | paid\nmicrosoft/phi-4-multimodal-instruct | paid\nmicrosoft/phi-4-reasoning-plus | paid\nmicrosoft/phi-3-medium-128k-instruct | paid\nmicrosoft/phi-3-mini-128k-instruct | paid\nmicrosoft/phi-3.5-mini-128k-instruct | paid\nminimax/minimax-m1 | paid\nminimax/minimax-01 | paid\nmistralai/mistral-large | paid\nmistralai/mistral-large-2407 | paid\nmistralai/mistral-large-2411 | paid\nmistralai/mistral-small | paid\nmistralai/mistral-tiny | paid\nmistralai/codestral-2501 | paid\nmistralai/codestral-2508 | paid\nmistralai/devstral-medium | paid\nmistralai/devstral-small | paid\nmistralai/devstral-small-2505 | paid\nmistralai/devstral-small-2505:free | free\nmistralai/magistral-medium-2506 | paid\nmistralai/magistral-medium-2506:thinking | paid\nmistralai/magistral-small-2506 | paid\nmistralai/ministral-3b | paid\nmistralai/ministral-8b | paid\nmistralai/mistral-7b-instruct | paid\nmistralai/mistral-7b-instruct:free | free\nmistralai/mistral-7b-instruct-v0.1 | paid\nmistralai/mistral-7b-instruct-v0.3 | paid\nmistralai/mistral-medium-3 | paid\nmistralai/mistral-medium-3.1 | paid\nmistralai/mistral-nemo | paid\nmistralai/mistral-nemo:free | free\nmistralai/mistral-small-24b-instruct-2501 | paid\nmistralai/mistral-small-24b-instruct-2501:free | free\nmistralai/mistral-small-3.1-24b-instruct | paid\nmistralai/mistral-small-3.1-24b-instruct:free | free\nmistralai/mistral-small-3.2-24b-instruct | paid\nmistralai/mistral-small-3.2-24b-instruct:free | free\nmistralai/mixtral-8x22b-instruct | paid\nmistralai/mixtral-8x7b-instruct | paid\nmistralai/pixtral-12b | paid\nmistralai/pixtral-large-2411 | paid\nmistralai/mistral-saba | paid\nmoonshotai/kimi-dev-72b | paid\nmoonshotai/kimi-dev-72b:free | free\nmoonshotai/kimi-k2 | paid\nmoonshotai/kimi-k2:free | free\nmoonshotai/kimi-k2-0905 | paid\nmoonshotai/kimi-vl-a3b-thinking | paid\nmoonshotai/kimi-vl-a3b-thinking:free | free\nmorph/morph-v3-fast | paid\nmorph/morph-v3-large | paid\ngryphe/mythomax-l2-13b | paid\nneversleep/llama-3-lumimaid-70b | paid\nneversleep/llama-3.1-lumimaid-8b | paid\nneversleep/noromaid-20b | paid\nnousresearch/deephermes-3-llama-3-8b-preview:free | free\nnousresearch/deephermes-3-mistral-24b-preview | paid\nnousresearch/hermes-3-llama-3.1-405b | paid\nnousresearch/hermes-3-llama-3.1-70b | paid\nnousresearch/hermes-4-405b | paid\nnousresearch/hermes-4-70b | paid\nnousresearch/hermes-2-pro-llama-3-8b | paid\nnvidia/llama-3.1-nemotron-70b-instruct | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1 | paid\nnvidia/nemotron-nano-9b-v2 | paid\nnvidia/nemotron-nano-9b-v2:free | free\nopenai/chatgpt-4o-latest | paid\nopenai/codex-mini | paid\nopenai/gpt-3.5-turbo | paid\nopenai/gpt-3.5-turbo-0613 | paid\nopenai/gpt-3.5-turbo-16k | paid\nopenai/gpt-3.5-turbo-instruct | paid\nopenai/gpt-4 | paid\nopenai/gpt-4-0314 | paid\nopenai/gpt-4-turbo | paid\nopenai/gpt-4-1106-preview | paid\nopenai/gpt-4-turbo-preview | paid\nopenai/gpt-4.1 | paid\nopenai/gpt-4.1-mini | paid\nopenai/gpt-4.1-nano | paid\nopenai/gpt-4o | paid\nopenai/gpt-4o-2024-05-13 | paid\nopenai/gpt-4o-2024-08-06 | paid\nopenai/gpt-4o-2024-11-20 | paid\nopenai/gpt-4o:extended | paid\nopenai/gpt-4o-audio-preview | paid\nopenai/gpt-4o-search-preview | paid\nopenai/gpt-4o-mini | paid\nopenai/gpt-4o-mini-2024-07-18 | paid\nopenai/gpt-4o-mini-search-preview | paid\nopenai/gpt-5 | paid\nopenai/gpt-5-chat | paid\nopenai/gpt-5-mini | paid\nopenai/gpt-5-nano | paid\nopenai/gpt-oss-120b | paid\nopenai/gpt-oss-120b:free | free\nopenai/gpt-oss-20b | paid\nopenai/gpt-oss-20b:free | free\nopenai/o1 | paid\nopenai/o1-mini | paid\nopenai/o1-mini-2024-09-12 | paid\nopenai/o1-pro | paid\nopenai/o3 | paid\nopenai/o3-mini | paid\nopenai/o3-mini-high | paid\nopenai/o3-pro | paid\nopenai/o4-mini | paid\nopenai/o4-mini-high | paid\nopengvlab/internvl3-78b | paid\nperplexity/r1-1776 | paid\nperplexity/sonar | paid\nperplexity/sonar-deep-research | paid\nperplexity/sonar-pro | paid\nperplexity/sonar-reasoning | paid\nperplexity/sonar-reasoning-pro | paid\nqwen/qwen-plus-2025-07-28 | paid\nqwen/qwen-plus-2025-07-28:thinking | paid\nqwen/qwen-vl-max | paid\nqwen/qwen-vl-plus | paid\nqwen/qwen-max | paid\nqwen/qwen-plus | paid\nqwen/qwen-turbo | paid\nqwen/qwen2.5-vl-32b-instruct | paid\nqwen/qwen2.5-vl-32b-instruct:free | free\nqwen/qwen2.5-vl-72b-instruct | paid\nqwen/qwen2.5-vl-72b-instruct:free | free\nqwen/qwen-2.5-vl-7b-instruct | paid\nqwen/qwen3-14b | paid\nqwen/qwen3-14b:free | free\nqwen/qwen3-235b-a22b | paid\nqwen/qwen3-235b-a22b:free | free\nqwen/qwen3-235b-a22b-2507 | paid\nqwen/qwen3-235b-a22b-thinking-2507 | paid\nqwen/qwen3-30b-a3b | paid\nqwen/qwen3-30b-a3b:free | free\nqwen/qwen3-30b-a3b-instruct-2507 | paid\nqwen/qwen3-30b-a3b-thinking-2507 | paid\nqwen/qwen3-32b | paid\nqwen/qwen3-4b:free | free\nqwen/qwen3-8b | paid\nqwen/qwen3-8b:free | free\nqwen/qwen3-coder-30b-a3b-instruct | paid\nqwen/qwen3-coder | paid\nqwen/qwen3-coder:free | free\nqwen/qwen3-coder-flash | paid\nqwen/qwen3-coder-plus | paid\nqwen/qwen3-max | paid\nqwen/qwen3-next-80b-a3b-instruct | paid\nqwen/qwen3-next-80b-a3b-thinking | paid\nqwen/qwq-32b | paid\nqwen/qwq-32b:free | free\nqwen/qwq-32b-preview | paid\nqwen/qwen-2.5-72b-instruct | paid\nqwen/qwen-2.5-72b-instruct:free | free\nqwen/qwen-2.5-7b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct:free | free\nundi95/remm-slerp-l2-13b | paid\nsao10k/l3-lunaris-8b | paid\nsao10k/l3-euryale-70b | paid\nsao10k/l3.1-euryale-70b | paid\nsao10k/l3.3-euryale-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b:free | free\nraifle/sorcererlm-8x22b | paid\nstepfun-ai/step3 | paid\nswitchpoint/router | paid\ntencent/hunyuan-a13b-instruct | paid\ntencent/hunyuan-a13b-instruct:free | free\nthedrummer/anubis-70b-v1.1 | paid\nthedrummer/anubis-pro-105b-v1 | paid\nthedrummer/rocinante-12b | paid\nthedrummer/skyfall-36b-v2 | paid\nthedrummer/unslopnemo-12b | paid\nthudm/glm-4.1v-9b-thinking | paid\nthudm/glm-z1-32b | paid\ntngtech/deepseek-r1t-chimera | paid\ntngtech/deepseek-r1t-chimera:free | free\ntngtech/deepseek-r1t2-chimera:free | free\nalibaba/tongyi-deepresearch-30b-a3b | paid\ncognitivecomputations/dolphin-mistral-24b-venice-edition:free | free\nmicrosoft/wizardlm-2-8x22b | paid\nx-ai/grok-3 | paid\nx-ai/grok-3-beta | paid\nx-ai/grok-3-mini | paid\nx-ai/grok-3-mini-beta | paid\nx-ai/grok-4 | paid\nx-ai/grok-4-fast:free | free\nx-ai/grok-code-fast-1 | paid\nz-ai/glm-4-32b | paid\nz-ai/glm-4.5 | paid\nz-ai/glm-4.5-air | paid\nz-ai/glm-4.5-air:free | free\nz-ai/glm-4.5v | paid\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenAI models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nbabbage-002\nchatgpt-4o-latest\ncodex-mini-latest\ndall-e-2\ndall-e-3\ndavinci-002\ngpt-3.5-turbo\ngpt-3.5-turbo-0125\ngpt-3.5-turbo-1106\ngpt-3.5-turbo-16k\ngpt-3.5-turbo-instruct\ngpt-3.5-turbo-instruct-0914\ngpt-4\ngpt-4-0125-preview\ngpt-4-0613\ngpt-4-1106-preview\ngpt-4-turbo\ngpt-4-turbo-2024-04-09\ngpt-4-turbo-preview\ngpt-4.1\ngpt-4.1-2025-04-14\ngpt-4.1-mini\ngpt-4.1-mini-2025-04-14\ngpt-4.1-nano\ngpt-4.1-nano-2025-04-14\ngpt-4o\ngpt-4o-2024-05-13\ngpt-4o-2024-08-06\ngpt-4o-2024-11-20\ngpt-4o-audio-preview\ngpt-4o-audio-preview-2024-10-01\ngpt-4o-audio-preview-2024-12-17\ngpt-4o-audio-preview-2025-06-03\ngpt-4o-mini\ngpt-4o-mini-2024-07-18\ngpt-4o-mini-audio-preview\ngpt-4o-mini-audio-preview-2024-12-17\ngpt-4o-mini-realtime-preview\ngpt-4o-mini-realtime-preview-2024-12-17\ngpt-4o-mini-search-preview\ngpt-4o-mini-search-preview-2025-03-11\ngpt-4o-mini-transcribe\ngpt-4o-mini-tts\ngpt-4o-realtime-preview\ngpt-4o-realtime-preview-2024-10-01\ngpt-4o-realtime-preview-2024-12-17\ngpt-4o-realtime-preview-2025-06-03\ngpt-4o-search-preview\ngpt-4o-search-preview-2025-03-11\ngpt-4o-transcribe\ngpt-5\ngpt-5-2025-08-07\ngpt-5-chat-latest\ngpt-5-mini\ngpt-5-mini-2025-08-07\ngpt-5-nano\ngpt-5-nano-2025-08-07\ngpt-audio\ngpt-audio-2025-08-28\ngpt-image-1\ngpt-realtime\ngpt-realtime-2025-08-28\no1\no1-2024-12-17\no1-mini\no1-mini-2024-09-12\no1-pro\no1-pro-2025-03-19\no3\no3-2025-04-16\no3-mini\no3-mini-2025-01-31\no4-mini\no4-mini-2025-04-16\no4-mini-deep-research\no4-mini-deep-research-2025-06-26\nomni-moderation-2024-09-26\nomni-moderation-latest\ntext-embedding-3-large\ntext-embedding-3-small\ntext-embedding-ada-002\ntts-1\ntts-1-1106\ntts-1-hd\ntts-1-hd-1106\nwhisper-1\n-----\n\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m Deepseek models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\ndeepseek-chat\ndeepseek-reasoner\n-----\n"
},
"router": {
"type": "string",
diff --git a/packages/kbot/schema_ui.json b/packages/kbot/schema_ui.json
index 2b1c6e9b..200cf80c 100644
--- a/packages/kbot/schema_ui.json
+++ b/packages/kbot/schema_ui.json
@@ -79,7 +79,7 @@
"ui:title": "Api_key"
},
"model": {
- "ui:description": "AI model to use for processing. Available models:\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenRouter models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nagentica-org/deepcoder-14b-preview | paid\nagentica-org/deepcoder-14b-preview:free | free\nai21/jamba-large-1.7 | paid\nai21/jamba-mini-1.7 | paid\naion-labs/aion-1.0 | paid\naion-labs/aion-1.0-mini | paid\naion-labs/aion-rp-llama-3.1-8b | paid\nalfredpros/codellama-7b-instruct-solidity | paid\nallenai/molmo-7b-d | paid\nallenai/olmo-2-0325-32b-instruct | paid\namazon/nova-lite-v1 | paid\namazon/nova-micro-v1 | paid\namazon/nova-pro-v1 | paid\nanthropic/claude-3-haiku | paid\nanthropic/claude-3-opus | paid\nanthropic/claude-3.5-haiku | paid\nanthropic/claude-3.5-haiku-20241022 | paid\nanthropic/claude-3.5-sonnet | paid\nanthropic/claude-3.5-sonnet-20240620 | paid\nanthropic/claude-3.7-sonnet | paid\nanthropic/claude-3.7-sonnet:thinking | paid\nanthropic/claude-opus-4 | paid\nanthropic/claude-opus-4.1 | paid\nanthropic/claude-sonnet-4 | paid\narcee-ai/coder-large | paid\narcee-ai/maestro-reasoning | paid\narcee-ai/spotlight | paid\narcee-ai/virtuoso-large | paid\narliai/qwq-32b-arliai-rpr-v1 | paid\narliai/qwq-32b-arliai-rpr-v1:free | free\nopenrouter/auto | paid\nbaidu/ernie-4.5-21b-a3b | paid\nbaidu/ernie-4.5-300b-a47b | paid\nbaidu/ernie-4.5-vl-28b-a3b | paid\nbaidu/ernie-4.5-vl-424b-a47b | paid\nbytedance/seed-oss-36b-instruct | paid\nbytedance/ui-tars-1.5-7b | paid\ndeepcogito/cogito-v2-preview-llama-109b-moe | paid\ncohere/command | paid\ncohere/command-a | paid\ncohere/command-r | paid\ncohere/command-r-03-2024 | paid\ncohere/command-r-08-2024 | paid\ncohere/command-r-plus | paid\ncohere/command-r-plus-04-2024 | paid\ncohere/command-r-plus-08-2024 | paid\ncohere/command-r7b-12-2024 | paid\ndeepcogito/cogito-v2-preview-deepseek-671b | paid\ndeepseek/deepseek-prover-v2 | paid\ndeepseek/deepseek-r1-0528-qwen3-8b | paid\ndeepseek/deepseek-r1-0528-qwen3-8b:free | free\ndeepseek/deepseek-chat | paid\ndeepseek/deepseek-chat-v3-0324 | paid\ndeepseek/deepseek-chat-v3-0324:free | free\ndeepseek/deepseek-chat-v3.1 | paid\ndeepseek/deepseek-chat-v3.1:free | free\ndeepseek/deepseek-v3.1-base | paid\ndeepseek/deepseek-r1 | paid\ndeepseek/deepseek-r1:free | free\ndeepseek/deepseek-r1-0528 | paid\ndeepseek/deepseek-r1-0528:free | free\ndeepseek/deepseek-r1-distill-llama-70b | paid\ndeepseek/deepseek-r1-distill-llama-70b:free | free\ndeepseek/deepseek-r1-distill-llama-8b | paid\ndeepseek/deepseek-r1-distill-qwen-14b | paid\ndeepseek/deepseek-r1-distill-qwen-14b:free | free\ndeepseek/deepseek-r1-distill-qwen-32b | paid\ncognitivecomputations/dolphin-mixtral-8x22b | paid\ncognitivecomputations/dolphin3.0-mistral-24b | paid\ncognitivecomputations/dolphin3.0-mistral-24b:free | free\ncognitivecomputations/dolphin3.0-r1-mistral-24b | paid\ncognitivecomputations/dolphin3.0-r1-mistral-24b:free | free\neleutherai/llemma_7b | paid\nalpindale/goliath-120b | paid\ngoogle/gemini-flash-1.5 | paid\ngoogle/gemini-flash-1.5-8b | paid\ngoogle/gemini-pro-1.5 | paid\ngoogle/gemini-2.0-flash-001 | paid\ngoogle/gemini-2.0-flash-exp:free | free\ngoogle/gemini-2.0-flash-lite-001 | paid\ngoogle/gemini-2.5-flash | paid\ngoogle/gemini-2.5-flash-image-preview | paid\ngoogle/gemini-2.5-flash-lite | paid\ngoogle/gemini-2.5-flash-lite-preview-06-17 | paid\ngoogle/gemini-2.5-pro | paid\ngoogle/gemini-2.5-pro-preview-05-06 | paid\ngoogle/gemini-2.5-pro-preview | paid\ngoogle/gemma-2-27b-it | paid\ngoogle/gemma-2-9b-it | paid\ngoogle/gemma-2-9b-it:free | free\ngoogle/gemma-3-12b-it | paid\ngoogle/gemma-3-12b-it:free | free\ngoogle/gemma-3-27b-it | paid\ngoogle/gemma-3-27b-it:free | free\ngoogle/gemma-3-4b-it | paid\ngoogle/gemma-3-4b-it:free | free\ngoogle/gemma-3n-e2b-it:free | free\ngoogle/gemma-3n-e4b-it | paid\ngoogle/gemma-3n-e4b-it:free | free\ninception/mercury | paid\ninception/mercury-coder | paid\ninflection/inflection-3-pi | paid\ninflection/inflection-3-productivity | paid\nliquid/lfm-3b | paid\nliquid/lfm-7b | paid\nmeta-llama/llama-guard-3-8b | paid\nanthracite-org/magnum-v2-72b | paid\nanthracite-org/magnum-v4-72b | paid\nmancer/weaver | paid\nmeituan/longcat-flash-chat | paid\nmeta-llama/llama-3-70b-instruct | paid\nmeta-llama/llama-3-8b-instruct | paid\nmeta-llama/llama-3.1-405b | paid\nmeta-llama/llama-3.1-405b-instruct | paid\nmeta-llama/llama-3.1-405b-instruct:free | free\nmeta-llama/llama-3.1-70b-instruct | paid\nmeta-llama/llama-3.1-8b-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct | paid\nmeta-llama/llama-3.2-1b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct:free | free\nmeta-llama/llama-3.2-90b-vision-instruct | paid\nmeta-llama/llama-3.3-70b-instruct | paid\nmeta-llama/llama-3.3-70b-instruct:free | free\nmeta-llama/llama-3.3-8b-instruct:free | free\nmeta-llama/llama-4-maverick | paid\nmeta-llama/llama-4-maverick:free | free\nmeta-llama/llama-4-scout | paid\nmeta-llama/llama-4-scout:free | free\nmeta-llama/llama-guard-4-12b | paid\nmeta-llama/llama-guard-2-8b | paid\nmicrosoft/mai-ds-r1 | paid\nmicrosoft/mai-ds-r1:free | free\nmicrosoft/phi-4 | paid\nmicrosoft/phi-4-multimodal-instruct | paid\nmicrosoft/phi-4-reasoning-plus | paid\nmicrosoft/phi-3-medium-128k-instruct | paid\nmicrosoft/phi-3-mini-128k-instruct | paid\nmicrosoft/phi-3.5-mini-128k-instruct | paid\nsophosympatheia/midnight-rose-70b | paid\nminimax/minimax-m1 | paid\nminimax/minimax-01 | paid\nmistralai/mistral-large | paid\nmistralai/mistral-large-2407 | paid\nmistralai/mistral-large-2411 | paid\nmistralai/mistral-small | paid\nmistralai/mistral-tiny | paid\nmistralai/codestral-2501 | paid\nmistralai/codestral-2508 | paid\nmistralai/devstral-medium | paid\nmistralai/devstral-small | paid\nmistralai/devstral-small-2505 | paid\nmistralai/devstral-small-2505:free | free\nmistralai/magistral-medium-2506 | paid\nmistralai/magistral-medium-2506:thinking | paid\nmistralai/magistral-small-2506 | paid\nmistralai/ministral-3b | paid\nmistralai/ministral-8b | paid\nmistralai/mistral-7b-instruct | paid\nmistralai/mistral-7b-instruct:free | free\nmistralai/mistral-7b-instruct-v0.1 | paid\nmistralai/mistral-7b-instruct-v0.3 | paid\nmistralai/mistral-medium-3 | paid\nmistralai/mistral-medium-3.1 | paid\nmistralai/mistral-nemo | paid\nmistralai/mistral-nemo:free | free\nmistralai/mistral-small-24b-instruct-2501 | paid\nmistralai/mistral-small-24b-instruct-2501:free | free\nmistralai/mistral-small-3.1-24b-instruct | paid\nmistralai/mistral-small-3.1-24b-instruct:free | free\nmistralai/mistral-small-3.2-24b-instruct | paid\nmistralai/mistral-small-3.2-24b-instruct:free | free\nmistralai/mixtral-8x22b-instruct | paid\nmistralai/mixtral-8x7b-instruct | paid\nmistralai/pixtral-12b | paid\nmistralai/pixtral-large-2411 | paid\nmistralai/mistral-saba | paid\nmoonshotai/kimi-dev-72b | paid\nmoonshotai/kimi-dev-72b:free | free\nmoonshotai/kimi-k2 | paid\nmoonshotai/kimi-k2:free | free\nmoonshotai/kimi-k2-0905 | paid\nmoonshotai/kimi-vl-a3b-thinking | paid\nmoonshotai/kimi-vl-a3b-thinking:free | free\nmorph/morph-v3-fast | paid\nmorph/morph-v3-large | paid\ngryphe/mythomax-l2-13b | paid\nneversleep/llama-3-lumimaid-70b | paid\nneversleep/llama-3.1-lumimaid-8b | paid\nneversleep/noromaid-20b | paid\nnousresearch/deephermes-3-llama-3-8b-preview:free | free\nnousresearch/deephermes-3-mistral-24b-preview | paid\nnousresearch/hermes-3-llama-3.1-405b | paid\nnousresearch/hermes-3-llama-3.1-70b | paid\nnousresearch/hermes-4-405b | paid\nnousresearch/hermes-4-70b | paid\nnousresearch/hermes-2-pro-llama-3-8b | paid\nnvidia/llama-3.1-nemotron-70b-instruct | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1 | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1:free | free\nnvidia/nemotron-nano-9b-v2 | paid\nnvidia/nemotron-nano-9b-v2:free | free\nopenai/chatgpt-4o-latest | paid\nopenai/codex-mini | paid\nopenai/gpt-3.5-turbo | paid\nopenai/gpt-3.5-turbo-0613 | paid\nopenai/gpt-3.5-turbo-16k | paid\nopenai/gpt-3.5-turbo-instruct | paid\nopenai/gpt-4 | paid\nopenai/gpt-4-0314 | paid\nopenai/gpt-4-turbo | paid\nopenai/gpt-4-1106-preview | paid\nopenai/gpt-4-turbo-preview | paid\nopenai/gpt-4.1 | paid\nopenai/gpt-4.1-mini | paid\nopenai/gpt-4.1-nano | paid\nopenai/gpt-4o | paid\nopenai/gpt-4o-2024-05-13 | paid\nopenai/gpt-4o-2024-08-06 | paid\nopenai/gpt-4o-2024-11-20 | paid\nopenai/gpt-4o:extended | paid\nopenai/gpt-4o-audio-preview | paid\nopenai/gpt-4o-search-preview | paid\nopenai/gpt-4o-mini | paid\nopenai/gpt-4o-mini-2024-07-18 | paid\nopenai/gpt-4o-mini-search-preview | paid\nopenai/gpt-5 | paid\nopenai/gpt-5-chat | paid\nopenai/gpt-5-mini | paid\nopenai/gpt-5-nano | paid\nopenai/gpt-oss-120b | paid\nopenai/gpt-oss-120b:free | free\nopenai/gpt-oss-20b | paid\nopenai/gpt-oss-20b:free | free\nopenai/o1 | paid\nopenai/o1-mini | paid\nopenai/o1-mini-2024-09-12 | paid\nopenai/o1-pro | paid\nopenai/o3 | paid\nopenai/o3-mini | paid\nopenai/o3-mini-high | paid\nopenai/o3-pro | paid\nopenai/o4-mini | paid\nopenai/o4-mini-high | paid\nperplexity/r1-1776 | paid\nperplexity/sonar | paid\nperplexity/sonar-deep-research | paid\nperplexity/sonar-pro | paid\nperplexity/sonar-reasoning | paid\nperplexity/sonar-reasoning-pro | paid\nqwen/qwen-plus-2025-07-28 | paid\nqwen/qwen-plus-2025-07-28:thinking | paid\nqwen/qwen-vl-max | paid\nqwen/qwen-vl-plus | paid\nqwen/qwen-max | paid\nqwen/qwen-plus | paid\nqwen/qwen-turbo | paid\nqwen/qwen2.5-vl-32b-instruct | paid\nqwen/qwen2.5-vl-32b-instruct:free | free\nqwen/qwen2.5-vl-72b-instruct | paid\nqwen/qwen2.5-vl-72b-instruct:free | free\nqwen/qwen-2.5-vl-7b-instruct | paid\nqwen/qwen3-14b | paid\nqwen/qwen3-14b:free | free\nqwen/qwen3-235b-a22b | paid\nqwen/qwen3-235b-a22b:free | free\nqwen/qwen3-235b-a22b-2507 | paid\nqwen/qwen3-235b-a22b-thinking-2507 | paid\nqwen/qwen3-30b-a3b | paid\nqwen/qwen3-30b-a3b:free | free\nqwen/qwen3-30b-a3b-instruct-2507 | paid\nqwen/qwen3-30b-a3b-thinking-2507 | paid\nqwen/qwen3-32b | paid\nqwen/qwen3-4b:free | free\nqwen/qwen3-8b | paid\nqwen/qwen3-8b:free | free\nqwen/qwen3-coder-30b-a3b-instruct | paid\nqwen/qwen3-coder | paid\nqwen/qwen3-coder:free | free\nqwen/qwen3-max | paid\nqwen/qwen3-next-80b-a3b-instruct | paid\nqwen/qwen3-next-80b-a3b-thinking | paid\nqwen/qwq-32b | paid\nqwen/qwq-32b:free | free\nqwen/qwq-32b-preview | paid\nqwen/qwen-2.5-72b-instruct | paid\nqwen/qwen-2.5-72b-instruct:free | free\nqwen/qwen-2.5-7b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct:free | free\nrekaai/reka-flash-3:free | free\nundi95/remm-slerp-l2-13b | paid\nsao10k/l3-lunaris-8b | paid\nsao10k/l3-euryale-70b | paid\nsao10k/l3.1-euryale-70b | paid\nsao10k/l3.3-euryale-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b:free | free\nopenrouter/sonoma-dusk-alpha | paid\nopenrouter/sonoma-sky-alpha | paid\nraifle/sorcererlm-8x22b | paid\nstepfun-ai/step3 | paid\nswitchpoint/router | paid\ntencent/hunyuan-a13b-instruct | paid\ntencent/hunyuan-a13b-instruct:free | free\nthedrummer/anubis-70b-v1.1 | paid\nthedrummer/anubis-pro-105b-v1 | paid\nthedrummer/rocinante-12b | paid\nthedrummer/skyfall-36b-v2 | paid\nthedrummer/unslopnemo-12b | paid\nthudm/glm-4-32b | paid\nthudm/glm-4.1v-9b-thinking | paid\nthudm/glm-z1-32b | paid\ntngtech/deepseek-r1t-chimera | paid\ntngtech/deepseek-r1t-chimera:free | free\ntngtech/deepseek-r1t2-chimera:free | free\ncognitivecomputations/dolphin-mistral-24b-venice-edition:free | free\nmicrosoft/wizardlm-2-8x22b | paid\nx-ai/grok-2-1212 | paid\nx-ai/grok-2-vision-1212 | paid\nx-ai/grok-3 | paid\nx-ai/grok-3-beta | paid\nx-ai/grok-3-mini | paid\nx-ai/grok-3-mini-beta | paid\nx-ai/grok-4 | paid\nx-ai/grok-code-fast-1 | paid\nz-ai/glm-4-32b | paid\nz-ai/glm-4.5 | paid\nz-ai/glm-4.5-air | paid\nz-ai/glm-4.5-air:free | free\nz-ai/glm-4.5v | paid\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenAI models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nbabbage-002\nchatgpt-4o-latest\ncodex-mini-latest\ndall-e-2\ndall-e-3\ndavinci-002\ngpt-3.5-turbo\ngpt-3.5-turbo-0125\ngpt-3.5-turbo-1106\ngpt-3.5-turbo-16k\ngpt-3.5-turbo-instruct\ngpt-3.5-turbo-instruct-0914\ngpt-4\ngpt-4-0125-preview\ngpt-4-0613\ngpt-4-1106-preview\ngpt-4-turbo\ngpt-4-turbo-2024-04-09\ngpt-4-turbo-preview\ngpt-4.1\ngpt-4.1-2025-04-14\ngpt-4.1-mini\ngpt-4.1-mini-2025-04-14\ngpt-4.1-nano\ngpt-4.1-nano-2025-04-14\ngpt-4o\ngpt-4o-2024-05-13\ngpt-4o-2024-08-06\ngpt-4o-2024-11-20\ngpt-4o-audio-preview\ngpt-4o-audio-preview-2024-10-01\ngpt-4o-audio-preview-2024-12-17\ngpt-4o-audio-preview-2025-06-03\ngpt-4o-mini\ngpt-4o-mini-2024-07-18\ngpt-4o-mini-audio-preview\ngpt-4o-mini-audio-preview-2024-12-17\ngpt-4o-mini-realtime-preview\ngpt-4o-mini-realtime-preview-2024-12-17\ngpt-4o-mini-search-preview\ngpt-4o-mini-search-preview-2025-03-11\ngpt-4o-mini-transcribe\ngpt-4o-mini-tts\ngpt-4o-realtime-preview\ngpt-4o-realtime-preview-2024-10-01\ngpt-4o-realtime-preview-2024-12-17\ngpt-4o-realtime-preview-2025-06-03\ngpt-4o-search-preview\ngpt-4o-search-preview-2025-03-11\ngpt-4o-transcribe\ngpt-5\ngpt-5-2025-08-07\ngpt-5-chat-latest\ngpt-5-mini\ngpt-5-mini-2025-08-07\ngpt-5-nano\ngpt-5-nano-2025-08-07\ngpt-audio\ngpt-audio-2025-08-28\ngpt-image-1\ngpt-realtime\ngpt-realtime-2025-08-28\no1\no1-2024-12-17\no1-mini\no1-mini-2024-09-12\no1-pro\no1-pro-2025-03-19\no3\no3-2025-04-16\no3-mini\no3-mini-2025-01-31\no4-mini\no4-mini-2025-04-16\no4-mini-deep-research\no4-mini-deep-research-2025-06-26\nomni-moderation-2024-09-26\nomni-moderation-latest\ntext-embedding-3-large\ntext-embedding-3-small\ntext-embedding-ada-002\ntts-1\ntts-1-1106\ntts-1-hd\ntts-1-hd-1106\nwhisper-1\n-----\n\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m Deepseek models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\ndeepseek-chat\ndeepseek-reasoner\n-----\n",
+ "ui:description": "AI model to use for processing. Available models:\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenRouter models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nagentica-org/deepcoder-14b-preview | paid\nagentica-org/deepcoder-14b-preview:free | free\nai21/jamba-large-1.7 | paid\nai21/jamba-mini-1.7 | paid\naion-labs/aion-1.0 | paid\naion-labs/aion-1.0-mini | paid\naion-labs/aion-rp-llama-3.1-8b | paid\nalfredpros/codellama-7b-instruct-solidity | paid\nallenai/molmo-7b-d | paid\nallenai/olmo-2-0325-32b-instruct | paid\namazon/nova-lite-v1 | paid\namazon/nova-micro-v1 | paid\namazon/nova-pro-v1 | paid\nanthropic/claude-3-haiku | paid\nanthropic/claude-3-opus | paid\nanthropic/claude-3.5-haiku | paid\nanthropic/claude-3.5-haiku-20241022 | paid\nanthropic/claude-3.5-sonnet | paid\nanthropic/claude-3.5-sonnet-20240620 | paid\nanthropic/claude-3.7-sonnet | paid\nanthropic/claude-3.7-sonnet:thinking | paid\nanthropic/claude-opus-4 | paid\nanthropic/claude-opus-4.1 | paid\nanthropic/claude-sonnet-4 | paid\narcee-ai/afm-4.5b | paid\narcee-ai/coder-large | paid\narcee-ai/maestro-reasoning | paid\narcee-ai/spotlight | paid\narcee-ai/virtuoso-large | paid\narliai/qwq-32b-arliai-rpr-v1 | paid\narliai/qwq-32b-arliai-rpr-v1:free | free\nopenrouter/auto | paid\nbaidu/ernie-4.5-21b-a3b | paid\nbaidu/ernie-4.5-300b-a47b | paid\nbaidu/ernie-4.5-vl-28b-a3b | paid\nbaidu/ernie-4.5-vl-424b-a47b | paid\nbytedance/seed-oss-36b-instruct | paid\nbytedance/ui-tars-1.5-7b | paid\ndeepcogito/cogito-v2-preview-llama-109b-moe | paid\ncohere/command | paid\ncohere/command-a | paid\ncohere/command-r | paid\ncohere/command-r-03-2024 | paid\ncohere/command-r-08-2024 | paid\ncohere/command-r-plus | paid\ncohere/command-r-plus-04-2024 | paid\ncohere/command-r-plus-08-2024 | paid\ncohere/command-r7b-12-2024 | paid\ndeepcogito/cogito-v2-preview-deepseek-671b | paid\ndeepseek/deepseek-prover-v2 | paid\ndeepseek/deepseek-r1-0528-qwen3-8b | paid\ndeepseek/deepseek-r1-0528-qwen3-8b:free | free\ndeepseek/deepseek-chat | paid\ndeepseek/deepseek-chat-v3-0324 | paid\ndeepseek/deepseek-chat-v3-0324:free | free\ndeepseek/deepseek-chat-v3.1 | paid\ndeepseek/deepseek-chat-v3.1:free | free\ndeepseek/deepseek-v3.1-base | paid\ndeepseek/deepseek-r1 | paid\ndeepseek/deepseek-r1:free | free\ndeepseek/deepseek-r1-0528 | paid\ndeepseek/deepseek-r1-0528:free | free\ndeepseek/deepseek-r1-distill-llama-70b | paid\ndeepseek/deepseek-r1-distill-llama-70b:free | free\ndeepseek/deepseek-r1-distill-llama-8b | paid\ndeepseek/deepseek-r1-distill-qwen-14b | paid\ndeepseek/deepseek-r1-distill-qwen-32b | paid\ncognitivecomputations/dolphin3.0-mistral-24b | paid\ncognitivecomputations/dolphin3.0-mistral-24b:free | free\ncognitivecomputations/dolphin3.0-r1-mistral-24b | paid\ncognitivecomputations/dolphin3.0-r1-mistral-24b:free | free\neleutherai/llemma_7b | paid\nalpindale/goliath-120b | paid\ngoogle/gemini-flash-1.5 | paid\ngoogle/gemini-flash-1.5-8b | paid\ngoogle/gemini-pro-1.5 | paid\ngoogle/gemini-2.0-flash-001 | paid\ngoogle/gemini-2.0-flash-exp:free | free\ngoogle/gemini-2.0-flash-lite-001 | paid\ngoogle/gemini-2.5-flash | paid\ngoogle/gemini-2.5-flash-image-preview | paid\ngoogle/gemini-2.5-flash-lite | paid\ngoogle/gemini-2.5-flash-lite-preview-06-17 | paid\ngoogle/gemini-2.5-pro | paid\ngoogle/gemini-2.5-pro-preview-05-06 | paid\ngoogle/gemini-2.5-pro-preview | paid\ngoogle/gemma-2-27b-it | paid\ngoogle/gemma-2-9b-it | paid\ngoogle/gemma-2-9b-it:free | free\ngoogle/gemma-3-12b-it | paid\ngoogle/gemma-3-12b-it:free | free\ngoogle/gemma-3-27b-it | paid\ngoogle/gemma-3-27b-it:free | free\ngoogle/gemma-3-4b-it | paid\ngoogle/gemma-3-4b-it:free | free\ngoogle/gemma-3n-e2b-it:free | free\ngoogle/gemma-3n-e4b-it | paid\ngoogle/gemma-3n-e4b-it:free | free\ninception/mercury | paid\ninception/mercury-coder | paid\ninflection/inflection-3-pi | paid\ninflection/inflection-3-productivity | paid\nliquid/lfm-3b | paid\nliquid/lfm-7b | paid\nmeta-llama/llama-guard-3-8b | paid\nanthracite-org/magnum-v2-72b | paid\nanthracite-org/magnum-v4-72b | paid\nmancer/weaver | paid\nmeituan/longcat-flash-chat | paid\nmeta-llama/llama-3-70b-instruct | paid\nmeta-llama/llama-3-8b-instruct | paid\nmeta-llama/llama-3.1-405b | paid\nmeta-llama/llama-3.1-405b-instruct | paid\nmeta-llama/llama-3.1-405b-instruct:free | free\nmeta-llama/llama-3.1-70b-instruct | paid\nmeta-llama/llama-3.1-8b-instruct | paid\nmeta-llama/llama-3.2-11b-vision-instruct | paid\nmeta-llama/llama-3.2-1b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct | paid\nmeta-llama/llama-3.2-3b-instruct:free | free\nmeta-llama/llama-3.2-90b-vision-instruct | paid\nmeta-llama/llama-3.3-70b-instruct | paid\nmeta-llama/llama-3.3-70b-instruct:free | free\nmeta-llama/llama-3.3-8b-instruct:free | free\nmeta-llama/llama-4-maverick | paid\nmeta-llama/llama-4-maverick:free | free\nmeta-llama/llama-4-scout | paid\nmeta-llama/llama-4-scout:free | free\nmeta-llama/llama-guard-4-12b | paid\nmeta-llama/llama-guard-2-8b | paid\nmicrosoft/mai-ds-r1 | paid\nmicrosoft/mai-ds-r1:free | free\nmicrosoft/phi-4 | paid\nmicrosoft/phi-4-multimodal-instruct | paid\nmicrosoft/phi-4-reasoning-plus | paid\nmicrosoft/phi-3-medium-128k-instruct | paid\nmicrosoft/phi-3-mini-128k-instruct | paid\nmicrosoft/phi-3.5-mini-128k-instruct | paid\nminimax/minimax-m1 | paid\nminimax/minimax-01 | paid\nmistralai/mistral-large | paid\nmistralai/mistral-large-2407 | paid\nmistralai/mistral-large-2411 | paid\nmistralai/mistral-small | paid\nmistralai/mistral-tiny | paid\nmistralai/codestral-2501 | paid\nmistralai/codestral-2508 | paid\nmistralai/devstral-medium | paid\nmistralai/devstral-small | paid\nmistralai/devstral-small-2505 | paid\nmistralai/devstral-small-2505:free | free\nmistralai/magistral-medium-2506 | paid\nmistralai/magistral-medium-2506:thinking | paid\nmistralai/magistral-small-2506 | paid\nmistralai/ministral-3b | paid\nmistralai/ministral-8b | paid\nmistralai/mistral-7b-instruct | paid\nmistralai/mistral-7b-instruct:free | free\nmistralai/mistral-7b-instruct-v0.1 | paid\nmistralai/mistral-7b-instruct-v0.3 | paid\nmistralai/mistral-medium-3 | paid\nmistralai/mistral-medium-3.1 | paid\nmistralai/mistral-nemo | paid\nmistralai/mistral-nemo:free | free\nmistralai/mistral-small-24b-instruct-2501 | paid\nmistralai/mistral-small-24b-instruct-2501:free | free\nmistralai/mistral-small-3.1-24b-instruct | paid\nmistralai/mistral-small-3.1-24b-instruct:free | free\nmistralai/mistral-small-3.2-24b-instruct | paid\nmistralai/mistral-small-3.2-24b-instruct:free | free\nmistralai/mixtral-8x22b-instruct | paid\nmistralai/mixtral-8x7b-instruct | paid\nmistralai/pixtral-12b | paid\nmistralai/pixtral-large-2411 | paid\nmistralai/mistral-saba | paid\nmoonshotai/kimi-dev-72b | paid\nmoonshotai/kimi-dev-72b:free | free\nmoonshotai/kimi-k2 | paid\nmoonshotai/kimi-k2:free | free\nmoonshotai/kimi-k2-0905 | paid\nmoonshotai/kimi-vl-a3b-thinking | paid\nmoonshotai/kimi-vl-a3b-thinking:free | free\nmorph/morph-v3-fast | paid\nmorph/morph-v3-large | paid\ngryphe/mythomax-l2-13b | paid\nneversleep/llama-3-lumimaid-70b | paid\nneversleep/llama-3.1-lumimaid-8b | paid\nneversleep/noromaid-20b | paid\nnousresearch/deephermes-3-llama-3-8b-preview:free | free\nnousresearch/deephermes-3-mistral-24b-preview | paid\nnousresearch/hermes-3-llama-3.1-405b | paid\nnousresearch/hermes-3-llama-3.1-70b | paid\nnousresearch/hermes-4-405b | paid\nnousresearch/hermes-4-70b | paid\nnousresearch/hermes-2-pro-llama-3-8b | paid\nnvidia/llama-3.1-nemotron-70b-instruct | paid\nnvidia/llama-3.1-nemotron-ultra-253b-v1 | paid\nnvidia/nemotron-nano-9b-v2 | paid\nnvidia/nemotron-nano-9b-v2:free | free\nopenai/chatgpt-4o-latest | paid\nopenai/codex-mini | paid\nopenai/gpt-3.5-turbo | paid\nopenai/gpt-3.5-turbo-0613 | paid\nopenai/gpt-3.5-turbo-16k | paid\nopenai/gpt-3.5-turbo-instruct | paid\nopenai/gpt-4 | paid\nopenai/gpt-4-0314 | paid\nopenai/gpt-4-turbo | paid\nopenai/gpt-4-1106-preview | paid\nopenai/gpt-4-turbo-preview | paid\nopenai/gpt-4.1 | paid\nopenai/gpt-4.1-mini | paid\nopenai/gpt-4.1-nano | paid\nopenai/gpt-4o | paid\nopenai/gpt-4o-2024-05-13 | paid\nopenai/gpt-4o-2024-08-06 | paid\nopenai/gpt-4o-2024-11-20 | paid\nopenai/gpt-4o:extended | paid\nopenai/gpt-4o-audio-preview | paid\nopenai/gpt-4o-search-preview | paid\nopenai/gpt-4o-mini | paid\nopenai/gpt-4o-mini-2024-07-18 | paid\nopenai/gpt-4o-mini-search-preview | paid\nopenai/gpt-5 | paid\nopenai/gpt-5-chat | paid\nopenai/gpt-5-mini | paid\nopenai/gpt-5-nano | paid\nopenai/gpt-oss-120b | paid\nopenai/gpt-oss-120b:free | free\nopenai/gpt-oss-20b | paid\nopenai/gpt-oss-20b:free | free\nopenai/o1 | paid\nopenai/o1-mini | paid\nopenai/o1-mini-2024-09-12 | paid\nopenai/o1-pro | paid\nopenai/o3 | paid\nopenai/o3-mini | paid\nopenai/o3-mini-high | paid\nopenai/o3-pro | paid\nopenai/o4-mini | paid\nopenai/o4-mini-high | paid\nopengvlab/internvl3-78b | paid\nperplexity/r1-1776 | paid\nperplexity/sonar | paid\nperplexity/sonar-deep-research | paid\nperplexity/sonar-pro | paid\nperplexity/sonar-reasoning | paid\nperplexity/sonar-reasoning-pro | paid\nqwen/qwen-plus-2025-07-28 | paid\nqwen/qwen-plus-2025-07-28:thinking | paid\nqwen/qwen-vl-max | paid\nqwen/qwen-vl-plus | paid\nqwen/qwen-max | paid\nqwen/qwen-plus | paid\nqwen/qwen-turbo | paid\nqwen/qwen2.5-vl-32b-instruct | paid\nqwen/qwen2.5-vl-32b-instruct:free | free\nqwen/qwen2.5-vl-72b-instruct | paid\nqwen/qwen2.5-vl-72b-instruct:free | free\nqwen/qwen-2.5-vl-7b-instruct | paid\nqwen/qwen3-14b | paid\nqwen/qwen3-14b:free | free\nqwen/qwen3-235b-a22b | paid\nqwen/qwen3-235b-a22b:free | free\nqwen/qwen3-235b-a22b-2507 | paid\nqwen/qwen3-235b-a22b-thinking-2507 | paid\nqwen/qwen3-30b-a3b | paid\nqwen/qwen3-30b-a3b:free | free\nqwen/qwen3-30b-a3b-instruct-2507 | paid\nqwen/qwen3-30b-a3b-thinking-2507 | paid\nqwen/qwen3-32b | paid\nqwen/qwen3-4b:free | free\nqwen/qwen3-8b | paid\nqwen/qwen3-8b:free | free\nqwen/qwen3-coder-30b-a3b-instruct | paid\nqwen/qwen3-coder | paid\nqwen/qwen3-coder:free | free\nqwen/qwen3-coder-flash | paid\nqwen/qwen3-coder-plus | paid\nqwen/qwen3-max | paid\nqwen/qwen3-next-80b-a3b-instruct | paid\nqwen/qwen3-next-80b-a3b-thinking | paid\nqwen/qwq-32b | paid\nqwen/qwq-32b:free | free\nqwen/qwq-32b-preview | paid\nqwen/qwen-2.5-72b-instruct | paid\nqwen/qwen-2.5-72b-instruct:free | free\nqwen/qwen-2.5-7b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct | paid\nqwen/qwen-2.5-coder-32b-instruct:free | free\nundi95/remm-slerp-l2-13b | paid\nsao10k/l3-lunaris-8b | paid\nsao10k/l3-euryale-70b | paid\nsao10k/l3.1-euryale-70b | paid\nsao10k/l3.3-euryale-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b | paid\nshisa-ai/shisa-v2-llama3.3-70b:free | free\nraifle/sorcererlm-8x22b | paid\nstepfun-ai/step3 | paid\nswitchpoint/router | paid\ntencent/hunyuan-a13b-instruct | paid\ntencent/hunyuan-a13b-instruct:free | free\nthedrummer/anubis-70b-v1.1 | paid\nthedrummer/anubis-pro-105b-v1 | paid\nthedrummer/rocinante-12b | paid\nthedrummer/skyfall-36b-v2 | paid\nthedrummer/unslopnemo-12b | paid\nthudm/glm-4.1v-9b-thinking | paid\nthudm/glm-z1-32b | paid\ntngtech/deepseek-r1t-chimera | paid\ntngtech/deepseek-r1t-chimera:free | free\ntngtech/deepseek-r1t2-chimera:free | free\nalibaba/tongyi-deepresearch-30b-a3b | paid\ncognitivecomputations/dolphin-mistral-24b-venice-edition:free | free\nmicrosoft/wizardlm-2-8x22b | paid\nx-ai/grok-3 | paid\nx-ai/grok-3-beta | paid\nx-ai/grok-3-mini | paid\nx-ai/grok-3-mini-beta | paid\nx-ai/grok-4 | paid\nx-ai/grok-4-fast:free | free\nx-ai/grok-code-fast-1 | paid\nz-ai/glm-4-32b | paid\nz-ai/glm-4.5 | paid\nz-ai/glm-4.5-air | paid\nz-ai/glm-4.5-air:free | free\nz-ai/glm-4.5v | paid\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m OpenAI models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\nbabbage-002\nchatgpt-4o-latest\ncodex-mini-latest\ndall-e-2\ndall-e-3\ndavinci-002\ngpt-3.5-turbo\ngpt-3.5-turbo-0125\ngpt-3.5-turbo-1106\ngpt-3.5-turbo-16k\ngpt-3.5-turbo-instruct\ngpt-3.5-turbo-instruct-0914\ngpt-4\ngpt-4-0125-preview\ngpt-4-0613\ngpt-4-1106-preview\ngpt-4-turbo\ngpt-4-turbo-2024-04-09\ngpt-4-turbo-preview\ngpt-4.1\ngpt-4.1-2025-04-14\ngpt-4.1-mini\ngpt-4.1-mini-2025-04-14\ngpt-4.1-nano\ngpt-4.1-nano-2025-04-14\ngpt-4o\ngpt-4o-2024-05-13\ngpt-4o-2024-08-06\ngpt-4o-2024-11-20\ngpt-4o-audio-preview\ngpt-4o-audio-preview-2024-10-01\ngpt-4o-audio-preview-2024-12-17\ngpt-4o-audio-preview-2025-06-03\ngpt-4o-mini\ngpt-4o-mini-2024-07-18\ngpt-4o-mini-audio-preview\ngpt-4o-mini-audio-preview-2024-12-17\ngpt-4o-mini-realtime-preview\ngpt-4o-mini-realtime-preview-2024-12-17\ngpt-4o-mini-search-preview\ngpt-4o-mini-search-preview-2025-03-11\ngpt-4o-mini-transcribe\ngpt-4o-mini-tts\ngpt-4o-realtime-preview\ngpt-4o-realtime-preview-2024-10-01\ngpt-4o-realtime-preview-2024-12-17\ngpt-4o-realtime-preview-2025-06-03\ngpt-4o-search-preview\ngpt-4o-search-preview-2025-03-11\ngpt-4o-transcribe\ngpt-5\ngpt-5-2025-08-07\ngpt-5-chat-latest\ngpt-5-mini\ngpt-5-mini-2025-08-07\ngpt-5-nano\ngpt-5-nano-2025-08-07\ngpt-audio\ngpt-audio-2025-08-28\ngpt-image-1\ngpt-realtime\ngpt-realtime-2025-08-28\no1\no1-2024-12-17\no1-mini\no1-mini-2024-09-12\no1-pro\no1-pro-2025-03-19\no3\no3-2025-04-16\no3-mini\no3-mini-2025-01-31\no4-mini\no4-mini-2025-04-16\no4-mini-deep-research\no4-mini-deep-research-2025-06-26\nomni-moderation-2024-09-26\nomni-moderation-latest\ntext-embedding-3-large\ntext-embedding-3-small\ntext-embedding-ada-002\ntts-1\ntts-1-1106\ntts-1-hd\ntts-1-hd-1106\nwhisper-1\n-----\n\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m Deepseek models:\u001b[22m\u001b[39m\n\u001b[35m\u001b[1m\u001b[22m\u001b[39m\ndeepseek-chat\ndeepseek-reasoner\n-----\n",
"ui:title": "Model"
},
"router": {
diff --git a/packages/kbot/src/commands/images.ts b/packages/kbot/src/commands/images.ts
index 1fdfc8ad..25dd7933 100644
--- a/packages/kbot/src/commands/images.ts
+++ b/packages/kbot/src/commands/images.ts
@@ -253,11 +253,13 @@ async function launchGuiAndGetPrompt(argv: any): Promise {
} else if (message.type === 'generate_request') {
logger.info('π¨ Received generation request from GUI');
+ // Extract variables outside try block for error handling
+ const genPrompt = message.prompt;
+ const genFiles = message.files || [];
+ const genDst = message.dst;
+
// Process the generation request using our existing image generation logic
try {
- const genPrompt = message.prompt;
- const genFiles = message.files || [];
- const genDst = message.dst;
const finalDstPath = generateUniqueFilename(genDst, genFiles);
logger.info(`π Determined destination path for generated image: ${finalDstPath}`);
@@ -316,12 +318,28 @@ async function launchGuiAndGetPrompt(argv: any): Promise {
tauriProcess.stdin?.write(JSON.stringify(errorResponse) + '\n');
}
} catch (error) {
- logger.error('β Generation error:', error.message);
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ const errorStack = error instanceof Error ? error.stack : undefined;
+
+ console.log('π΄ Generation error:', error,errorMessage);
- // Send error back to GUI
+ logger.error('β Generation error:', {
+ message: errorMessage,
+ stack: errorStack,
+ prompt: genPrompt?.substring(0, 100) + '...',
+ fileCount: genFiles?.length || 0,
+ files: genFiles?.map(f => path.basename(f))
+ });
+
+ // Send detailed error back to GUI
const errorResponse = {
cmd: 'generation_error',
- error: error.message
+ error: errorMessage,
+ details: {
+ prompt: genPrompt?.substring(0, 100) + '...',
+ fileCount: genFiles?.length || 0,
+ timestamp: new Date().toISOString()
+ }
};
tauriProcess.stdin?.write(JSON.stringify(errorResponse) + '\n');
}
diff --git a/packages/kbot/src/lib/images-google.ts b/packages/kbot/src/lib/images-google.ts
index 108dcb7c..f4777a5e 100644
--- a/packages/kbot/src/lib/images-google.ts
+++ b/packages/kbot/src/lib/images-google.ts
@@ -33,20 +33,90 @@ export const createImage = async (prompt: string, options: IKBotOptions): Promis
const model = ai.getGenerativeModel({ model: options.model || 'gemini-2.5-flash-image-preview' });
- const result = await model.generateContent(prompt);
-
- const response = result.response;
- const parts = response.candidates[0].content.parts;
- for (const part of parts) {
- if ('inlineData' in part) {
- const inlineData = part.inlineData;
- if (inlineData) {
- return Buffer.from(inlineData.data, "base64");
+ try {
+ const result = await model.generateContent(prompt);
+
+ const response = result.response;
+ logger.debug('Google AI API response structure:', {
+ hasResponse: !!response,
+ hasCandidates: !!response?.candidates,
+ candidatesLength: response?.candidates?.length,
+ fullResponse: JSON.stringify(response, null, 2)
+ });
+
+ if (!response || !response.candidates || response.candidates.length === 0) {
+ logger.error('Invalid API response structure - no candidates found', {
+ response: JSON.stringify(response, null, 2)
+ });
+ throw new Error('No candidates returned from Google AI API. The content may have been blocked due to safety filters or other restrictions.');
+ }
+
+ const candidate = response.candidates[0];
+
+ // Check for safety filter rejections first
+ if (candidate.finishReason && candidate.finishReason !== 'STOP') {
+ const finishReasonMessages = {
+ 'IMAGE_SAFETY': 'Content blocked by image safety filters. The image or prompt contains content that violates Google AI safety policies.',
+ 'SAFETY': 'Content blocked by safety filters. The prompt contains content that violates Google AI safety policies.',
+ 'RECITATION': 'Content blocked due to recitation concerns. The generated content may be too similar to existing copyrighted material.',
+ 'OTHER': 'Content generation stopped for other safety or policy reasons.'
+ };
+
+ const message = finishReasonMessages[candidate.finishReason] ||
+ `Content generation stopped. Reason: ${candidate.finishReason}`;
+
+ logger.error('Google AI blocked content due to safety filters:', {
+ finishReason: candidate.finishReason,
+ rejectionMessage: message,
+ candidate: JSON.stringify(candidate, null, 2)
+ });
+ throw new Error(`Request blocked by Google AI: ${message}`);
+ }
+
+ if (!candidate.content || !candidate.content.parts) {
+ logger.error('Invalid candidate structure - no content parts found', {
+ candidate: JSON.stringify(candidate, null, 2)
+ });
+ throw new Error('Invalid response structure from Google AI API - no content parts found.');
+ }
+
+ const parts = candidate.content.parts;
+ for (const part of parts) {
+ if ('inlineData' in part) {
+ const inlineData = part.inlineData;
+ if (inlineData) {
+ return Buffer.from(inlineData.data, "base64");
+ }
+ } else if ('text' in part && part.text) {
+ // Check if this is a rejection message
+ const text = part.text.toLowerCase();
+ if (text.includes('cannot fulfill') || text.includes('not able to create') ||
+ text.includes('unable to generate') || text.includes('cannot generate') ||
+ text.includes('cannot create') || text.includes('not appropriate')) {
+ logger.error('Google AI rejected the request:', {
+ rejectionMessage: part.text,
+ finishReason: candidate.finishReason
+ });
+ throw new Error(`Request rejected by Google AI: ${part.text}`);
+ }
}
}
+
+ logger.warn('No image data found in API response parts', {
+ partsCount: parts.length,
+ parts: JSON.stringify(parts, null, 2),
+ finishReason: candidate.finishReason
+ });
+ throw new Error('No image data found in API response. The model may not have generated an image.');
+
+ } catch (error) {
+ logger.error('Google AI API error in createImage:', {
+ error: error.message,
+ stack: error.stack,
+ prompt: prompt.substring(0, 100) + '...'
+ });
+ throw error; // Re-throw to let the caller handle it
}
-
- return null;
}
export const editImage = async (prompt: string, imagePaths: string[], options: IKBotOptions): Promise => {
@@ -57,34 +127,115 @@ export const editImage = async (prompt: string, imagePaths: string[], options: I
const model = ai.getGenerativeModel({ model: options.model || 'gemini-2.5-flash-image-preview' });
- const imageParts: Part[] = imagePaths.map(imagePath => {
- const imageData = fs.readFileSync(imagePath);
- const base64Image = imageData.toString("base64");
- const mimeType = lookup(imagePath) || 'image/png';
- return {
- inlineData: {
- mimeType,
- data: base64Image,
- },
- };
- });
+ try {
+ const imageParts: Part[] = imagePaths.map(imagePath => {
+ const imageData = fs.readFileSync(imagePath);
+ const base64Image = imageData.toString("base64");
+ const mimeType = lookup(imagePath) || 'image/png';
+ return {
+ inlineData: {
+ mimeType,
+ data: base64Image,
+ },
+ };
+ });
- const textPart: Part = { text: prompt };
+ const textPart: Part = { text: prompt };
+ const promptParts = [...imageParts, textPart];
- const promptParts = [...imageParts, textPart];
+ const result = await model.generateContent(promptParts);
+
+ const response = result.response;
+ logger.debug('Google AI API response structure (editImage):', {
+ hasResponse: !!response,
+ hasCandidates: !!response?.candidates,
+ candidatesLength: response?.candidates?.length,
+ fullResponse: JSON.stringify(response, null, 2)
+ });
- const result = await model.generateContent(promptParts);
-
- const response = result.response;
- const parts = response.candidates[0].content.parts;
- for (const part of parts) {
- if ('inlineData' in part) {
- const inlineData = part.inlineData;
- if (inlineData) {
- return Buffer.from(inlineData.data, "base64");
+ if (!response || !response.candidates || response.candidates.length === 0) {
+ logger.error('Invalid API response structure - no candidates found (editImage)', {
+ response: JSON.stringify(response, null, 2),
+ prompt: prompt.substring(0, 100) + '...',
+ imageCount: imagePaths.length
+ });
+ throw new Error('No candidates returned from Google AI API. The content may have been blocked due to safety filters or other restrictions.');
+ }
+
+ const candidate = response.candidates[0];
+
+ // Check for safety filter rejections first
+ if (candidate.finishReason && candidate.finishReason !== 'STOP') {
+ const finishReasonMessages = {
+ 'IMAGE_SAFETY': 'Content blocked by image safety filters. The image or prompt contains content that violates Google AI safety policies.',
+ 'SAFETY': 'Content blocked by safety filters. The prompt contains content that violates Google AI safety policies.',
+ 'RECITATION': 'Content blocked due to recitation concerns. The generated content may be too similar to existing copyrighted material.',
+ 'OTHER': 'Content generation stopped for other safety or policy reasons.'
+ };
+
+ const message = finishReasonMessages[candidate.finishReason] ||
+ `Content generation stopped. Reason: ${candidate.finishReason}`;
+
+ logger.error('Google AI blocked image edit due to safety filters:', {
+ finishReason: candidate.finishReason,
+ rejectionMessage: message,
+ candidate: JSON.stringify(candidate, null, 2),
+ prompt: prompt.substring(0, 100) + '...',
+ imageCount: imagePaths.length
+ });
+ throw new Error(`Request blocked by Google AI: ${message}`);
+ }
+
+ if (!candidate.content || !candidate.content.parts) {
+ logger.error('Invalid candidate structure - no content parts found (editImage)', {
+ candidate: JSON.stringify(candidate, null, 2),
+ prompt: prompt.substring(0, 100) + '...',
+ imageCount: imagePaths.length
+ });
+ throw new Error('Invalid response structure from Google AI API - no content parts found.');
+ }
+
+ const parts = candidate.content.parts;
+ for (const part of parts) {
+ if ('inlineData' in part) {
+ const inlineData = part.inlineData;
+ if (inlineData) {
+ return Buffer.from(inlineData.data, "base64");
+ }
+ } else if ('text' in part && part.text) {
+ // Check if this is a rejection message
+ const text = part.text.toLowerCase();
+ if (text.includes('cannot fulfill') || text.includes('not able to create') ||
+ text.includes('unable to generate') || text.includes('cannot generate') ||
+ text.includes('cannot create') || text.includes('not appropriate')) {
+ logger.error('Google AI rejected the image edit request:', {
+ rejectionMessage: part.text,
+ finishReason: candidate.finishReason,
+ prompt: prompt.substring(0, 100) + '...',
+ imageCount: imagePaths.length
+ });
+ throw new Error(`Request rejected by Google AI: ${part.text}`);
+ }
}
}
- }
- return null;
+ logger.warn('No image data found in API response parts (editImage)', {
+ partsCount: parts.length,
+ parts: JSON.stringify(parts, null, 2),
+ prompt: prompt.substring(0, 100) + '...',
+ imageCount: imagePaths.length,
+ finishReason: candidate.finishReason
+ });
+ throw new Error('No image data found in API response. The model may not have generated an image.');
+
+ } catch (error) {
+ logger.error('Google AI API error in editImage:', {
+ error: error.message,
+ stack: error.stack,
+ prompt: prompt.substring(0, 100) + '...',
+ imageCount: imagePaths.length,
+ imagePaths: imagePaths.map(p => p.split(/[/\\]/).pop())
+ });
+ throw error; // Re-throw to let the caller handle it
+ }
}
diff --git a/packages/kbot/src/models/cache/openrouter-models-free.ts b/packages/kbot/src/models/cache/openrouter-models-free.ts
index f1c249b1..ad786b99 100644
--- a/packages/kbot/src/models/cache/openrouter-models-free.ts
+++ b/packages/kbot/src/models/cache/openrouter-models-free.ts
@@ -1,7 +1,6 @@
export enum E_OPENROUTER_MODEL_FREE {
+ MODEL_FREE_X_AI_GROK_4_FAST_FREE = "x-ai/grok-4-fast:free",
MODEL_FREE_NVIDIA_NEMOTRON_NANO_9B_V2_FREE = "nvidia/nemotron-nano-9b-v2:free",
- MODEL_FREE_OPENROUTER_SONOMA_DUSK_ALPHA = "openrouter/sonoma-dusk-alpha",
- MODEL_FREE_OPENROUTER_SONOMA_SKY_ALPHA = "openrouter/sonoma-sky-alpha",
MODEL_FREE_DEEPSEEK_DEEPSEEK_CHAT_V3_1_FREE = "deepseek/deepseek-chat-v3.1:free",
MODEL_FREE_OPENAI_GPT_OSS_120B_FREE = "openai/gpt-oss-120b:free",
MODEL_FREE_OPENAI_GPT_OSS_20B_FREE = "openai/gpt-oss-20b:free",
diff --git a/packages/kbot/src/models/cache/openrouter-models.ts b/packages/kbot/src/models/cache/openrouter-models.ts
index 9e89e56e..47df4f89 100644
--- a/packages/kbot/src/models/cache/openrouter-models.ts
+++ b/packages/kbot/src/models/cache/openrouter-models.ts
@@ -1,4 +1,5 @@
export enum E_OPENROUTER_MODEL {
+ MODEL_X_AI_GROK_4_FAST_FREE = "x-ai/grok-4-fast:free",
MODEL_ALIBABA_TONGYI_DEEPRESEARCH_30B_A3B = "alibaba/tongyi-deepresearch-30b-a3b",
MODEL_QWEN_QWEN3_CODER_FLASH = "qwen/qwen3-coder-flash",
MODEL_QWEN_QWEN3_CODER_PLUS = "qwen/qwen3-coder-plus",
@@ -11,8 +12,6 @@ export enum E_OPENROUTER_MODEL {
MODEL_QWEN_QWEN_PLUS_2025_07_28_THINKING = "qwen/qwen-plus-2025-07-28:thinking",
MODEL_NVIDIA_NEMOTRON_NANO_9B_V2_FREE = "nvidia/nemotron-nano-9b-v2:free",
MODEL_NVIDIA_NEMOTRON_NANO_9B_V2 = "nvidia/nemotron-nano-9b-v2",
- MODEL_OPENROUTER_SONOMA_DUSK_ALPHA = "openrouter/sonoma-dusk-alpha",
- MODEL_OPENROUTER_SONOMA_SKY_ALPHA = "openrouter/sonoma-sky-alpha",
MODEL_QWEN_QWEN3_MAX = "qwen/qwen3-max",
MODEL_MOONSHOTAI_KIMI_K2_0905 = "moonshotai/kimi-k2-0905",
MODEL_BYTEDANCE_SEED_OSS_36B_INSTRUCT = "bytedance/seed-oss-36b-instruct",
diff --git a/packages/kbot/src/zod_types.ts b/packages/kbot/src/zod_types.ts
index 66d14760..9223e34b 100644
--- a/packages/kbot/src/zod_types.ts
+++ b/packages/kbot/src/zod_types.ts
@@ -55,6 +55,7 @@ export interface IKBotOptions {
anthropic/claude-opus-4 | paid
anthropic/claude-opus-4.1 | paid
anthropic/claude-sonnet-4 | paid
+ arcee-ai/afm-4.5b | paid
arcee-ai/coder-large | paid
arcee-ai/maestro-reasoning | paid
arcee-ai/spotlight | paid
@@ -96,9 +97,7 @@ export interface IKBotOptions {
deepseek/deepseek-r1-distill-llama-70b:free | free
deepseek/deepseek-r1-distill-llama-8b | paid
deepseek/deepseek-r1-distill-qwen-14b | paid
- deepseek/deepseek-r1-distill-qwen-14b:free | free
deepseek/deepseek-r1-distill-qwen-32b | paid
- cognitivecomputations/dolphin-mixtral-8x22b | paid
cognitivecomputations/dolphin3.0-mistral-24b | paid
cognitivecomputations/dolphin3.0-mistral-24b:free | free
cognitivecomputations/dolphin3.0-r1-mistral-24b | paid
@@ -170,7 +169,6 @@ export interface IKBotOptions {
microsoft/phi-3-medium-128k-instruct | paid
microsoft/phi-3-mini-128k-instruct | paid
microsoft/phi-3.5-mini-128k-instruct | paid
- sophosympatheia/midnight-rose-70b | paid
minimax/minimax-m1 | paid
minimax/minimax-01 | paid
mistralai/mistral-large | paid
@@ -230,7 +228,6 @@ export interface IKBotOptions {
nousresearch/hermes-2-pro-llama-3-8b | paid
nvidia/llama-3.1-nemotron-70b-instruct | paid
nvidia/llama-3.1-nemotron-ultra-253b-v1 | paid
- nvidia/llama-3.1-nemotron-ultra-253b-v1:free | free
nvidia/nemotron-nano-9b-v2 | paid
nvidia/nemotron-nano-9b-v2:free | free
openai/chatgpt-4o-latest | paid
@@ -275,6 +272,7 @@ export interface IKBotOptions {
openai/o3-pro | paid
openai/o4-mini | paid
openai/o4-mini-high | paid
+ opengvlab/internvl3-78b | paid
perplexity/r1-1776 | paid
perplexity/sonar | paid
perplexity/sonar-deep-research | paid
@@ -310,6 +308,8 @@ export interface IKBotOptions {
qwen/qwen3-coder-30b-a3b-instruct | paid
qwen/qwen3-coder | paid
qwen/qwen3-coder:free | free
+ qwen/qwen3-coder-flash | paid
+ qwen/qwen3-coder-plus | paid
qwen/qwen3-max | paid
qwen/qwen3-next-80b-a3b-instruct | paid
qwen/qwen3-next-80b-a3b-thinking | paid
@@ -321,7 +321,6 @@ export interface IKBotOptions {
qwen/qwen-2.5-7b-instruct | paid
qwen/qwen-2.5-coder-32b-instruct | paid
qwen/qwen-2.5-coder-32b-instruct:free | free
- rekaai/reka-flash-3:free | free
undi95/remm-slerp-l2-13b | paid
sao10k/l3-lunaris-8b | paid
sao10k/l3-euryale-70b | paid
@@ -329,8 +328,6 @@ export interface IKBotOptions {
sao10k/l3.3-euryale-70b | paid
shisa-ai/shisa-v2-llama3.3-70b | paid
shisa-ai/shisa-v2-llama3.3-70b:free | free
- openrouter/sonoma-dusk-alpha | paid
- openrouter/sonoma-sky-alpha | paid
raifle/sorcererlm-8x22b | paid
stepfun-ai/step3 | paid
switchpoint/router | paid
@@ -341,21 +338,20 @@ export interface IKBotOptions {
thedrummer/rocinante-12b | paid
thedrummer/skyfall-36b-v2 | paid
thedrummer/unslopnemo-12b | paid
- thudm/glm-4-32b | paid
thudm/glm-4.1v-9b-thinking | paid
thudm/glm-z1-32b | paid
tngtech/deepseek-r1t-chimera | paid
tngtech/deepseek-r1t-chimera:free | free
tngtech/deepseek-r1t2-chimera:free | free
+ alibaba/tongyi-deepresearch-30b-a3b | paid
cognitivecomputations/dolphin-mistral-24b-venice-edition:free | free
microsoft/wizardlm-2-8x22b | paid
- x-ai/grok-2-1212 | paid
- x-ai/grok-2-vision-1212 | paid
x-ai/grok-3 | paid
x-ai/grok-3-beta | paid
x-ai/grok-3-mini | paid
x-ai/grok-3-mini-beta | paid
x-ai/grok-4 | paid
+ x-ai/grok-4-fast:free | free
x-ai/grok-code-fast-1 | paid
z-ai/glm-4-32b | paid
z-ai/glm-4.5 | paid