diff --git a/integrations/googlecalendar/integration.definition.ts b/integrations/googlecalendar/integration.definition.ts index f45ac0bf39f..b9690d931f6 100644 --- a/integrations/googlecalendar/integration.definition.ts +++ b/integrations/googlecalendar/integration.definition.ts @@ -2,7 +2,7 @@ import * as sdk from '@botpress/sdk' import { actions, entities, configuration, configurations, identifier, events, secrets, states } from './definitions' export const INTEGRATION_NAME = 'googlecalendar' -export const INTEGRATION_VERSION = '2.0.7' +export const INTEGRATION_VERSION = '2.0.8' export default new sdk.IntegrationDefinition({ name: INTEGRATION_NAME, diff --git a/integrations/googlecalendar/src/webhook-events/handlers/oauth-callback.ts b/integrations/googlecalendar/src/webhook-events/handlers/oauth-callback.ts index 2f7a4ca4129..4a8cad216d2 100644 --- a/integrations/googlecalendar/src/webhook-events/handlers/oauth-callback.ts +++ b/integrations/googlecalendar/src/webhook-events/handlers/oauth-callback.ts @@ -15,5 +15,7 @@ export const oauthCallbackHandler = async ({ client, ctx, req, logger }: bp.Hand authorizationCode, }) + await client.configureIntegration({ identifier: ctx.webhookId }) + logger.forBot().info('Successfully authenticated with Google Calendar') } diff --git a/integrations/gsheets/definitions/actions.ts b/integrations/gsheets/definitions/actions.ts index ddad905b3a5..30c727d1d11 100644 --- a/integrations/gsheets/definitions/actions.ts +++ b/integrations/gsheets/definitions/actions.ts @@ -104,7 +104,7 @@ const appendValues = { .string() .title('Start Column') .describe( - 'The start column letter(s) (e.g. "A", "B", "AA"). The range will be constructed from this column row 1 to column row 100000.' + 'The start column letter(s) (e.g. "A", "B", "AA"). Used to identify the table in the sheet — data will be appended after the last row of the detected table.' ), majorDimension: _commonFields.majorDimension .optional() @@ -425,7 +425,12 @@ const createNamedRangeInSheet = { input: { schema: z.object({ sheetId: z.number().title('Sheet ID').describe('The ID of the sheet to create the named range in.'), - rangeName: z.string().title('Name').describe('The name of the named range.'), + rangeName: z + .string() + .title('Name') + .describe( + 'The name of the named range. Must follow naming rules: cannot contain spaces, cannot start with a number, and cannot conflict with standard cell references (e.g., "A1", "R1C1"). Names violating these rules will be considered invalid.' + ), rangeA1: _commonFields.range.describe( 'The A1 notation of the range to associate with the named range. (e.g. "Sheet1!A1:B2")' ), diff --git a/integrations/gsheets/integration.definition.ts b/integrations/gsheets/integration.definition.ts index 23fd136835f..7ad3e1d761e 100644 --- a/integrations/gsheets/integration.definition.ts +++ b/integrations/gsheets/integration.definition.ts @@ -13,7 +13,7 @@ import { } from './definitions' export const INTEGRATION_NAME = 'gsheets' -export const INTEGRATION_VERSION = '2.1.3' +export const INTEGRATION_VERSION = '2.1.5' export default new sdk.IntegrationDefinition({ name: INTEGRATION_NAME, diff --git a/integrations/gsheets/src/actions/implementations/append-values-utils.ts b/integrations/gsheets/src/actions/implementations/append-values-utils.ts index 26c7c5b0c3f..9c31da225b8 100644 --- a/integrations/gsheets/src/actions/implementations/append-values-utils.ts +++ b/integrations/gsheets/src/actions/implementations/append-values-utils.ts @@ -1,6 +1,15 @@ -const MAX_ROW_NUMBER = 100000 +const _quoteSheetName = (sheetName: string): string => { + if (sheetName.startsWith("'") && sheetName.endsWith("'")) { + return sheetName + } + if (/[^A-Za-z0-9_]/.test(sheetName)) { + const escaped = sheetName.replace(/'/g, "''") + return `'${escaped}'` + } + return sheetName +} export const constructRangeFromStartColumn = (sheetName: string | undefined, startColumn: string): string => { - const sheetPrefix = sheetName ? `${sheetName}!` : '' - return `${sheetPrefix}${startColumn}:${startColumn}${MAX_ROW_NUMBER}` + const sheetPrefix = sheetName ? `${_quoteSheetName(sheetName)}!` : '' + return `${sheetPrefix}${startColumn}:${startColumn}` } diff --git a/integrations/gsheets/src/actions/implementations/append-values.test.ts b/integrations/gsheets/src/actions/implementations/append-values.test.ts index 9a2f490cb9c..6341dca8249 100644 --- a/integrations/gsheets/src/actions/implementations/append-values.test.ts +++ b/integrations/gsheets/src/actions/implementations/append-values.test.ts @@ -3,35 +3,50 @@ import { constructRangeFromStartColumn } from './append-values-utils' describe.concurrent('constructRangeFromStartColumn', () => { it('constructs range for simple column without sheet name', () => { - expect(constructRangeFromStartColumn(undefined, 'A')).toBe('A:A100000') - expect(constructRangeFromStartColumn(undefined, 'ZZ')).toBe('ZZ:ZZ100000') + expect(constructRangeFromStartColumn(undefined, 'A')).toBe('A:A') + expect(constructRangeFromStartColumn(undefined, 'ZZ')).toBe('ZZ:ZZ') }) it('constructs range for column with sheet name', () => { - expect(constructRangeFromStartColumn('Sheet1', 'A')).toBe('Sheet1!A:A100000') - expect(constructRangeFromStartColumn('Sheet1', 'B')).toBe('Sheet1!B:B100000') - expect(constructRangeFromStartColumn('My Sheet', 'C')).toBe('My Sheet!C:C100000') - expect(constructRangeFromStartColumn('Sheet1', 'AA')).toBe('Sheet1!AA:AA100000') + expect(constructRangeFromStartColumn('Sheet1', 'A')).toBe('Sheet1!A:A') + expect(constructRangeFromStartColumn('Sheet1', 'B')).toBe('Sheet1!B:B') + expect(constructRangeFromStartColumn('Sheet1', 'AA')).toBe('Sheet1!AA:AA') }) - it('handles sheet names with special characters', () => { - expect(constructRangeFromStartColumn("'My Sheet'", 'A')).toBe("'My Sheet'!A:A100000") - expect(constructRangeFromStartColumn("'Sheet 1'", 'B')).toBe("'Sheet 1'!B:B100000") + it('auto-quotes sheet names with spaces', () => { + expect(constructRangeFromStartColumn('My Sheet', 'A')).toBe("'My Sheet'!A:A") + expect(constructRangeFromStartColumn('Decision Log', 'C')).toBe("'Decision Log'!C:C") }) - it('handles multi-character column names', () => { - expect(constructRangeFromStartColumn(undefined, 'AB')).toBe('AB:AB100000') - expect(constructRangeFromStartColumn(undefined, 'ABC')).toBe('ABC:ABC100000') - expect(constructRangeFromStartColumn('Sheet1', 'XYZ')).toBe('Sheet1!XYZ:XYZ100000') + it('does not double-quote already quoted sheet names', () => { + expect(constructRangeFromStartColumn("'My Sheet'", 'A')).toBe("'My Sheet'!A:A") + expect(constructRangeFromStartColumn("'Sheet 1'", 'B')).toBe("'Sheet 1'!B:B") }) - it('handles empty string sheet name as undefined', () => { - expect(constructRangeFromStartColumn('', 'A')).toBe('A:A100000') - expect(constructRangeFromStartColumn('', 'B')).toBe('B:B100000') + it('quotes sheet names with special characters', () => { + expect(constructRangeFromStartColumn('Sheet-1', 'A')).toBe("'Sheet-1'!A:A") + expect(constructRangeFromStartColumn('Sheet.1', 'A')).toBe("'Sheet.1'!A:A") + }) + + it('escapes single quotes (apostrophes) in sheet names', () => { + expect(constructRangeFromStartColumn("John's Data", 'A')).toBe("'John''s Data'!A:A") + expect(constructRangeFromStartColumn("It's a sheet", 'B')).toBe("'It''s a sheet'!B:B") + expect(constructRangeFromStartColumn("A'B'C", 'A')).toBe("'A''B''C'!A:A") + }) + + it('does not quote simple alphanumeric/underscore sheet names', () => { + expect(constructRangeFromStartColumn('Sheet1', 'A')).toBe('Sheet1!A:A') + expect(constructRangeFromStartColumn('My_Sheet', 'A')).toBe('My_Sheet!A:A') }) - it('preserves sheet name format exactly', () => { - expect(constructRangeFromStartColumn('Sheet1', 'A')).toBe('Sheet1!A:A100000') - expect(constructRangeFromStartColumn(' Sheet1 ', 'A')).toBe(' Sheet1 !A:A100000') + it('handles multi-character column names', () => { + expect(constructRangeFromStartColumn(undefined, 'AB')).toBe('AB:AB') + expect(constructRangeFromStartColumn(undefined, 'ABC')).toBe('ABC:ABC') + expect(constructRangeFromStartColumn('Sheet1', 'XYZ')).toBe('Sheet1!XYZ:XYZ') + }) + + it('handles empty string sheet name as undefined', () => { + expect(constructRangeFromStartColumn('', 'A')).toBe('A:A') + expect(constructRangeFromStartColumn('', 'B')).toBe('B:B') }) }) diff --git a/integrations/gsheets/src/webhook-events/handlers/oauth-callback.ts b/integrations/gsheets/src/webhook-events/handlers/oauth-callback.ts index 95f2027a134..0ba71f3e94a 100644 --- a/integrations/gsheets/src/webhook-events/handlers/oauth-callback.ts +++ b/integrations/gsheets/src/webhook-events/handlers/oauth-callback.ts @@ -15,5 +15,7 @@ export const oauthCallbackHandler = async ({ client, ctx, req, logger }: bp.Hand authorizationCode, }) + await client.configureIntegration({ identifier: ctx.webhookId }) + logger.forBot().info('Successfully authenticated with Google Sheets') } diff --git a/packages/cognitive/refresh-models.ts b/packages/cognitive/refresh-models.ts index 9e291077ff9..de05329026d 100644 --- a/packages/cognitive/refresh-models.ts +++ b/packages/cognitive/refresh-models.ts @@ -9,7 +9,7 @@ const filteredLifecycles = ['deprecated', 'discontinued'] const modelsListPath = path.resolve(__dirname, 'src/cognitive-v2', 'models.ts') const typesPath = path.resolve(__dirname, 'src/cognitive-v2', 'types.ts') -type RemoteModel = Model & { lifecycle?: string; aliases?: string[] } +type RemoteModel = Model & { lifecycle?: string; aliases?: string[]; capabilities?: { supportsImages?: boolean } } const toRef = (m: RemoteModel | string | null | undefined): string | null => { if (!m) return null @@ -46,7 +46,7 @@ async function main(): Promise { } const newFile = `import { Model } from 'src/schemas.gen'\n -export type RemoteModel = Model & { aliases?: string[]; lifecycle: 'production' | 'preview' | 'deprecated' | 'discontinued' }\n +export type RemoteModel = Model & { aliases?: string[]; lifecycle: 'production' | 'preview' | 'deprecated' | 'discontinued'; capabilities?: { supportsImages?: boolean } }\n export const models: Record = ${JSON.stringify(modelsObj, null, 2)}\n export const defaultModel: RemoteModel = ${JSON.stringify(defaultModel, undefined, 2)} ` diff --git a/packages/cognitive/src/cognitive-v2/models.ts b/packages/cognitive/src/cognitive-v2/models.ts index dd798eae66e..d4f9fa15f06 100644 --- a/packages/cognitive/src/cognitive-v2/models.ts +++ b/packages/cognitive/src/cognitive-v2/models.ts @@ -3,6 +3,9 @@ import { Model } from 'src/schemas.gen' export type RemoteModel = Model & { aliases?: string[] lifecycle: 'production' | 'preview' | 'deprecated' | 'discontinued' + capabilities?: { + supportsImages?: boolean + } } export const models: Record = { @@ -21,6 +24,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'openai:gpt-5.1-2025-11-13': { id: 'openai:gpt-5.1-2025-11-13', @@ -37,6 +43,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'openai:gpt-5-2025-08-07': { id: 'openai:gpt-5-2025-08-07', @@ -53,6 +62,9 @@ export const models: Record = { }, tags: ['reasoning', 'general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['gpt-5'], }, 'openai:gpt-5-mini-2025-08-07': { @@ -70,6 +82,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['gpt-5-mini'], }, 'openai:gpt-5-nano-2025-08-07': { @@ -87,6 +102,9 @@ export const models: Record = { }, tags: ['low-cost', 'reasoning', 'general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['gpt-5-nano'], }, 'openai:o4-mini-2025-04-16': { @@ -104,6 +122,9 @@ export const models: Record = { }, tags: ['reasoning', 'vision', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['o4-mini'], }, 'openai:o3-2025-04-16': { @@ -121,6 +142,9 @@ export const models: Record = { }, tags: ['reasoning', 'vision', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['o3'], }, 'openai:gpt-4.1-2025-04-14': { @@ -138,6 +162,9 @@ export const models: Record = { }, tags: ['recommended', 'vision', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['gpt-4.1'], }, 'openai:gpt-4.1-mini-2025-04-14': { @@ -155,6 +182,9 @@ export const models: Record = { }, tags: ['recommended', 'vision', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['gpt-4.1-mini'], }, 'openai:gpt-4.1-nano-2025-04-14': { @@ -171,6 +201,9 @@ export const models: Record = { }, tags: ['low-cost', 'vision', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['gpt-4.1-nano'], }, 'openai:o3-mini-2025-01-31': { @@ -188,6 +221,9 @@ export const models: Record = { }, tags: ['reasoning', 'general-purpose', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['o3-mini'], }, 'openai:o1-2024-12-17': { @@ -205,6 +241,9 @@ export const models: Record = { }, tags: ['reasoning', 'vision', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'openai:o1-mini-2024-09-12': { id: 'openai:o1-mini-2024-09-12', @@ -221,6 +260,9 @@ export const models: Record = { }, tags: ['reasoning', 'vision', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['o1-mini'], }, 'openai:gpt-4o-mini-2024-07-18': { @@ -238,6 +280,9 @@ export const models: Record = { }, tags: ['recommended', 'vision', 'low-cost', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['gpt-4o-mini'], }, 'openai:gpt-4o-2024-11-20': { @@ -255,6 +300,9 @@ export const models: Record = { }, tags: ['recommended', 'vision', 'general-purpose', 'coding', 'agents'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['gpt-4o'], }, 'openai:gpt-4o-2024-08-06': { @@ -272,6 +320,9 @@ export const models: Record = { }, tags: ['deprecated', 'vision', 'general-purpose', 'coding', 'agents'], lifecycle: 'deprecated', + capabilities: { + supportsImages: true, + }, }, 'openai:gpt-4o-2024-05-13': { id: 'openai:gpt-4o-2024-05-13', @@ -288,6 +339,9 @@ export const models: Record = { }, tags: ['deprecated', 'vision', 'general-purpose', 'coding', 'agents'], lifecycle: 'deprecated', + capabilities: { + supportsImages: true, + }, }, 'openai:gpt-4-turbo-2024-04-09': { id: 'openai:gpt-4-turbo-2024-04-09', @@ -304,6 +358,9 @@ export const models: Record = { }, tags: ['deprecated', 'general-purpose', 'coding', 'agents'], lifecycle: 'deprecated', + capabilities: { + supportsImages: true, + }, }, 'openai:gpt-3.5-turbo-0125': { id: 'openai:gpt-3.5-turbo-0125', @@ -320,6 +377,9 @@ export const models: Record = { }, tags: ['deprecated', 'general-purpose', 'low-cost'], lifecycle: 'deprecated', + capabilities: { + supportsImages: false, + }, }, 'anthropic:claude-sonnet-4-5-20250929': { id: 'anthropic:claude-sonnet-4-5-20250929', @@ -336,6 +396,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'agents', 'vision', 'general-purpose', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['claude-sonnet-4-5'], }, 'anthropic:claude-sonnet-4-20250514': { @@ -353,6 +416,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'agents', 'vision', 'general-purpose', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['claude-sonnet-4'], }, 'anthropic:claude-sonnet-4-reasoning-20250514': { @@ -370,6 +436,9 @@ export const models: Record = { }, tags: ['deprecated', 'vision', 'reasoning', 'general-purpose', 'agents', 'coding'], lifecycle: 'deprecated', + capabilities: { + supportsImages: true, + }, aliases: ['claude-sonnet-4-reasoning'], }, 'anthropic:claude-haiku-4-5-20251001': { @@ -387,6 +456,9 @@ export const models: Record = { }, tags: ['recommended', 'agents', 'vision', 'general-purpose', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['claude-haiku-4-5'], }, 'anthropic:claude-haiku-4-5-reasoning-20251001': { @@ -404,6 +476,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'agents', 'vision', 'general-purpose', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['claude-haiku-4-5-reasoning'], }, 'anthropic:claude-3-7-sonnet-20250219': { @@ -420,7 +495,10 @@ export const models: Record = { costPer1MTokens: 15, }, tags: ['recommended', 'reasoning', 'agents', 'vision', 'general-purpose', 'coding'], - lifecycle: 'production', + lifecycle: 'discontinued', + capabilities: { + supportsImages: true, + }, }, 'anthropic:claude-3-7-sonnet-reasoning-20250219': { id: 'anthropic:claude-3-7-sonnet-reasoning-20250219', @@ -436,7 +514,10 @@ export const models: Record = { costPer1MTokens: 15, }, tags: ['deprecated', 'vision', 'reasoning', 'general-purpose', 'agents', 'coding'], - lifecycle: 'deprecated', + lifecycle: 'discontinued', + capabilities: { + supportsImages: true, + }, }, 'anthropic:claude-3-5-haiku-20241022': { id: 'anthropic:claude-3-5-haiku-20241022', @@ -452,7 +533,10 @@ export const models: Record = { costPer1MTokens: 4, }, tags: ['general-purpose', 'low-cost'], - lifecycle: 'production', + lifecycle: 'discontinued', + capabilities: { + supportsImages: true, + }, }, 'anthropic:claude-3-5-sonnet-20241022': { id: 'anthropic:claude-3-5-sonnet-20241022', @@ -469,6 +553,9 @@ export const models: Record = { }, tags: ['vision', 'general-purpose', 'agents', 'coding', 'storytelling'], lifecycle: 'discontinued', + capabilities: { + supportsImages: true, + }, }, 'anthropic:claude-3-5-sonnet-20240620': { id: 'anthropic:claude-3-5-sonnet-20240620', @@ -485,6 +572,9 @@ export const models: Record = { }, tags: ['vision', 'general-purpose', 'agents', 'coding', 'storytelling'], lifecycle: 'discontinued', + capabilities: { + supportsImages: true, + }, }, 'anthropic:claude-3-haiku-20240307': { id: 'anthropic:claude-3-haiku-20240307', @@ -501,6 +591,48 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, + }, + 'google-ai:gemini-3-pro': { + id: 'google-ai:gemini-3-pro', + name: 'Gemini 3 Pro', + description: + "One of the best models for multimodal understanding, and Google's most powerful agentic and vibe-coding model yet, delivering richer visuals and deeper interactivity, built on a foundation of state-of-the-art reasoning.", + input: { + maxTokens: 1048576, + costPer1MTokens: 2, + }, + output: { + maxTokens: 65536, + costPer1MTokens: 12, + }, + tags: ['reasoning', 'agents', 'general-purpose', 'vision'], + lifecycle: 'preview', + capabilities: { + supportsImages: true, + }, + aliases: ['gemini-3-pro-preview'], + }, + 'google-ai:gemini-3-flash': { + id: 'google-ai:gemini-3-flash', + name: 'Gemini 3 Flash', + description: "Google's most balanced model built for speed, scale, and frontier intelligence.", + input: { + maxTokens: 1048576, + costPer1MTokens: 0.5, + }, + output: { + maxTokens: 65536, + costPer1MTokens: 3, + }, + tags: ['reasoning', 'agents', 'general-purpose', 'vision'], + lifecycle: 'preview', + capabilities: { + supportsImages: true, + }, + aliases: ['gemini-3-flash-preview'], }, 'google-ai:gemini-2.5-flash': { id: 'google-ai:gemini-2.5-flash', @@ -517,6 +649,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'agents', 'general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'google-ai:gemini-2.5-pro': { id: 'google-ai:gemini-2.5-pro', @@ -533,6 +668,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'agents', 'general-purpose', 'vision', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'google-ai:gemini-2.0-flash': { id: 'google-ai:gemini-2.0-flash', @@ -549,6 +687,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['models/gemini-2.0-flash'], }, 'cerebras:gpt-oss-120b': { @@ -566,6 +707,9 @@ export const models: Record = { }, tags: ['preview', 'general-purpose', 'reasoning'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'cerebras:qwen-3-32b': { id: 'cerebras:qwen-3-32b', @@ -582,6 +726,9 @@ export const models: Record = { }, tags: ['general-purpose', 'reasoning'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'cerebras:llama-4-scout-17b-16e-instruct': { id: 'cerebras:llama-4-scout-17b-16e-instruct', @@ -598,6 +745,9 @@ export const models: Record = { }, tags: ['general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'cerebras:llama3.1-8b': { id: 'cerebras:llama3.1-8b', @@ -614,6 +764,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'cerebras:llama3.3-70b': { id: 'cerebras:llama3.3-70b', @@ -630,6 +783,9 @@ export const models: Record = { }, tags: ['general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'groq:gpt-oss-20b': { id: 'groq:gpt-oss-20b', @@ -646,6 +802,9 @@ export const models: Record = { }, tags: ['preview', 'general-purpose', 'reasoning', 'low-cost'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['openai/gpt-oss-20b'], }, 'groq:gpt-oss-120b': { @@ -663,6 +822,9 @@ export const models: Record = { }, tags: ['preview', 'general-purpose', 'reasoning'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['openai/gpt-oss-120b'], }, 'groq:deepseek-r1-distill-llama-70b': { @@ -680,6 +842,9 @@ export const models: Record = { }, tags: ['general-purpose', 'reasoning', 'preview'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, }, 'groq:llama-3.3-70b-versatile': { id: 'groq:llama-3.3-70b-versatile', @@ -696,6 +861,9 @@ export const models: Record = { }, tags: ['recommended', 'general-purpose', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'groq:llama-3.2-1b-preview': { id: 'groq:llama-3.2-1b-preview', @@ -712,6 +880,9 @@ export const models: Record = { }, tags: ['low-cost', 'deprecated'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, }, 'groq:llama-3.2-3b-preview': { id: 'groq:llama-3.2-3b-preview', @@ -728,6 +899,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose', 'deprecated'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, }, 'groq:llama-3.2-11b-vision-preview': { id: 'groq:llama-3.2-11b-vision-preview', @@ -744,6 +918,9 @@ export const models: Record = { }, tags: ['low-cost', 'vision', 'general-purpose', 'deprecated'], lifecycle: 'discontinued', + capabilities: { + supportsImages: true, + }, }, 'groq:llama-3.2-90b-vision-preview': { id: 'groq:llama-3.2-90b-vision-preview', @@ -760,6 +937,9 @@ export const models: Record = { }, tags: ['vision', 'general-purpose', 'deprecated'], lifecycle: 'discontinued', + capabilities: { + supportsImages: true, + }, }, 'groq:llama-3.1-8b-instant': { id: 'groq:llama-3.1-8b-instant', @@ -775,6 +955,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'groq:llama3-8b-8192': { id: 'groq:llama3-8b-8192', @@ -791,6 +974,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose', 'deprecated'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, }, 'groq:llama3-70b-8192': { id: 'groq:llama3-70b-8192', @@ -807,6 +993,9 @@ export const models: Record = { }, tags: ['general-purpose', 'deprecated'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, }, 'groq:gemma2-9b-it': { id: 'groq:gemma2-9b-it', @@ -823,6 +1012,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, }, 'xai:grok-code-fast-1': { id: 'xai:grok-code-fast-1', @@ -838,6 +1030,9 @@ export const models: Record = { }, tags: ['coding', 'general-purpose', 'low-cost'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'xai:grok-4-fast-reasoning': { id: 'xai:grok-4-fast-reasoning', @@ -853,6 +1048,9 @@ export const models: Record = { }, tags: ['reasoning', 'recommended', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'xai:grok-4-fast-non-reasoning': { id: 'xai:grok-4-fast-non-reasoning', @@ -868,6 +1066,9 @@ export const models: Record = { }, tags: ['low-cost', 'recommended', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'xai:grok-4-0709': { id: 'xai:grok-4-0709', @@ -883,6 +1084,9 @@ export const models: Record = { }, tags: ['reasoning', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'xai:grok-3-mini': { id: 'xai:grok-3-mini', @@ -898,6 +1102,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'xai:grok-3': { id: 'xai:grok-3', @@ -913,6 +1120,9 @@ export const models: Record = { }, tags: ['general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, }, 'openrouter:gpt-oss-120b': { id: 'openrouter:gpt-oss-120b', @@ -929,6 +1139,9 @@ export const models: Record = { }, tags: ['preview', 'general-purpose', 'reasoning'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, }, 'fireworks-ai:gpt-oss-20b': { id: 'fireworks-ai:gpt-oss-20b', @@ -945,6 +1158,9 @@ export const models: Record = { }, tags: ['general-purpose', 'reasoning', 'low-cost'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/gpt-oss-20b'], }, 'fireworks-ai:gpt-oss-120b': { @@ -962,6 +1178,9 @@ export const models: Record = { }, tags: ['general-purpose', 'reasoning'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/gpt-oss-120b'], }, 'fireworks-ai:deepseek-r1-0528': { @@ -979,6 +1198,9 @@ export const models: Record = { }, tags: ['recommended', 'reasoning', 'general-purpose', 'coding'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/deepseek-r1-0528'], }, 'fireworks-ai:deepseek-v3-0324': { @@ -996,6 +1218,9 @@ export const models: Record = { }, tags: ['recommended', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/deepseek-v3-0324'], }, 'fireworks-ai:llama4-maverick-instruct-basic': { @@ -1013,6 +1238,9 @@ export const models: Record = { }, tags: ['general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['accounts/fireworks/models/llama4-maverick-instruct-basic'], }, 'fireworks-ai:llama4-scout-instruct-basic': { @@ -1030,6 +1258,9 @@ export const models: Record = { }, tags: ['general-purpose', 'vision'], lifecycle: 'production', + capabilities: { + supportsImages: true, + }, aliases: ['accounts/fireworks/models/llama4-scout-instruct-basic'], }, 'fireworks-ai:llama-v3p3-70b-instruct': { @@ -1047,6 +1278,9 @@ export const models: Record = { }, tags: ['general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/llama-v3p3-70b-instruct'], }, 'fireworks-ai:deepseek-r1': { @@ -1064,6 +1298,9 @@ export const models: Record = { }, tags: ['reasoning', 'general-purpose', 'coding'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/deepseek-r1'], }, 'fireworks-ai:deepseek-r1-basic': { @@ -1081,6 +1318,9 @@ export const models: Record = { }, tags: ['reasoning', 'general-purpose', 'coding'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/deepseek-r1-basic'], }, 'fireworks-ai:deepseek-v3': { @@ -1098,6 +1338,9 @@ export const models: Record = { }, tags: ['deprecated', 'general-purpose'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/deepseek-v3'], }, 'fireworks-ai:llama-v3p1-405b-instruct': { @@ -1115,6 +1358,9 @@ export const models: Record = { }, tags: ['deprecated', 'general-purpose'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/llama-v3p1-405b-instruct'], }, 'fireworks-ai:llama-v3p1-70b-instruct': { @@ -1132,6 +1378,9 @@ export const models: Record = { }, tags: ['deprecated', 'general-purpose'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/llama-v3p1-70b-instruct'], }, 'fireworks-ai:llama-v3p1-8b-instruct': { @@ -1149,6 +1398,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose'], lifecycle: 'production', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/llama-v3p1-8b-instruct'], }, 'fireworks-ai:mixtral-8x22b-instruct': { @@ -1166,6 +1418,9 @@ export const models: Record = { }, tags: ['deprecated', 'general-purpose'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/mixtral-8x22b-instruct'], }, 'fireworks-ai:mixtral-8x7b-instruct': { @@ -1183,6 +1438,9 @@ export const models: Record = { }, tags: ['low-cost', 'general-purpose'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/mixtral-8x7b-instruct'], }, 'fireworks-ai:mythomax-l2-13b': { @@ -1200,6 +1458,9 @@ export const models: Record = { }, tags: ['roleplay', 'storytelling', 'low-cost'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/mythomax-l2-13b'], }, 'fireworks-ai:gemma2-9b-it': { @@ -1217,6 +1478,9 @@ export const models: Record = { }, tags: ['deprecated', 'low-cost', 'general-purpose'], lifecycle: 'discontinued', + capabilities: { + supportsImages: false, + }, aliases: ['accounts/fireworks/models/gemma2-9b-it'], }, } diff --git a/packages/cognitive/src/cognitive-v2/types.ts b/packages/cognitive/src/cognitive-v2/types.ts index 59d809b3cc1..a6e4225cfcd 100644 --- a/packages/cognitive/src/cognitive-v2/types.ts +++ b/packages/cognitive/src/cognitive-v2/types.ts @@ -2,8 +2,6 @@ export type Models = | 'auto' | 'best' | 'fast' - | 'anthropic:claude-3-5-haiku-20241022' - | 'anthropic:claude-3-7-sonnet-20250219' | 'anthropic:claude-3-haiku-20240307' | 'anthropic:claude-haiku-4-5-20251001' | 'anthropic:claude-haiku-4-5-reasoning-20251001' @@ -25,6 +23,8 @@ export type Models = | 'google-ai:gemini-2.0-flash' | 'google-ai:gemini-2.5-flash' | 'google-ai:gemini-2.5-pro' + | 'google-ai:gemini-3-flash' + | 'google-ai:gemini-3-pro' | 'groq:gpt-oss-120b' | 'groq:gpt-oss-20b' | 'groq:llama-3.1-8b-instant' @@ -68,6 +68,8 @@ export type Models = | 'anthropic:claude-sonnet-4-reasoning' | 'anthropic:claude-haiku-4-5' | 'anthropic:claude-haiku-4-5-reasoning' + | 'google-ai:gemini-3-pro-preview' + | 'google-ai:gemini-3-flash-preview' | 'google-ai:models/gemini-2.0-flash' | 'groq:openai/gpt-oss-20b' | 'groq:openai/gpt-oss-120b' diff --git a/packages/llmz/package.json b/packages/llmz/package.json index 37f72814adc..d7933eeda27 100644 --- a/packages/llmz/package.json +++ b/packages/llmz/package.json @@ -2,7 +2,7 @@ "name": "llmz", "type": "module", "description": "LLMz - An LLM-native Typescript VM built on top of Zui", - "version": "0.0.54", + "version": "0.0.55", "types": "./dist/index.d.ts", "main": "./dist/index.cjs", "module": "./dist/index.js",