From 03750d1b0cc2698b68062f98167fc6139b395700 Mon Sep 17 00:00:00 2001
From: jakedahn
Date: Tue, 1 Apr 2025 13:31:23 -0600
Subject: [PATCH 01/18] Implementing "jsonMode" for LLM calls, and from the
react app iframe calls
---
charm/src/iframe/static.ts | 41 +++----
jumble/src/views/CharmDetailView.tsx | 2 +-
llm/src/client.ts | 1 +
toolshed/routes/ai/llm/generateText.ts | 147 ++++++++++++++++++++++++-
toolshed/routes/ai/llm/llm.handlers.ts | 85 +++++++++++---
toolshed/routes/ai/llm/llm.routes.ts | 3 +-
toolshed/routes/ai/llm/models.ts | 28 +++++
7 files changed, 258 insertions(+), 49 deletions(-)
diff --git a/charm/src/iframe/static.ts b/charm/src/iframe/static.ts
index 95f3ee45b..2c736f15f 100644
--- a/charm/src/iframe/static.ts
+++ b/charm/src/iframe/static.ts
@@ -165,32 +165,6 @@ ${JSON.stringify(libraries)}
});
})();
- window.grabJson = (gstr) => {
- // Function to extract and parse JSON from a string
- // This handles both raw JSON strings and code blocks with JSON
- const jsonRegex = /\`\`\`(?:json)?\s*([\s\S]*?)\s*\`\`\`|({[\s\S]*})/;
- const match = gstr.match(jsonRegex);
-
- if (match) {
- // Use the first matching group that contains content
- const jsonStr = match[1] || match[2];
- try {
- return JSON.parse(jsonStr);
- } catch (e) {
- console.error("Failed to parse JSON:", e);
- return null;
- }
- } else {
- // If no JSON block found, attempt to parse the entire string
- try {
- return JSON.parse(gstr);
- } catch (e) {
- console.error("No valid JSON found in string");
- return null;
- }
- }
- }
-
// Define readWebpage utility with React available
window.readWebpage = (function() {
const inflight = [];
@@ -673,12 +647,23 @@ async function fetchLLMResponse() {
system: 'Translate all the messages to emojis, reply in JSON.',
messages: ['Hi', 'How can I help you today?', 'tell me a joke']
};
- // grabJson is available on the window, string -> JSON
- const result = grabJson(await llm(promptPayload));
+ const result = await llm(promptPayload)
console.log('LLM responded:', result);
}
\`\`\`
+If you need JSON to be returned from the LLM, you can enable the \`jsonMode\` flag in the \`promptPayload\`.
+
+\`\`\`jsx
+const promptPayload = {
+ system: 'Translate all the messages to emojis, reply in JSON.',
+ messages: ['Hi', 'How can I help you today?', 'tell me a joke'],
+ jsonMode: true
+};
+const result = await llm(promptPayload);
+console.log('JSON response from llm:', result);
+\`\`\`
+
## 3. readWebpage Function
\`\`\`jsx
diff --git a/jumble/src/views/CharmDetailView.tsx b/jumble/src/views/CharmDetailView.tsx
index c83062581..e5dce87ef 100644
--- a/jumble/src/views/CharmDetailView.tsx
+++ b/jumble/src/views/CharmDetailView.tsx
@@ -61,7 +61,7 @@ const variantModels = [
"anthropic:claude-3-5-sonnet-latest",
"anthropic:claude-3-7-sonnet-latest",
"groq:llama-3.3-70b-versatile",
- "google:gemini-2.0-pro",
+ "google:gemini-2.5-pro",
] as const;
// =================== Context for Shared State ===================
diff --git a/llm/src/client.ts b/llm/src/client.ts
index 0e5f9fa01..d5c4fa8e3 100644
--- a/llm/src/client.ts
+++ b/llm/src/client.ts
@@ -27,6 +27,7 @@ export type LLMRequest = {
max_tokens?: number;
stream?: boolean;
stop?: string;
+ jsonMode?: boolean;
};
export class LLMClient {
diff --git a/toolshed/routes/ai/llm/generateText.ts b/toolshed/routes/ai/llm/generateText.ts
index 6017ca643..f610fb31f 100644
--- a/toolshed/routes/ai/llm/generateText.ts
+++ b/toolshed/routes/ai/llm/generateText.ts
@@ -2,6 +2,16 @@ import { streamText } from "ai";
import { findModel, TASK_MODELS } from "./models.ts";
+// Constants for JSON mode
+const JSON_SYSTEM_PROMPTS = {
+ DEFAULT:
+ "Ensure the response is valid JSON. DO NOT include any other text or formatting.",
+ CLAUDE:
+ "You are a JSON generation assistant. Your task is to generate valid, properly formatted JSON according to the user's request. Follow these guidelines:\n\n1. Only output valid JSON - no other text, explanations, or markdown formatting\n2. Ensure all keys and string values are properly quoted with double quotes\n3. Maintain proper nesting and indentation\n4. Close all brackets and braces properly\n5. Use proper JSON syntax with commas between elements but not after the last element in arrays or objects\n\nYour entire response must be a single valid JSON object or array that could be directly parsed by JSON.parse().",
+ GROQ:
+ "You must respond with pure, correct JSON only - no text descriptions, no ```json code blocks, and no formatting outside of valid JSON. Your entire response should be a valid JSON object that can be parsed directly by JSON.parse() with no additional processing.",
+};
+
// Core generation logic separated from HTTP handling
export interface GenerateTextParams {
model?: string;
@@ -12,6 +22,7 @@ export interface GenerateTextParams {
stop_token?: string;
abortSignal?: AbortSignal;
max_tokens?: number;
+ jsonMode?: boolean;
}
export interface GenerateTextResult {
@@ -19,6 +30,97 @@ export interface GenerateTextResult {
stream?: ReadableStream;
}
+// Configure the model parameters for JSON mode based on provider
+function configureJsonMode(
+ streamParams: Record,
+ modelName: string,
+ messages: { role: "user" | "assistant"; content: string }[],
+ isStreaming: boolean,
+): void {
+ // Default to using the generic JSON mode
+ streamParams.mode = "json";
+
+ // Apply provider-specific configurations
+ if (modelName?.startsWith("groq:")) {
+ // Groq uses response_format parameter
+ streamParams.response_format = { type: "json_object" };
+
+ // Ensure it's also passed through providerOptions for the Vercel AI SDK
+ streamParams.providerOptions = {
+ ...streamParams.providerOptions,
+ groq: {
+ response_format: { type: "json_object" },
+ },
+ };
+
+ // Add a stronger system prompt for Groq to prevent markdown code blocks
+ if (!streamParams.system) {
+ streamParams.system = JSON_SYSTEM_PROMPTS.GROQ;
+ } else {
+ streamParams.system = streamParams.system + "\n\n" +
+ JSON_SYSTEM_PROMPTS.GROQ;
+ }
+
+ // Remove standard mode parameter as Groq doesn't support it
+ delete streamParams.mode;
+ } else if (modelName?.startsWith("openai:")) {
+ // OpenAI uses response_format parameter
+ streamParams.response_format = { type: "json_object" };
+
+ // Ensure it's also passed through providerOptions for the Vercel AI SDK
+ streamParams.providerOptions = {
+ ...streamParams.providerOptions,
+ openai: {
+ response_format: { type: "json_object" },
+ },
+ };
+
+ // Remove the mode parameter since OpenAI uses response_format instead
+ delete streamParams.mode;
+ } else if (modelName?.startsWith("anthropic:")) {
+ // Update or set system prompt for Claude
+ if (!streamParams.system) {
+ streamParams.system = JSON_SYSTEM_PROMPTS.CLAUDE;
+ } else {
+ // Prepend the JSON assistant role and append the JSON-specific instructions
+ streamParams.system = "You are a JSON generation assistant. " +
+ streamParams.system +
+ "\n\nImportant: Your response must be ONLY valid JSON - no other text, explanations, or markdown formatting. The output should be directly parseable by JSON.parse().";
+ }
+
+ // Use prefill for non-streaming responses to anchor the JSON structure
+ if (
+ !isStreaming && messages.length > 0 &&
+ messages[messages.length - 1].role === "user"
+ ) {
+ streamParams.prefill = {
+ text: "{\n",
+ };
+ }
+ } else {
+ // For other providers, set a standard system prompt if one isn't provided
+ if (!streamParams.system) {
+ streamParams.system = JSON_SYSTEM_PROMPTS.DEFAULT;
+ } else if (!streamParams.system.toLowerCase().includes("json")) {
+ streamParams.system += "\n" + JSON_SYSTEM_PROMPTS.DEFAULT;
+ }
+ }
+}
+
+// Add a helper function to clean up JSON responses from markdown code blocks
+function cleanJsonResponse(text: string): string {
+ // Check if the response is wrapped in markdown code blocks
+ const jsonCodeBlockRegex = /```(json)?\s*\n([\s\S]*?)\n```/;
+ const match = text.match(jsonCodeBlockRegex);
+
+ if (match && match[2]) {
+ // Return just the JSON content inside the code block
+ return match[2].trim();
+ }
+
+ return text;
+}
+
export async function generateText(
params: GenerateTextParams,
): Promise {
@@ -45,8 +147,18 @@ export async function generateText(
throw new Error(`Unsupported model: ${modelName}`);
}
+ // Check if jsonMode is requested but not supported
+ if (params.jsonMode && !modelConfig.capabilities.jsonMode) {
+ throw new Error(`Model ${modelName} does not support jsonMode.`);
+ }
+
+ // Groq models don't support streaming in JSON mode
+ if (params.jsonMode && params.stream && modelName?.startsWith("groq:")) {
+ throw new Error("Groq models don't support streaming in JSON mode");
+ }
+
const messages = params.messages;
- const streamParams = {
+ const streamParams: Record = {
model: modelConfig.model || modelName!,
messages,
stream: params.stream,
@@ -57,6 +169,16 @@ export async function generateText(
maxTokens: params.max_tokens,
};
+ // Apply JSON mode configuration if requested and supported
+ if (params.jsonMode && modelConfig.capabilities.jsonMode) {
+ configureJsonMode(
+ streamParams,
+ modelName!,
+ messages,
+ params.stream || false,
+ );
+ }
+
// Handle models that don't support system prompts
if (
!modelConfig.capabilities.systemPrompt && params.system &&
@@ -84,7 +206,16 @@ export async function generateText(
throw new Error("No response from LLM");
}
- if ((await llmStream.finishReason) === "stop" && params.stop_token) {
+ // Clean up JSON responses when jsonMode is enabled
+ if (params.jsonMode) {
+ result = cleanJsonResponse(result);
+ }
+
+ // Only add stop token if not in JSON mode to avoid breaking JSON structure
+ if (
+ (await llmStream.finishReason) === "stop" && params.stop_token &&
+ !params.jsonMode
+ ) {
result += params.stop_token;
}
@@ -117,14 +248,22 @@ export async function generateText(
);
}
- // Add stop sequence if specified
- if ((await llmStream.finishReason) === "stop" && params.stop_token) {
+ // Only add stop token if not in JSON mode to avoid breaking JSON structure
+ if (
+ (await llmStream.finishReason) === "stop" && params.stop_token &&
+ !params.jsonMode
+ ) {
result += params.stop_token;
controller.enqueue(
new TextEncoder().encode(JSON.stringify(params.stop_token) + "\n"),
);
}
+ // For JSON mode, clean the result to strip any markdown code blocks
+ if (params.jsonMode) {
+ result = cleanJsonResponse(result);
+ }
+
// Update message history
if (messages[messages.length - 1].role === "user") {
messages.push({ role: "assistant", content: result });
diff --git a/toolshed/routes/ai/llm/llm.handlers.ts b/toolshed/routes/ai/llm/llm.handlers.ts
index b131c5ac0..e3e73f6cf 100644
--- a/toolshed/routes/ai/llm/llm.handlers.ts
+++ b/toolshed/routes/ai/llm/llm.handlers.ts
@@ -6,6 +6,47 @@ import * as cache from "./cache.ts";
import type { Context } from "@hono/hono";
import { generateText as generateTextCore } from "./generateText.ts";
import { findModel } from "./models.ts";
+
+/**
+ * Validates that the model and JSON mode settings are compatible
+ * @returns An error response object if validation fails, or null if validation passes
+ */
+function validateModelAndJsonMode(
+ c: Context,
+ modelString: string | undefined,
+ jsonMode: boolean | undefined,
+) {
+ const model = modelString ? findModel(modelString) : null;
+
+ if (!model) {
+ return c.json({ error: "Invalid model" }, HttpStatusCodes.BAD_REQUEST);
+ }
+
+ // Validate jsonMode support if requested
+ if (jsonMode && !model.capabilities.jsonMode) {
+ return c.json(
+ { error: `Model ${modelString} does not support jsonMode.` },
+ HttpStatusCodes.BAD_REQUEST,
+ );
+ }
+
+ // Groq models don't support streaming with JSON mode
+ if (
+ jsonMode && c.req.query("stream") === "true" &&
+ modelString?.startsWith("groq:")
+ ) {
+ return c.json(
+ {
+ error:
+ "Groq models don't support streaming in JSON mode. Please set stream to false.",
+ },
+ HttpStatusCodes.BAD_REQUEST,
+ );
+ }
+
+ return null;
+}
+
/**
* Handler for GET /models endpoint
* Returns filtered list of available LLM models based on search criteria
@@ -57,20 +98,30 @@ export const generateText: AppRouteHandler = async (c) => {
const payload = await c.req.json();
const modelString = payload.model;
- const model = modelString ? findModel(modelString) : null;
- const modelDefaultMaxTokens = model?.capabilities.maxOutputTokens || 8000;
- if (!model) {
- return c.json({ error: "Invalid model" }, HttpStatusCodes.BAD_REQUEST);
+
+ // Validate model and JSON mode compatibility
+ const validationError = validateModelAndJsonMode(
+ c,
+ modelString,
+ payload.jsonMode,
+ );
+ if (validationError) {
+ return validationError;
}
+ const model = findModel(modelString!);
+ const modelDefaultMaxTokens = model?.capabilities.maxOutputTokens || 8000;
+
try {
- // Check cache for existing response
- const cacheKey = await cache.hashKey(JSON.stringify(payload));
- const cachedResult = await cache.loadItem(cacheKey);
- if (cachedResult) {
- const lastMessage =
- cachedResult.messages[cachedResult.messages.length - 1];
- return c.json(lastMessage);
+ // Check cache for existing response - skip caching for jsonMode requests
+ if (!payload.jsonMode) {
+ const cacheKey = await cache.hashKey(JSON.stringify(payload));
+ const cachedResult = await cache.loadItem(cacheKey);
+ if (cachedResult) {
+ const lastMessage =
+ cachedResult.messages[cachedResult.messages.length - 1];
+ return c.json(lastMessage);
+ }
}
const result = await generateTextCore({
@@ -80,10 +131,14 @@ export const generateText: AppRouteHandler = async (c) => {
});
if (!payload.stream) {
- await cache.saveItem(cacheKey, {
- ...payload,
- messages: [...payload.messages, result.message],
- });
+ // Save to cache only if not jsonMode
+ if (!payload.jsonMode) {
+ const cacheKey = await cache.hashKey(JSON.stringify(payload));
+ await cache.saveItem(cacheKey, {
+ ...payload,
+ messages: [...payload.messages, result.message],
+ });
+ }
return c.json(result.message);
}
diff --git a/toolshed/routes/ai/llm/llm.routes.ts b/toolshed/routes/ai/llm/llm.routes.ts
index 25996f442..4cbaa207a 100644
--- a/toolshed/routes/ai/llm/llm.routes.ts
+++ b/toolshed/routes/ai/llm/llm.routes.ts
@@ -23,6 +23,7 @@ export const LLMRequestSchema = z.object({
stop_token: z.string().optional(),
max_completion_tokens: z.number().optional(),
stream: z.boolean().default(false),
+ jsonMode: z.boolean().optional().default(false),
});
export const ModelInfoSchema = z.object({
@@ -111,7 +112,7 @@ export const generateText = createRoute({
"application/json": {
schema: LLMRequestSchema.openapi({
example: {
- model: "claude-3-5-sonnet",
+ model: "anthropic:claude-3-7-sonnet-latest",
system: "You are a pirate, make sure you talk like one.",
stream: false,
messages: [
diff --git a/toolshed/routes/ai/llm/models.ts b/toolshed/routes/ai/llm/models.ts
index b20b1f4eb..7b45db65d 100644
--- a/toolshed/routes/ai/llm/models.ts
+++ b/toolshed/routes/ai/llm/models.ts
@@ -16,6 +16,7 @@ export type Capabilities = {
stopSequences: boolean;
prefill: boolean;
images: boolean;
+ jsonMode?: boolean;
};
type ModelConfig = {
@@ -104,6 +105,7 @@ if (env.CTTS_AI_LLM_ANTHROPIC_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
@@ -119,6 +121,7 @@ if (env.CTTS_AI_LLM_ANTHROPIC_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
addModel({
@@ -133,6 +136,7 @@ if (env.CTTS_AI_LLM_ANTHROPIC_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
@@ -151,6 +155,7 @@ if (env.CTTS_AI_LLM_ANTHROPIC_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
providerOptions: {
anthropic: {
@@ -171,6 +176,7 @@ if (env.CTTS_AI_LLM_ANTHROPIC_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
}
@@ -191,6 +197,7 @@ if (env.CTTS_AI_LLM_GROQ_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
});
@@ -206,6 +213,7 @@ if (env.CTTS_AI_LLM_GROQ_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
});
@@ -221,6 +229,7 @@ if (env.CTTS_AI_LLM_GROQ_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
});
@@ -236,6 +245,7 @@ if (env.CTTS_AI_LLM_GROQ_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: false,
+ jsonMode: true,
},
});
@@ -251,6 +261,7 @@ if (env.CTTS_AI_LLM_GROQ_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: false,
+ jsonMode: true,
},
});
@@ -266,6 +277,7 @@ if (env.CTTS_AI_LLM_GROQ_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: false,
+ jsonMode: true,
},
});
}
@@ -286,6 +298,7 @@ if (env.CTTS_AI_LLM_OPENAI_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
@@ -301,6 +314,7 @@ if (env.CTTS_AI_LLM_OPENAI_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
providerOptions: {
reasoningEffort: "low",
@@ -319,6 +333,7 @@ if (env.CTTS_AI_LLM_OPENAI_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
providerOptions: {
reasoningEffort: "medium",
@@ -337,6 +352,7 @@ if (env.CTTS_AI_LLM_OPENAI_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
providerOptions: {
reasoningEffort: "high",
@@ -355,6 +371,7 @@ if (env.CTTS_AI_LLM_OPENAI_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
providerOptions: {
reasoningEffort: "low",
@@ -373,6 +390,7 @@ if (env.CTTS_AI_LLM_OPENAI_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
providerOptions: {
reasoningEffort: "medium",
@@ -391,6 +409,7 @@ if (env.CTTS_AI_LLM_OPENAI_API_KEY) {
systemPrompt: false,
stopSequences: false,
streaming: true,
+ jsonMode: true,
},
providerOptions: {
reasoningEffort: "high",
@@ -423,6 +442,7 @@ if (env.CTTS_AI_LLM_GOOGLE_APPLICATION_CREDENTIALS) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
@@ -438,6 +458,7 @@ if (env.CTTS_AI_LLM_GOOGLE_APPLICATION_CREDENTIALS) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
@@ -453,6 +474,7 @@ if (env.CTTS_AI_LLM_GOOGLE_APPLICATION_CREDENTIALS) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
@@ -468,6 +490,7 @@ if (env.CTTS_AI_LLM_GOOGLE_APPLICATION_CREDENTIALS) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
@@ -483,6 +506,7 @@ if (env.CTTS_AI_LLM_GOOGLE_APPLICATION_CREDENTIALS) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: true,
},
});
}
@@ -503,6 +527,7 @@ if (env.CTTS_AI_LLM_CEREBRAS_API_KEY) {
systemPrompt: true,
stopSequences: true,
streaming: true,
+ jsonMode: false,
},
});
}
@@ -526,6 +551,7 @@ if (env.CTTS_AI_LLM_PERPLEXITY_API_KEY) {
systemPrompt: false,
stopSequences: true,
streaming: true,
+ jsonMode: false,
},
});
@@ -541,6 +567,7 @@ if (env.CTTS_AI_LLM_PERPLEXITY_API_KEY) {
systemPrompt: false,
stopSequences: true,
streaming: true,
+ jsonMode: false,
},
});
@@ -556,6 +583,7 @@ if (env.CTTS_AI_LLM_PERPLEXITY_API_KEY) {
systemPrompt: false,
stopSequences: true,
streaming: true,
+ jsonMode: false,
},
});
}
From 902b6819285ef8c106b8b080e3242f9629fde023 Mon Sep 17 00:00:00 2001
From: jakedahn
Date: Tue, 1 Apr 2025 16:12:56 -0600
Subject: [PATCH 02/18] removing rarely used models and their dependencies
---
deno.lock | 874 +------------------------------
toolshed/deno.json | 2 -
toolshed/routes/ai/llm/models.ts | 203 +------
3 files changed, 17 insertions(+), 1062 deletions(-)
diff --git a/deno.lock b/deno.lock
index db4bb3c92..ec81b1290 100644
--- a/deno.lock
+++ b/deno.lock
@@ -45,9 +45,7 @@
"jsr:@std/streams@^1.0.9": "1.0.9",
"jsr:@std/testing@1": "1.0.9",
"jsr:@zip-js/zip-js@^2.7.52": "2.7.57",
- "npm:@ai-sdk/amazon-bedrock@^1.1.6": "1.1.6_zod@3.24.2",
"npm:@ai-sdk/anthropic@^1.1.6": "1.1.15_zod@3.24.2",
- "npm:@ai-sdk/cerebras@~0.1.8": "0.1.13_zod@3.24.2",
"npm:@ai-sdk/google-vertex@^2.1.12": "2.1.24_zod@3.24.2",
"npm:@ai-sdk/groq@^1.1.7": "1.1.12_zod@3.24.2",
"npm:@ai-sdk/openai@^1.1.9": "1.2.2_zod@3.24.2",
@@ -316,29 +314,11 @@
}
},
"npm": {
- "@ai-sdk/amazon-bedrock@1.1.6_zod@3.24.2": {
- "integrity": "sha512-h6SJWpku+i8OsSz0A4RT2g2uD+3E0SUgWHsWRIpxmPNgM1DnH6lgSby5sxqAZDY5xJyJtRFW5vB9G3GEBjHy/g==",
- "dependencies": [
- "@ai-sdk/provider@1.0.7",
- "@ai-sdk/provider-utils@2.1.6_zod@3.24.2",
- "@aws-sdk/client-bedrock-runtime",
- "zod"
- ]
- },
"@ai-sdk/anthropic@1.1.15_zod@3.24.2": {
"integrity": "sha512-KqI2vjEPLieBmZh+QIB0055JGUh9F7QcMdqj+dOGrtBawd0zjhZ2uBxP8Ghvl4WhbuTEOo54mlAg7RZO0eP2Tg==",
"dependencies": [
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
- "zod"
- ]
- },
- "@ai-sdk/cerebras@0.1.13_zod@3.24.2": {
- "integrity": "sha512-jrNKpZx1LzG7+t5ARHR62PhUJ1pB6HDj7E94eTRaVZjZ6+1YkATTz5MplNsv3Eyy91JCr3GQZEyPf0dDiwKwbA==",
- "dependencies": [
- "@ai-sdk/openai-compatible",
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
+ "@ai-sdk/provider",
+ "@ai-sdk/provider-utils",
"zod"
]
},
@@ -347,8 +327,8 @@
"dependencies": [
"@ai-sdk/anthropic",
"@ai-sdk/google",
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
+ "@ai-sdk/provider",
+ "@ai-sdk/provider-utils",
"google-auth-library",
"zod"
]
@@ -356,49 +336,31 @@
"@ai-sdk/google@1.1.20_zod@3.24.2": {
"integrity": "sha512-vsYtmFYy5vQAovWWAqb9XoLZ01lmcfpfxviY8lMV92YwwbLLhYcaPQ4dKaaKo0tSksCWsO2Qehw8bN3eBxmZdA==",
"dependencies": [
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
+ "@ai-sdk/provider",
+ "@ai-sdk/provider-utils",
"zod"
]
},
"@ai-sdk/groq@1.1.12_zod@3.24.2": {
"integrity": "sha512-Cjvqrd1RLpdo6k7KQCENLiEDIYjXQdkfWcsBWn9WiGkiXgLyOwBZhxV0HK1jJKl17zO2AU4+QJODaqR9rQkLRA==",
"dependencies": [
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
- "zod"
- ]
- },
- "@ai-sdk/openai-compatible@0.1.13_zod@3.24.2": {
- "integrity": "sha512-hgj6BdvasVXCTmJwbsiWo+e626GkmEBJKG8PYwpVq7moLWj93wJnfBNlDjxVjhZ32d5KGT32RIMZjqaX8QkClg==",
- "dependencies": [
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
+ "@ai-sdk/provider",
+ "@ai-sdk/provider-utils",
"zod"
]
},
"@ai-sdk/openai@1.2.2_zod@3.24.2": {
"integrity": "sha512-5355FLtSOH8sz9N9fsSwWpTaEgfqKOPMMHgSs1j4Aih5kQc9PhJ/oAPZuH308c/ktrbx6GcCW/hVrITimYsQhQ==",
"dependencies": [
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
+ "@ai-sdk/provider",
+ "@ai-sdk/provider-utils",
"zod"
]
},
"@ai-sdk/provider-utils@2.1.11_zod@3.24.2": {
"integrity": "sha512-lMnXA5KaRJidzW7gQmlo/SnX6D+AKk5GxHFcQtOaGOSJNmu/qcNZc1rGaO7K5qW52OvCLXtnWudR4cc/FvMpVQ==",
"dependencies": [
- "@ai-sdk/provider@1.0.10",
- "eventsource-parser@3.0.0",
- "nanoid",
- "secure-json-parse",
- "zod"
- ]
- },
- "@ai-sdk/provider-utils@2.1.6_zod@3.24.2": {
- "integrity": "sha512-Pfyaj0QZS22qyVn5Iz7IXcJ8nKIKlu2MeSAdKJzTwkAks7zdLaKVB+396Rqcp1bfQnxl7vaduQVMQiXUrgK8Gw==",
- "dependencies": [
- "@ai-sdk/provider@1.0.7",
+ "@ai-sdk/provider",
"eventsource-parser@3.0.0",
"nanoid",
"secure-json-parse",
@@ -411,16 +373,10 @@
"json-schema"
]
},
- "@ai-sdk/provider@1.0.7": {
- "integrity": "sha512-q1PJEZ0qD9rVR+8JFEd01/QM++csMT5UVwYXSN2u54BrVw/D8TZLTeg2FEfKK00DgAx0UtWd8XOhhwITP9BT5g==",
- "dependencies": [
- "json-schema"
- ]
- },
"@ai-sdk/react@1.1.21_react@18.3.1_zod@3.24.2": {
"integrity": "sha512-VKgqzG5wKjyLhROiFhRdyMuDcGu5QPfdLU5J7ovqR1HecknxymL3nCXsxWbAaiZ0khm2EsST6L6zwUbriZrKgg==",
"dependencies": [
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
+ "@ai-sdk/provider-utils",
"@ai-sdk/ui-utils",
"react",
"swr",
@@ -431,8 +387,8 @@
"@ai-sdk/ui-utils@1.1.17_zod@3.24.2": {
"integrity": "sha512-fCnp/wntZGqPf6tiCmhuQoSDLSBhXoI5DU2JX4As96EO870+jliE6ozvYUwYOZC6Ta2OKAjjWPcSP7HeHX0b+g==",
"dependencies": [
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
+ "@ai-sdk/provider",
+ "@ai-sdk/provider-utils",
"zod",
"zod-to-json-schema"
]
@@ -480,396 +436,6 @@
"zod"
]
},
- "@aws-crypto/crc32@5.2.0": {
- "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==",
- "dependencies": [
- "@aws-crypto/util",
- "@aws-sdk/types",
- "tslib"
- ]
- },
- "@aws-crypto/sha256-browser@5.2.0": {
- "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==",
- "dependencies": [
- "@aws-crypto/sha256-js",
- "@aws-crypto/supports-web-crypto",
- "@aws-crypto/util",
- "@aws-sdk/types",
- "@aws-sdk/util-locate-window",
- "@smithy/util-utf8@2.3.0",
- "tslib"
- ]
- },
- "@aws-crypto/sha256-js@5.2.0": {
- "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
- "dependencies": [
- "@aws-crypto/util",
- "@aws-sdk/types",
- "tslib"
- ]
- },
- "@aws-crypto/supports-web-crypto@5.2.0": {
- "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==",
- "dependencies": [
- "tslib"
- ]
- },
- "@aws-crypto/util@5.2.0": {
- "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
- "dependencies": [
- "@aws-sdk/types",
- "@smithy/util-utf8@2.3.0",
- "tslib"
- ]
- },
- "@aws-sdk/client-bedrock-runtime@3.758.0": {
- "integrity": "sha512-T7s+fULUxN3AcJP+lgoUKLawzVEtyCTi+5Ga+wrHnqEPwAsM/wg7VctsZfow1fCgARLT/lzmP2LTCi8ycRnQWg==",
- "dependencies": [
- "@aws-crypto/sha256-browser",
- "@aws-crypto/sha256-js",
- "@aws-sdk/core",
- "@aws-sdk/credential-provider-node",
- "@aws-sdk/middleware-host-header",
- "@aws-sdk/middleware-logger",
- "@aws-sdk/middleware-recursion-detection",
- "@aws-sdk/middleware-user-agent",
- "@aws-sdk/region-config-resolver",
- "@aws-sdk/types",
- "@aws-sdk/util-endpoints",
- "@aws-sdk/util-user-agent-browser",
- "@aws-sdk/util-user-agent-node",
- "@smithy/config-resolver",
- "@smithy/core",
- "@smithy/eventstream-serde-browser",
- "@smithy/eventstream-serde-config-resolver",
- "@smithy/eventstream-serde-node",
- "@smithy/fetch-http-handler",
- "@smithy/hash-node",
- "@smithy/invalid-dependency",
- "@smithy/middleware-content-length",
- "@smithy/middleware-endpoint",
- "@smithy/middleware-retry",
- "@smithy/middleware-serde",
- "@smithy/middleware-stack",
- "@smithy/node-config-provider",
- "@smithy/node-http-handler",
- "@smithy/protocol-http",
- "@smithy/smithy-client",
- "@smithy/types",
- "@smithy/url-parser",
- "@smithy/util-base64",
- "@smithy/util-body-length-browser",
- "@smithy/util-body-length-node",
- "@smithy/util-defaults-mode-browser",
- "@smithy/util-defaults-mode-node",
- "@smithy/util-endpoints",
- "@smithy/util-middleware",
- "@smithy/util-retry",
- "@smithy/util-stream",
- "@smithy/util-utf8@4.0.0",
- "@types/uuid",
- "tslib",
- "uuid"
- ]
- },
- "@aws-sdk/client-sso@3.758.0": {
- "integrity": "sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==",
- "dependencies": [
- "@aws-crypto/sha256-browser",
- "@aws-crypto/sha256-js",
- "@aws-sdk/core",
- "@aws-sdk/middleware-host-header",
- "@aws-sdk/middleware-logger",
- "@aws-sdk/middleware-recursion-detection",
- "@aws-sdk/middleware-user-agent",
- "@aws-sdk/region-config-resolver",
- "@aws-sdk/types",
- "@aws-sdk/util-endpoints",
- "@aws-sdk/util-user-agent-browser",
- "@aws-sdk/util-user-agent-node",
- "@smithy/config-resolver",
- "@smithy/core",
- "@smithy/fetch-http-handler",
- "@smithy/hash-node",
- "@smithy/invalid-dependency",
- "@smithy/middleware-content-length",
- "@smithy/middleware-endpoint",
- "@smithy/middleware-retry",
- "@smithy/middleware-serde",
- "@smithy/middleware-stack",
- "@smithy/node-config-provider",
- "@smithy/node-http-handler",
- "@smithy/protocol-http",
- "@smithy/smithy-client",
- "@smithy/types",
- "@smithy/url-parser",
- "@smithy/util-base64",
- "@smithy/util-body-length-browser",
- "@smithy/util-body-length-node",
- "@smithy/util-defaults-mode-browser",
- "@smithy/util-defaults-mode-node",
- "@smithy/util-endpoints",
- "@smithy/util-middleware",
- "@smithy/util-retry",
- "@smithy/util-utf8@4.0.0",
- "tslib"
- ]
- },
- "@aws-sdk/core@3.758.0": {
- "integrity": "sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==",
- "dependencies": [
- "@aws-sdk/types",
- "@smithy/core",
- "@smithy/node-config-provider",
- "@smithy/property-provider",
- "@smithy/protocol-http",
- "@smithy/signature-v4",
- "@smithy/smithy-client",
- "@smithy/types",
- "@smithy/util-middleware",
- "fast-xml-parser",
- "tslib"
- ]
- },
- "@aws-sdk/credential-provider-env@3.758.0": {
- "integrity": "sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==",
- "dependencies": [
- "@aws-sdk/core",
- "@aws-sdk/types",
- "@smithy/property-provider",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/credential-provider-http@3.758.0": {
- "integrity": "sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==",
- "dependencies": [
- "@aws-sdk/core",
- "@aws-sdk/types",
- "@smithy/fetch-http-handler",
- "@smithy/node-http-handler",
- "@smithy/property-provider",
- "@smithy/protocol-http",
- "@smithy/smithy-client",
- "@smithy/types",
- "@smithy/util-stream",
- "tslib"
- ]
- },
- "@aws-sdk/credential-provider-ini@3.758.0": {
- "integrity": "sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==",
- "dependencies": [
- "@aws-sdk/core",
- "@aws-sdk/credential-provider-env",
- "@aws-sdk/credential-provider-http",
- "@aws-sdk/credential-provider-process",
- "@aws-sdk/credential-provider-sso",
- "@aws-sdk/credential-provider-web-identity",
- "@aws-sdk/nested-clients",
- "@aws-sdk/types",
- "@smithy/credential-provider-imds",
- "@smithy/property-provider",
- "@smithy/shared-ini-file-loader",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/credential-provider-node@3.758.0": {
- "integrity": "sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==",
- "dependencies": [
- "@aws-sdk/credential-provider-env",
- "@aws-sdk/credential-provider-http",
- "@aws-sdk/credential-provider-ini",
- "@aws-sdk/credential-provider-process",
- "@aws-sdk/credential-provider-sso",
- "@aws-sdk/credential-provider-web-identity",
- "@aws-sdk/types",
- "@smithy/credential-provider-imds",
- "@smithy/property-provider",
- "@smithy/shared-ini-file-loader",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/credential-provider-process@3.758.0": {
- "integrity": "sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==",
- "dependencies": [
- "@aws-sdk/core",
- "@aws-sdk/types",
- "@smithy/property-provider",
- "@smithy/shared-ini-file-loader",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/credential-provider-sso@3.758.0": {
- "integrity": "sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==",
- "dependencies": [
- "@aws-sdk/client-sso",
- "@aws-sdk/core",
- "@aws-sdk/token-providers",
- "@aws-sdk/types",
- "@smithy/property-provider",
- "@smithy/shared-ini-file-loader",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/credential-provider-web-identity@3.758.0": {
- "integrity": "sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==",
- "dependencies": [
- "@aws-sdk/core",
- "@aws-sdk/nested-clients",
- "@aws-sdk/types",
- "@smithy/property-provider",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/middleware-host-header@3.734.0": {
- "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==",
- "dependencies": [
- "@aws-sdk/types",
- "@smithy/protocol-http",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/middleware-logger@3.734.0": {
- "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==",
- "dependencies": [
- "@aws-sdk/types",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/middleware-recursion-detection@3.734.0": {
- "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==",
- "dependencies": [
- "@aws-sdk/types",
- "@smithy/protocol-http",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/middleware-user-agent@3.758.0": {
- "integrity": "sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==",
- "dependencies": [
- "@aws-sdk/core",
- "@aws-sdk/types",
- "@aws-sdk/util-endpoints",
- "@smithy/core",
- "@smithy/protocol-http",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/nested-clients@3.758.0": {
- "integrity": "sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==",
- "dependencies": [
- "@aws-crypto/sha256-browser",
- "@aws-crypto/sha256-js",
- "@aws-sdk/core",
- "@aws-sdk/middleware-host-header",
- "@aws-sdk/middleware-logger",
- "@aws-sdk/middleware-recursion-detection",
- "@aws-sdk/middleware-user-agent",
- "@aws-sdk/region-config-resolver",
- "@aws-sdk/types",
- "@aws-sdk/util-endpoints",
- "@aws-sdk/util-user-agent-browser",
- "@aws-sdk/util-user-agent-node",
- "@smithy/config-resolver",
- "@smithy/core",
- "@smithy/fetch-http-handler",
- "@smithy/hash-node",
- "@smithy/invalid-dependency",
- "@smithy/middleware-content-length",
- "@smithy/middleware-endpoint",
- "@smithy/middleware-retry",
- "@smithy/middleware-serde",
- "@smithy/middleware-stack",
- "@smithy/node-config-provider",
- "@smithy/node-http-handler",
- "@smithy/protocol-http",
- "@smithy/smithy-client",
- "@smithy/types",
- "@smithy/url-parser",
- "@smithy/util-base64",
- "@smithy/util-body-length-browser",
- "@smithy/util-body-length-node",
- "@smithy/util-defaults-mode-browser",
- "@smithy/util-defaults-mode-node",
- "@smithy/util-endpoints",
- "@smithy/util-middleware",
- "@smithy/util-retry",
- "@smithy/util-utf8@4.0.0",
- "tslib"
- ]
- },
- "@aws-sdk/region-config-resolver@3.734.0": {
- "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==",
- "dependencies": [
- "@aws-sdk/types",
- "@smithy/node-config-provider",
- "@smithy/types",
- "@smithy/util-config-provider",
- "@smithy/util-middleware",
- "tslib"
- ]
- },
- "@aws-sdk/token-providers@3.758.0": {
- "integrity": "sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==",
- "dependencies": [
- "@aws-sdk/nested-clients",
- "@aws-sdk/types",
- "@smithy/property-provider",
- "@smithy/shared-ini-file-loader",
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/types@3.734.0": {
- "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@aws-sdk/util-endpoints@3.743.0": {
- "integrity": "sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==",
- "dependencies": [
- "@aws-sdk/types",
- "@smithy/types",
- "@smithy/util-endpoints",
- "tslib"
- ]
- },
- "@aws-sdk/util-locate-window@3.723.0": {
- "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==",
- "dependencies": [
- "tslib"
- ]
- },
- "@aws-sdk/util-user-agent-browser@3.734.0": {
- "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==",
- "dependencies": [
- "@aws-sdk/types",
- "@smithy/types",
- "bowser",
- "tslib"
- ]
- },
- "@aws-sdk/util-user-agent-node@3.758.0": {
- "integrity": "sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==",
- "dependencies": [
- "@aws-sdk/middleware-user-agent",
- "@aws-sdk/types",
- "@smithy/node-config-provider",
- "@smithy/types",
- "tslib"
- ]
- },
"@babel/code-frame@7.26.2": {
"integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dependencies": [
@@ -2269,397 +1835,6 @@
"qr-creator"
]
},
- "@smithy/abort-controller@4.0.1": {
- "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/config-resolver@4.0.1": {
- "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==",
- "dependencies": [
- "@smithy/node-config-provider",
- "@smithy/types",
- "@smithy/util-config-provider",
- "@smithy/util-middleware",
- "tslib"
- ]
- },
- "@smithy/core@3.1.5": {
- "integrity": "sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==",
- "dependencies": [
- "@smithy/middleware-serde",
- "@smithy/protocol-http",
- "@smithy/types",
- "@smithy/util-body-length-browser",
- "@smithy/util-middleware",
- "@smithy/util-stream",
- "@smithy/util-utf8@4.0.0",
- "tslib"
- ]
- },
- "@smithy/credential-provider-imds@4.0.1": {
- "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==",
- "dependencies": [
- "@smithy/node-config-provider",
- "@smithy/property-provider",
- "@smithy/types",
- "@smithy/url-parser",
- "tslib"
- ]
- },
- "@smithy/eventstream-codec@4.0.1": {
- "integrity": "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==",
- "dependencies": [
- "@aws-crypto/crc32",
- "@smithy/types",
- "@smithy/util-hex-encoding",
- "tslib"
- ]
- },
- "@smithy/eventstream-serde-browser@4.0.1": {
- "integrity": "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==",
- "dependencies": [
- "@smithy/eventstream-serde-universal",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/eventstream-serde-config-resolver@4.0.1": {
- "integrity": "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/eventstream-serde-node@4.0.1": {
- "integrity": "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==",
- "dependencies": [
- "@smithy/eventstream-serde-universal",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/eventstream-serde-universal@4.0.1": {
- "integrity": "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==",
- "dependencies": [
- "@smithy/eventstream-codec",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/fetch-http-handler@5.0.1": {
- "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==",
- "dependencies": [
- "@smithy/protocol-http",
- "@smithy/querystring-builder",
- "@smithy/types",
- "@smithy/util-base64",
- "tslib"
- ]
- },
- "@smithy/hash-node@4.0.1": {
- "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==",
- "dependencies": [
- "@smithy/types",
- "@smithy/util-buffer-from@4.0.0",
- "@smithy/util-utf8@4.0.0",
- "tslib"
- ]
- },
- "@smithy/invalid-dependency@4.0.1": {
- "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/is-array-buffer@2.2.0": {
- "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
- "dependencies": [
- "tslib"
- ]
- },
- "@smithy/is-array-buffer@4.0.0": {
- "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==",
- "dependencies": [
- "tslib"
- ]
- },
- "@smithy/middleware-content-length@4.0.1": {
- "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==",
- "dependencies": [
- "@smithy/protocol-http",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/middleware-endpoint@4.0.6": {
- "integrity": "sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==",
- "dependencies": [
- "@smithy/core",
- "@smithy/middleware-serde",
- "@smithy/node-config-provider",
- "@smithy/shared-ini-file-loader",
- "@smithy/types",
- "@smithy/url-parser",
- "@smithy/util-middleware",
- "tslib"
- ]
- },
- "@smithy/middleware-retry@4.0.7": {
- "integrity": "sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==",
- "dependencies": [
- "@smithy/node-config-provider",
- "@smithy/protocol-http",
- "@smithy/service-error-classification",
- "@smithy/smithy-client",
- "@smithy/types",
- "@smithy/util-middleware",
- "@smithy/util-retry",
- "tslib",
- "uuid"
- ]
- },
- "@smithy/middleware-serde@4.0.2": {
- "integrity": "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/middleware-stack@4.0.1": {
- "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/node-config-provider@4.0.1": {
- "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==",
- "dependencies": [
- "@smithy/property-provider",
- "@smithy/shared-ini-file-loader",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/node-http-handler@4.0.3": {
- "integrity": "sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==",
- "dependencies": [
- "@smithy/abort-controller",
- "@smithy/protocol-http",
- "@smithy/querystring-builder",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/property-provider@4.0.1": {
- "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/protocol-http@5.0.1": {
- "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/querystring-builder@4.0.1": {
- "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==",
- "dependencies": [
- "@smithy/types",
- "@smithy/util-uri-escape",
- "tslib"
- ]
- },
- "@smithy/querystring-parser@4.0.1": {
- "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/service-error-classification@4.0.1": {
- "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==",
- "dependencies": [
- "@smithy/types"
- ]
- },
- "@smithy/shared-ini-file-loader@4.0.1": {
- "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/signature-v4@5.0.1": {
- "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==",
- "dependencies": [
- "@smithy/is-array-buffer@4.0.0",
- "@smithy/protocol-http",
- "@smithy/types",
- "@smithy/util-hex-encoding",
- "@smithy/util-middleware",
- "@smithy/util-uri-escape",
- "@smithy/util-utf8@4.0.0",
- "tslib"
- ]
- },
- "@smithy/smithy-client@4.1.6": {
- "integrity": "sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==",
- "dependencies": [
- "@smithy/core",
- "@smithy/middleware-endpoint",
- "@smithy/middleware-stack",
- "@smithy/protocol-http",
- "@smithy/types",
- "@smithy/util-stream",
- "tslib"
- ]
- },
- "@smithy/types@4.1.0": {
- "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==",
- "dependencies": [
- "tslib"
- ]
- },
- "@smithy/url-parser@4.0.1": {
- "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==",
- "dependencies": [
- "@smithy/querystring-parser",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/util-base64@4.0.0": {
- "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==",
- "dependencies": [
- "@smithy/util-buffer-from@4.0.0",
- "@smithy/util-utf8@4.0.0",
- "tslib"
- ]
- },
- "@smithy/util-body-length-browser@4.0.0": {
- "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==",
- "dependencies": [
- "tslib"
- ]
- },
- "@smithy/util-body-length-node@4.0.0": {
- "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==",
- "dependencies": [
- "tslib"
- ]
- },
- "@smithy/util-buffer-from@2.2.0": {
- "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
- "dependencies": [
- "@smithy/is-array-buffer@2.2.0",
- "tslib"
- ]
- },
- "@smithy/util-buffer-from@4.0.0": {
- "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==",
- "dependencies": [
- "@smithy/is-array-buffer@4.0.0",
- "tslib"
- ]
- },
- "@smithy/util-config-provider@4.0.0": {
- "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==",
- "dependencies": [
- "tslib"
- ]
- },
- "@smithy/util-defaults-mode-browser@4.0.7": {
- "integrity": "sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==",
- "dependencies": [
- "@smithy/property-provider",
- "@smithy/smithy-client",
- "@smithy/types",
- "bowser",
- "tslib"
- ]
- },
- "@smithy/util-defaults-mode-node@4.0.7": {
- "integrity": "sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==",
- "dependencies": [
- "@smithy/config-resolver",
- "@smithy/credential-provider-imds",
- "@smithy/node-config-provider",
- "@smithy/property-provider",
- "@smithy/smithy-client",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/util-endpoints@3.0.1": {
- "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==",
- "dependencies": [
- "@smithy/node-config-provider",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/util-hex-encoding@4.0.0": {
- "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==",
- "dependencies": [
- "tslib"
- ]
- },
- "@smithy/util-middleware@4.0.1": {
- "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==",
- "dependencies": [
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/util-retry@4.0.1": {
- "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==",
- "dependencies": [
- "@smithy/service-error-classification",
- "@smithy/types",
- "tslib"
- ]
- },
- "@smithy/util-stream@4.1.2": {
- "integrity": "sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==",
- "dependencies": [
- "@smithy/fetch-http-handler",
- "@smithy/node-http-handler",
- "@smithy/types",
- "@smithy/util-base64",
- "@smithy/util-buffer-from@4.0.0",
- "@smithy/util-hex-encoding",
- "@smithy/util-utf8@4.0.0",
- "tslib"
- ]
- },
- "@smithy/util-uri-escape@4.0.0": {
- "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==",
- "dependencies": [
- "tslib"
- ]
- },
- "@smithy/util-utf8@2.3.0": {
- "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
- "dependencies": [
- "@smithy/util-buffer-from@2.2.0",
- "tslib"
- ]
- },
- "@smithy/util-utf8@4.0.0": {
- "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==",
- "dependencies": [
- "@smithy/util-buffer-from@4.0.0",
- "tslib"
- ]
- },
"@tailwindcss/node@4.0.13": {
"integrity": "sha512-P9TmtE9Vew0vv5FwyD4bsg/dHHsIsAuUXkenuGUc5gm8fYgaxpdoxIKngCyEMEQxyCKR8PQY5V5VrrKNOx7exg==",
"dependencies": [
@@ -3044,9 +2219,6 @@
"@types/unist@3.0.3": {
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="
},
- "@types/uuid@9.0.8": {
- "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA=="
- },
"@types/webxr@0.5.21": {
"integrity": "sha512-geZIAtLzjGmgY2JUi6VxXdCrTb99A7yP49lxLr2Nm/uIK0PkkxcEi4OGhoGDO4pxCf3JwGz2GiJL2Ej4K2bKaA=="
},
@@ -3397,8 +2569,8 @@
"ai@4.1.54_react@18.3.1_zod@3.24.2": {
"integrity": "sha512-VcUZhNEC9i1OpdhDaz1cF0IllgMqhwoUdqHQT1U3dKvS9KnOa9qvEtUUAilA+VHI/1LSZF4VzGhXPC7QMT9NMg==",
"dependencies": [
- "@ai-sdk/provider@1.0.10",
- "@ai-sdk/provider-utils@2.1.11_zod@3.24.2",
+ "@ai-sdk/provider",
+ "@ai-sdk/provider-utils",
"@ai-sdk/react",
"@ai-sdk/ui-utils",
"@opentelemetry/api",
@@ -3530,9 +2702,6 @@
"bignumber.js@9.1.2": {
"integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="
},
- "bowser@2.11.0": {
- "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
- },
"brace-expansion@2.0.1": {
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dependencies": [
@@ -4238,12 +3407,6 @@
"fast-safe-stringify@2.1.1": {
"integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
},
- "fast-xml-parser@4.4.1": {
- "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==",
- "dependencies": [
- "strnum"
- ]
- },
"fastq@1.19.1": {
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
"dependencies": [
@@ -6326,9 +5489,6 @@
"strip-json-comments@3.1.1": {
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
},
- "strnum@1.1.2": {
- "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="
- },
"style-mod@4.1.2": {
"integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw=="
},
@@ -7082,9 +6242,7 @@
"toolshed": {
"dependencies": [
"jsr:@std/cli@^1.0.12",
- "npm:@ai-sdk/amazon-bedrock@^1.1.6",
"npm:@ai-sdk/anthropic@^1.1.6",
- "npm:@ai-sdk/cerebras@~0.1.8",
"npm:@ai-sdk/google-vertex@^2.1.12",
"npm:@ai-sdk/groq@^1.1.7",
"npm:@ai-sdk/openai@^1.1.9",
diff --git a/toolshed/deno.json b/toolshed/deno.json
index 02d1395de..77cc581a5 100644
--- a/toolshed/deno.json
+++ b/toolshed/deno.json
@@ -9,9 +9,7 @@
},
"imports": {
"@/": "./",
- "@ai-sdk/amazon-bedrock": "npm:@ai-sdk/amazon-bedrock@^1.1.6",
"@ai-sdk/anthropic": "npm:@ai-sdk/anthropic@^1.1.6",
- "@ai-sdk/cerebras": "npm:@ai-sdk/cerebras@^0.1.8",
"@ai-sdk/google-vertex": "npm:@ai-sdk/google-vertex@^2.1.12",
"@std/cli": "jsr:@std/cli@^1.0.12",
"gcp-metadata": "npm:gcp-metadata@6.1.0",
diff --git a/toolshed/routes/ai/llm/models.ts b/toolshed/routes/ai/llm/models.ts
index 7b45db65d..cbb6a2a0c 100644
--- a/toolshed/routes/ai/llm/models.ts
+++ b/toolshed/routes/ai/llm/models.ts
@@ -3,7 +3,6 @@ import { createOpenAI } from "@ai-sdk/openai";
import { createGroq, groq } from "@ai-sdk/groq";
import { openai } from "@ai-sdk/openai";
import { createVertex, vertex } from "@ai-sdk/google-vertex";
-import { cerebras, createCerebras } from "@ai-sdk/cerebras";
import env from "@/env.ts";
@@ -51,8 +50,7 @@ const addModel = ({
| typeof anthropic
| typeof groq
| typeof openai
- | typeof vertex
- | typeof cerebras;
+ | typeof vertex;
name: string;
aliases: string[];
capabilities: Capabilities;
@@ -93,21 +91,6 @@ if (env.CTTS_AI_LLM_ANTHROPIC_API_KEY) {
const anthropicProvider = createAnthropic({
apiKey: env.CTTS_AI_LLM_ANTHROPIC_API_KEY,
});
- addModel({
- provider: anthropicProvider,
- name: "anthropic:claude-3-5-haiku-20241022",
- aliases: ["anthropic:claude-3-5-haiku-latest", "claude-3-5-haiku"],
- capabilities: {
- contextWindow: 200_000,
- maxOutputTokens: 8192,
- images: true,
- prefill: true,
- systemPrompt: true,
- stopSequences: true,
- streaming: true,
- jsonMode: true,
- },
- });
addModel({
provider: anthropicProvider,
@@ -163,22 +146,6 @@ if (env.CTTS_AI_LLM_ANTHROPIC_API_KEY) {
},
},
});
-
- addModel({
- provider: anthropicProvider,
- name: "anthropic:claude-3-opus-20240229",
- aliases: ["anthropic:claude-3-opus-latest", "claude-3-opus"],
- capabilities: {
- contextWindow: 200_000,
- maxOutputTokens: 4096,
- images: true,
- prefill: true,
- systemPrompt: true,
- stopSequences: true,
- streaming: true,
- jsonMode: true,
- },
- });
}
if (env.CTTS_AI_LLM_GROQ_API_KEY) {
@@ -264,22 +231,6 @@ if (env.CTTS_AI_LLM_GROQ_API_KEY) {
jsonMode: true,
},
});
-
- addModel({
- provider: groqProvider,
- name: "groq:llama-3.2-90b-vision-preview",
- aliases: ["groq:llama-3.2-90b-vision", "llama-3.2-90b-vision"],
- capabilities: {
- contextWindow: 128_000,
- maxOutputTokens: 8000,
- images: true,
- prefill: true,
- systemPrompt: true,
- stopSequences: true,
- streaming: false,
- jsonMode: true,
- },
- });
}
if (env.CTTS_AI_LLM_OPENAI_API_KEY) {
@@ -430,70 +381,6 @@ if (env.CTTS_AI_LLM_GOOGLE_APPLICATION_CREDENTIALS) {
location: env.CTTS_AI_LLM_GOOGLE_VERTEX_LOCATION,
});
- addModel({
- provider: vertexProvider,
- name: "google:gemini-2.0-flash",
- aliases: ["google:gemini-2.0-flash", "gemini-2.0-flash"],
- capabilities: {
- contextWindow: 1_048_576,
- maxOutputTokens: 8192,
- images: true,
- prefill: true,
- systemPrompt: true,
- stopSequences: true,
- streaming: true,
- jsonMode: true,
- },
- });
-
- addModel({
- provider: vertexProvider,
- name: "google:gemini-2.0-flash-lite-preview-02-05",
- aliases: ["google:gemini-2.0-flash-lite", "gemini-2.0-flash-lite"],
- capabilities: {
- contextWindow: 1_048_576,
- maxOutputTokens: 8192,
- images: true,
- prefill: true,
- systemPrompt: true,
- stopSequences: true,
- streaming: true,
- jsonMode: true,
- },
- });
-
- addModel({
- provider: vertexProvider,
- name: "google:gemini-2.0-flash-thinking-exp-01-21",
- aliases: ["google:gemini-2.0-flash-thinking", "gemini-2.0-flash-thinking"],
- capabilities: {
- contextWindow: 1_048_576,
- maxOutputTokens: 8192,
- images: true,
- prefill: true,
- systemPrompt: true,
- stopSequences: true,
- streaming: true,
- jsonMode: true,
- },
- });
-
- addModel({
- provider: vertexProvider,
- name: "google:gemini-2.0-pro-exp-02-05",
- aliases: ["google:gemini-2.0-pro", "gemini-2.0-pro"],
- capabilities: {
- contextWindow: 2_097_152,
- maxOutputTokens: 8192,
- images: true,
- prefill: true,
- systemPrompt: true,
- stopSequences: true,
- streaming: true,
- jsonMode: true,
- },
- });
-
addModel({
provider: vertexProvider,
name: "google:gemini-2.5-pro-exp-03-25",
@@ -511,27 +398,6 @@ if (env.CTTS_AI_LLM_GOOGLE_APPLICATION_CREDENTIALS) {
});
}
-if (env.CTTS_AI_LLM_CEREBRAS_API_KEY) {
- const cerebrasProvider = createCerebras({
- apiKey: env.CTTS_AI_LLM_CEREBRAS_API_KEY,
- });
- addModel({
- provider: cerebrasProvider,
- name: "cerebras:llama-3.3-70b",
- aliases: ["cerebras"],
- capabilities: {
- contextWindow: 8192,
- maxOutputTokens: 8192,
- images: false,
- prefill: false,
- systemPrompt: true,
- stopSequences: true,
- streaming: true,
- jsonMode: false,
- },
- });
-}
-
if (env.CTTS_AI_LLM_PERPLEXITY_API_KEY) {
const perplexityProvider = createOpenAI({
name: "perplexity",
@@ -570,75 +436,8 @@ if (env.CTTS_AI_LLM_PERPLEXITY_API_KEY) {
jsonMode: false,
},
});
-
- addModel({
- provider: perplexityProvider,
- name: "perplexity:sonar",
- aliases: ["sonar"],
- capabilities: {
- contextWindow: 127_000,
- maxOutputTokens: 8000,
- images: false,
- prefill: false,
- systemPrompt: false,
- stopSequences: true,
- streaming: true,
- jsonMode: false,
- },
- });
}
-// FIXME(jake): There's some package import error with the bedrock provider. Commenting out for now.
-// if (
-// env.CTTS_AI_LLM_AWS_ACCESS_KEY_ID &&
-// env.CTTS_AI_LLM_AWS_SECRET_ACCESS_KEY
-// ) {
-// addModel({
-// provider: bedrock,
-// name: "us.amazon.nova-micro-v1:0",
-// aliases: ["amazon:nova-micro", "nova-micro"],
-// capabilities: {
-// contextWindow: 128_000,
-// maxOutputTokens: 5000,
-// images: false,
-// prefill: true,
-// systemPrompt: true,
-// stopSequences: true,
-// streaming: true,
-// },
-// });
-
-// addModel({
-// provider: bedrock,
-// name: "us.amazon.nova-lite-v1:0",
-// aliases: ["amazon:nova-lite", "nova-lite"],
-// capabilities: {
-// contextWindow: 300_000,
-// maxOutputTokens: 5000,
-// images: true,
-// prefill: true,
-// systemPrompt: true,
-// stopSequences: true,
-// streaming: true,
-// },
-// });
-
-// addModel({
-// provider: bedrock,
-// name: "us.amazon.nova-pro-v1:0",
-// aliases: ["amazon:nova-pro", "nova-pro"],
-// capabilities: {
-// contextWindow: 300_000,
-// maxOutputTokens: 5000,
-// images: true,
-// prefill: true,
-// systemPrompt: true,
-// stopSequences: true,
-// streaming: true,
-// },
-// });
-// }
-
export const findModel = (name: string) => {
return MODELS[name];
};
From 594b03bc657d9de6531314acbb41eac604b3cb70 Mon Sep 17 00:00:00 2001
From: jakedahn
Date: Wed, 2 Apr 2025 09:05:22 -0600
Subject: [PATCH 03/18] adding new cached llm responses
---
...50a1f503e51a8fd3e6192b100e3cb49d1e308.json | 19 ++++++++++++++++++
...8fc10f4b0b5f705ef353de1f26f02e0a60f30.json | 19 ++++++++++++++++++
...98033d146e3b2627adac30477a9aa8a41cab.json} | 4 ++--
...7221231dac12cd20e0af4e5d3e89a5919daeb.json | 20 -------------------
...30bac958a51df98cdd3316b9914bb655ec5b6.json | 20 +++++++++++++++++++
...5ed8a9106ec2f5e150b3f95b4fcab9d1f112f.json | 19 ------------------
6 files changed, 60 insertions(+), 41 deletions(-)
create mode 100644 jumble/integration/cache/llm-api-cache/1121698eba5445cf467a71ae23350a1f503e51a8fd3e6192b100e3cb49d1e308.json
create mode 100644 jumble/integration/cache/llm-api-cache/9c45292fe62aed90a791ba25a758fc10f4b0b5f705ef353de1f26f02e0a60f30.json
rename jumble/integration/cache/llm-api-cache/{c02a73eaaab29ba5c9f480e301afa7f4dd0f0009012cf01e01c725a837301f03.json => 9fbdc34b0cfd31001621cf6a1e4498033d146e3b2627adac30477a9aa8a41cab.json} (65%)
delete mode 100644 jumble/integration/cache/llm-api-cache/b3fc0f350fc478943cc9c8b7b227221231dac12cd20e0af4e5d3e89a5919daeb.json
create mode 100644 jumble/integration/cache/llm-api-cache/c7d7182e68202f131adfa9e2f2830bac958a51df98cdd3316b9914bb655ec5b6.json
delete mode 100644 jumble/integration/cache/llm-api-cache/cfbaaaf5efb72c9d307842196b35ed8a9106ec2f5e150b3f95b4fcab9d1f112f.json
diff --git a/jumble/integration/cache/llm-api-cache/1121698eba5445cf467a71ae23350a1f503e51a8fd3e6192b100e3cb49d1e308.json b/jumble/integration/cache/llm-api-cache/1121698eba5445cf467a71ae23350a1f503e51a8fd3e6192b100e3cb49d1e308.json
new file mode 100644
index 000000000..65abfd58f
--- /dev/null
+++ b/jumble/integration/cache/llm-api-cache/1121698eba5445cf467a71ae23350a1f503e51a8fd3e6192b100e3cb49d1e308.json
@@ -0,0 +1,19 @@
+{
+ "model": "anthropic:claude-3-7-sonnet-latest",
+ "system": "\nYou are creating a simple minimal viable product (MVP) based on a user's goal. Focus on the simplest implementation that works.\n\nGiven a user's feature request, you will:\n1. Create a short title (2-5 words) that names the artifact\n2. Create a one-sentence description in the format \"A to \"\n3. Create a concise specification (3-5 sentences max)\n4. Generate a brief implementation plan (3 steps max)\n5. Design a minimal JSON schema that represents the core data model\n\nYour response must be structured as follows:\n\n\n[Short title for the artifact, 2-5 words]\n\n\n\n[One-sentence description in the format \"A to \"]\n\n\n\n[Concise specification that captures only the essential requirements]\n\n\n\n[Brief 3-step implementation plan]\n\n\n\n[Minimal JSON Schema in valid JSON format that represents the core data model]\n\n\n\n[Simple example data that conforms to the schema]\n\n\nSCHEMA GUIDELINES:\n1. Keep it minimal:\n - Include only essential fields (5-7 properties max)\n - Focus on the core functionality\n - If user requested complex features, simplify for this first version\n \n2. Each property should have:\n - A descriptive \"title\" field\n - A brief \"description\" field\n - A sensible default value where appropriate\n \n3. Example of a simple schema:\n```json\n{\n \"type\": \"object\",\n \"title\": \"Note\",\n \"description\": \"A simple note for the user\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"title\": \"Title\",\n \"description\": \"Title of the note\",\n \"default\": \"New Note\"\n },\n \"content\": {\n \"type\": \"string\",\n \"title\": \"Content\",\n \"description\": \"Content of the note\"\n },\n \"created\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"title\": \"Created Date\",\n \"description\": \"When the note was created\",\n }\n },\n \"required\": [\"title\", \"content\"]\n}\n```\n\nIMPORTANT:\n- Focus on the simplest working version\n- Aim for fewer fields rather than more\n- But still capture all the important state the user is creating\n- Remember, the user can always iterate and improve the solution later\n",
+ "stream": false,
+ "messages": [
+ {
+ "role": "user",
+ "content": "[{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]}]"
+ },
+ {
+ "role": "assistant",
+ "content": "I need more information about what you'd like to create. Please provide a feature request or describe what you're trying to build, and I'll help you create a minimal viable product specification for it."
+ },
+ {
+ "role": "assistant",
+ "content": "I need more information about what you'd like to create. Please provide a feature request or describe what you're trying to build, and I'll help you create a minimal viable product specification for it."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/jumble/integration/cache/llm-api-cache/9c45292fe62aed90a791ba25a758fc10f4b0b5f705ef353de1f26f02e0a60f30.json b/jumble/integration/cache/llm-api-cache/9c45292fe62aed90a791ba25a758fc10f4b0b5f705ef353de1f26f02e0a60f30.json
new file mode 100644
index 000000000..8b215aa49
--- /dev/null
+++ b/jumble/integration/cache/llm-api-cache/9c45292fe62aed90a791ba25a758fc10f4b0b5f705ef353de1f26f02e0a60f30.json
@@ -0,0 +1,19 @@
+{
+ "model": "anthropic:claude-3-7-sonnet-latest",
+ "system": "\nYou are creating a simple minimal viable product (MVP) based on a user's goal. Focus on the simplest implementation that works.\n\nGiven a user's feature request, you will:\n1. Create a short title (2-5 words) that names the artifact\n2. Create a one-sentence description in the format \"A to \"\n3. Create a concise specification (3-5 sentences max)\n4. Generate a brief implementation plan (3 steps max)\n5. Design a minimal JSON schema that represents the core data model\n\nYour response must be structured as follows:\n\n\n[Short title for the artifact, 2-5 words]\n\n\n\n[One-sentence description in the format \"A to \"]\n\n\n\n[Concise specification that captures only the essential requirements]\n\n\n\n[Brief 3-step implementation plan]\n\n\n\n[Minimal JSON Schema in valid JSON format that represents the core data model]\n\n\n\n[Simple example data that conforms to the schema]\n\n\nSCHEMA GUIDELINES:\n1. Keep it minimal:\n - Include only essential fields (5-7 properties max)\n - Focus on the core functionality\n - If user requested complex features, simplify for this first version\n \n2. Each property should have:\n - A descriptive \"title\" field\n - A brief \"description\" field\n - A sensible default value where appropriate\n \n3. Example of a simple schema:\n```json\n{\n \"type\": \"object\",\n \"title\": \"Note\",\n \"description\": \"A simple note for the user\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"title\": \"Title\",\n \"description\": \"Title of the note\",\n \"default\": \"New Note\"\n },\n \"content\": {\n \"type\": \"string\",\n \"title\": \"Content\",\n \"description\": \"Content of the note\"\n },\n \"created\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"title\": \"Created Date\",\n \"description\": \"When the note was created\",\n }\n },\n \"required\": [\"title\", \"content\"]\n}\n```\n\nIMPORTANT:\n- Focus on the simplest working version\n- Aim for fewer fields rather than more\n- But still capture all the important state the user is creating\n- Remember, the user can always iterate and improve the solution later\n",
+ "stream": false,
+ "messages": [
+ {
+ "role": "user",
+ "content": "[{\"type\":\"paragraph\",\"children\":[{\"text\":\"count of values\"}]}]"
+ },
+ {
+ "role": "assistant",
+ "content": "\nValue Counter\n\n\n\nA tool to count and track the frequency of values.\n\n\n\nThe Value Counter allows users to input values and track how many times each unique value appears. It maintains a running tally of each value entered and displays the current count for each. The counter should support text values and provide a simple way to add new entries or reset counts.\n\n\n\n1. Create a data structure to store unique values and their counts\n2. Implement functions to add values and increment their counts\n3. Build a simple interface to display the current counts and allow input\n\n\n\n{\n \"type\": \"object\",\n \"title\": \"ValueCounter\",\n \"description\": \"Tracks the frequency of values\",\n \"properties\": {\n \"counts\": {\n \"type\": \"object\",\n \"title\": \"Counts\",\n \"description\": \"Map of values to their occurrence counts\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"default\": {}\n },\n \"totalEntries\": {\n \"type\": \"integer\",\n \"title\": \"Total Entries\",\n \"description\": \"Total number of values entered\",\n \"minimum\": 0,\n \"default\": 0\n },\n \"lastAdded\": {\n \"type\": \"string\",\n \"title\": \"Last Added\",\n \"description\": \"The most recently added value\",\n \"default\": \"\"\n },\n \"created\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"title\": \"Created Date\",\n \"description\": \"When the counter was created\"\n }\n },\n \"required\": [\"counts\", \"totalEntries\"]\n}\n\n\n\n{\n \"counts\": {\n \"apple\": 3,\n \"banana\": 2,\n \"orange\": 1\n },\n \"totalEntries\": 6,\n \"lastAdded\": \"apple\",\n \"created\": \"2023-05-15T14:30:00Z\"\n}\n"
+ },
+ {
+ "role": "assistant",
+ "content": "\nValue Counter\n\n\n\nA tool to count and track the frequency of values.\n\n\n\nThe Value Counter allows users to input values and track how many times each unique value appears. It maintains a running tally of each value entered and displays the current count for each. The counter should support text values and provide a simple way to add new entries or reset counts.\n\n\n\n1. Create a data structure to store unique values and their counts\n2. Implement functions to add values and increment their counts\n3. Build a simple interface to display the current counts and allow input\n\n\n\n{\n \"type\": \"object\",\n \"title\": \"ValueCounter\",\n \"description\": \"Tracks the frequency of values\",\n \"properties\": {\n \"counts\": {\n \"type\": \"object\",\n \"title\": \"Counts\",\n \"description\": \"Map of values to their occurrence counts\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"default\": {}\n },\n \"totalEntries\": {\n \"type\": \"integer\",\n \"title\": \"Total Entries\",\n \"description\": \"Total number of values entered\",\n \"minimum\": 0,\n \"default\": 0\n },\n \"lastAdded\": {\n \"type\": \"string\",\n \"title\": \"Last Added\",\n \"description\": \"The most recently added value\",\n \"default\": \"\"\n },\n \"created\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"title\": \"Created Date\",\n \"description\": \"When the counter was created\"\n }\n },\n \"required\": [\"counts\", \"totalEntries\"]\n}\n\n\n\n{\n \"counts\": {\n \"apple\": 3,\n \"banana\": 2,\n \"orange\": 1\n },\n \"totalEntries\": 6,\n \"lastAdded\": \"apple\",\n \"created\": \"2023-05-15T14:30:00Z\"\n}\n"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/jumble/integration/cache/llm-api-cache/c02a73eaaab29ba5c9f480e301afa7f4dd0f0009012cf01e01c725a837301f03.json b/jumble/integration/cache/llm-api-cache/9fbdc34b0cfd31001621cf6a1e4498033d146e3b2627adac30477a9aa8a41cab.json
similarity index 65%
rename from jumble/integration/cache/llm-api-cache/c02a73eaaab29ba5c9f480e301afa7f4dd0f0009012cf01e01c725a837301f03.json
rename to jumble/integration/cache/llm-api-cache/9fbdc34b0cfd31001621cf6a1e4498033d146e3b2627adac30477a9aa8a41cab.json
index c32ce2ec5..61b508939 100644
--- a/jumble/integration/cache/llm-api-cache/c02a73eaaab29ba5c9f480e301afa7f4dd0f0009012cf01e01c725a837301f03.json
+++ b/jumble/integration/cache/llm-api-cache/9fbdc34b0cfd31001621cf6a1e4498033d146e3b2627adac30477a9aa8a41cab.json
@@ -9,11 +9,11 @@
},
{
"role": "assistant",
- "content": "\nValue Counter\n\n\n\nA utility to count occurrences of values in an array.\n\n\n\nThe Value Counter will analyze the \"values\" array within the simpleValue2 object and count the occurrences of each unique string. It will generate a report showing each unique value and its count. The counter will handle empty arrays and maintain the original data structure while adding the count results.\n\n\n\n1. Parse the existing object and extract the \"values\" array from simpleValue2.\n2. Count occurrences of each unique string value in the array.\n3. Generate a result object containing the original data plus the count information.\n\n\n\n{\n \"type\": \"object\",\n \"title\": \"Value Count Result\",\n \"description\": \"Result of counting values in an array\",\n \"properties\": {\n \"originalData\": {\n \"type\": \"object\",\n \"title\": \"Original Data\",\n \"description\": \"The original data structure that was analyzed\",\n \"properties\": {\n \"simpleValue2\": {\n \"type\": \"object\",\n \"properties\": {\n \"values\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n },\n \"counts\": {\n \"type\": \"object\",\n \"title\": \"Value Counts\",\n \"description\": \"Count of occurrences for each unique value\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"totalCount\": {\n \"type\": \"integer\",\n \"title\": \"Total Count\",\n \"description\": \"Total number of values in the array\",\n \"minimum\": 0,\n \"default\": 0\n },\n \"uniqueCount\": {\n \"type\": \"integer\",\n \"title\": \"Unique Count\",\n \"description\": \"Number of unique values in the array\",\n \"minimum\": 0,\n \"default\": 0\n }\n },\n \"required\": [\"originalData\", \"counts\", \"totalCount\", \"uniqueCount\"]\n}\n"
+ "content": "\nValue Counter\n\n\n\nA utility to count occurrences of values in an array.\n\n\n\nThe Value Counter will analyze the \"values\" array within the simpleValue2 object and count the occurrences of each unique string. It will generate a report showing each unique value and its count. The counter will handle empty arrays and maintain the original data structure while adding the count results.\n\n\n\n1. Parse the existing object and extract the \"values\" array from simpleValue2.\n2. Count occurrences of each unique string value in the array.\n3. Generate a result object containing the original data plus the count information.\n\n\n\n{\n \"type\": \"object\",\n \"title\": \"Value Count Result\",\n \"description\": \"Result of counting occurrences in the values array\",\n \"properties\": {\n \"originalData\": {\n \"type\": \"object\",\n \"title\": \"Original Data\",\n \"description\": \"The original data structure that was analyzed\",\n \"properties\": {\n \"simpleValue2\": {\n \"type\": \"object\",\n \"properties\": {\n \"values\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n },\n \"counts\": {\n \"type\": \"object\",\n \"title\": \"Value Counts\",\n \"description\": \"Count of occurrences for each unique value\",\n \"additionalProperties\": {\n \"type\": \"integer\"\n }\n },\n \"totalCount\": {\n \"type\": \"integer\",\n \"title\": \"Total Count\",\n \"description\": \"Total number of values in the array\",\n \"default\": 0\n },\n \"uniqueCount\": {\n \"type\": \"integer\",\n \"title\": \"Unique Count\",\n \"description\": \"Number of unique values in the array\",\n \"default\": 0\n }\n },\n \"required\": [\"originalData\", \"counts\", \"totalCount\", \"uniqueCount\"]\n}\n"
},
{
"role": "assistant",
- "content": "\nValue Counter\n\n\n\nA utility to count occurrences of values in an array.\n\n\n\nThe Value Counter will analyze the \"values\" array within the simpleValue2 object and count the occurrences of each unique string. It will generate a report showing each unique value and its count. The counter will handle empty arrays and maintain the original data structure while adding the count results.\n\n\n\n1. Parse the existing object and extract the \"values\" array from simpleValue2.\n2. Count occurrences of each unique string value in the array.\n3. Generate a result object containing the original data plus the count information.\n\n\n\n{\n \"type\": \"object\",\n \"title\": \"Value Count Result\",\n \"description\": \"Result of counting values in an array\",\n \"properties\": {\n \"originalData\": {\n \"type\": \"object\",\n \"title\": \"Original Data\",\n \"description\": \"The original data structure that was analyzed\",\n \"properties\": {\n \"simpleValue2\": {\n \"type\": \"object\",\n \"properties\": {\n \"values\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n },\n \"counts\": {\n \"type\": \"object\",\n \"title\": \"Value Counts\",\n \"description\": \"Count of occurrences for each unique value\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"totalCount\": {\n \"type\": \"integer\",\n \"title\": \"Total Count\",\n \"description\": \"Total number of values in the array\",\n \"minimum\": 0,\n \"default\": 0\n },\n \"uniqueCount\": {\n \"type\": \"integer\",\n \"title\": \"Unique Count\",\n \"description\": \"Number of unique values in the array\",\n \"minimum\": 0,\n \"default\": 0\n }\n },\n \"required\": [\"originalData\", \"counts\", \"totalCount\", \"uniqueCount\"]\n}\n"
+ "content": "\nValue Counter\n\n\n\nA utility to count occurrences of values in an array.\n\n\n\nThe Value Counter will analyze the \"values\" array within the simpleValue2 object and count the occurrences of each unique string. It will generate a report showing each unique value and its count. The counter will handle empty arrays and maintain the original data structure while adding the count results.\n\n\n\n1. Parse the existing object and extract the \"values\" array from simpleValue2.\n2. Count occurrences of each unique string value in the array.\n3. Generate a result object containing the original data plus the count information.\n\n\n\n{\n \"type\": \"object\",\n \"title\": \"Value Count Result\",\n \"description\": \"Result of counting occurrences in the values array\",\n \"properties\": {\n \"originalData\": {\n \"type\": \"object\",\n \"title\": \"Original Data\",\n \"description\": \"The original data structure that was analyzed\",\n \"properties\": {\n \"simpleValue2\": {\n \"type\": \"object\",\n \"properties\": {\n \"values\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n },\n \"counts\": {\n \"type\": \"object\",\n \"title\": \"Value Counts\",\n \"description\": \"Count of occurrences for each unique value\",\n \"additionalProperties\": {\n \"type\": \"integer\"\n }\n },\n \"totalCount\": {\n \"type\": \"integer\",\n \"title\": \"Total Count\",\n \"description\": \"Total number of values in the array\",\n \"default\": 0\n },\n \"uniqueCount\": {\n \"type\": \"integer\",\n \"title\": \"Unique Count\",\n \"description\": \"Number of unique values in the array\",\n \"default\": 0\n }\n },\n \"required\": [\"originalData\", \"counts\", \"totalCount\", \"uniqueCount\"]\n}\n"
}
]
}
\ No newline at end of file
diff --git a/jumble/integration/cache/llm-api-cache/b3fc0f350fc478943cc9c8b7b227221231dac12cd20e0af4e5d3e89a5919daeb.json b/jumble/integration/cache/llm-api-cache/b3fc0f350fc478943cc9c8b7b227221231dac12cd20e0af4e5d3e89a5919daeb.json
deleted file mode 100644
index a489cd05e..000000000
--- a/jumble/integration/cache/llm-api-cache/b3fc0f350fc478943cc9c8b7b227221231dac12cd20e0af4e5d3e89a5919daeb.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "model": "anthropic:claude-3-7-sonnet-latest",
- "system": "# React Component Builder\n\nCreate an interactive React component that fulfills the user's request. Focus on delivering a clean, useful implementation with appropriate features.\n\n## You Are Part of a Two-Phase Process\n\n1. First phase (already completed):\n - Analyzed the user's request\n - Created a detailed specification\n - Generated a structured data schema\n\n2. Your job (second phase):\n - Create a reactive UI component based on the provided specification and schema\n - Implement the UI exactly according to the specification\n - Strictly adhere to the data schema provided\n\n## Required Elements\n- Define a title with `const title = 'Your App Name';`\n- Implement both `onLoad` and `onReady` functions\n- Use Tailwind CSS for styling with tasteful defaults\n- Do not write