From 2ac3fdb2c7978086c9c29d62ed0a1644db2ed262 Mon Sep 17 00:00:00 2001 From: Josh Mabry Date: Thu, 1 Aug 2024 22:18:55 -0700 Subject: [PATCH 01/18] update config shape, add graph and tools pkgs --- ava.config.json | 76 +++++++++++++++------- packages/cli/src/utils/get-model-config.ts | 15 +++-- packages/graph/package.json | 29 +++++++++ packages/graph/src/index.ts | 0 packages/graph/tsconfig.cjs.json | 8 +++ packages/graph/tsconfig.json | 21 ++++++ packages/tools/fetch-github.ts | 19 ++++++ packages/tools/fetch-youtube.ts | 14 ++++ packages/tools/package.json | 30 +++++++++ packages/tools/process/extract-links.ts | 14 ++++ packages/tools/process/parse-transcript.ts | 14 ++++ packages/tools/scrape-website.ts | 24 +++++++ packages/tools/tmp.json | 0 packages/tools/transform-query.ts | 38 +++++++++++ packages/tools/tsconfig.cjs.json | 8 +++ packages/tools/tsconfig.json | 21 ++++++ 16 files changed, 302 insertions(+), 29 deletions(-) create mode 100644 packages/graph/package.json create mode 100644 packages/graph/src/index.ts create mode 100644 packages/graph/tsconfig.cjs.json create mode 100644 packages/graph/tsconfig.json create mode 100644 packages/tools/fetch-github.ts create mode 100644 packages/tools/fetch-youtube.ts create mode 100644 packages/tools/package.json create mode 100644 packages/tools/process/extract-links.ts create mode 100644 packages/tools/process/parse-transcript.ts create mode 100644 packages/tools/scrape-website.ts create mode 100644 packages/tools/tmp.json create mode 100644 packages/tools/transform-query.ts create mode 100644 packages/tools/tsconfig.cjs.json create mode 100644 packages/tools/tsconfig.json diff --git a/ava.config.json b/ava.config.json index 5d79fb82..3b6f7432 100644 --- a/ava.config.json +++ b/ava.config.json @@ -1,28 +1,56 @@ { "modelConfig": { - "anthropic": [ - "claude-3-5-sonnet-20240620", - "claude-3-haiku-20240307", - "claude-3-opus-20240229", - "claude-3-sonnet-20240229" - ], - "google": ["gemini-1.0-pro", "gemini-1.5-flash", "gemini-1.5-pro"], - "groq": [ - "gemma-7b-it", - "gemma2-9b-it", - "llama-3.1-8b-instant", - "llama-3.1-70b-versatile", - "mixtral-8x7b-32768" - ], - "local": ["hermes-2-pro-llama-3-8b"], - "ollama": ["llama3.1"], - "openAI": [ - "gpt-3.5-turbo", - "gpt-4", - "gpt-4-0125-preview", - "gpt-4-turbo", - "gpt-4o", - "gpt-4o-mini" - ] + "anthropic": { + "defaultModel": "claude-3-5-sonnet-20240620", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "claude-3-5-sonnet-20240620", + "claude-3-haiku-20240307", + "claude-3-opus-20240229", + "claude-3-sonnet-20240229" + ] + }, + "google": { + "defaultModel": "gemini-1.5-pro", + "temperature": 0.5, + "maxTokens": 8192, + "models": ["gemini-1.0-pro", "gemini-1.5-flash", "gemini-1.5-pro"] + }, + "openAI": { + "defaultModel": "gpt-4o", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "gpt-3.5-turbo", + "gpt-4", + "gpt-4-0125-preview", + "gpt-4-turbo", + "gpt-4o", + "gpt-4o-mini" + ] + }, + "groq": { + "defaultModel": "llama-3.1-8b-instant", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "llama-3.1-8b-instant", + "llama-3.1-70b-versatile", + "mixtral-8x7b-32768" + ] + }, + "ollama": { + "defaultModel": "llama3.1", + "temperature": 0.5, + "maxTokens": 8192, + "models": ["llama3.1"] + }, + "local": { + "defaultModel": "hermes-2-pro-llama-3-8b", + "temperature": 0.5, + "maxTokens": 8192, + "models": ["hermes-2-pro-llama-3-8b"] + } } } diff --git a/packages/cli/src/utils/get-model-config.ts b/packages/cli/src/utils/get-model-config.ts index 31655e5c..74a43ed9 100644 --- a/packages/cli/src/utils/get-model-config.ts +++ b/packages/cli/src/utils/get-model-config.ts @@ -15,15 +15,20 @@ export function getModelConfig() { const configFile = fs.readFileSync(configPath, "utf8"); const modelConfig = JSON.parse(configFile).modelConfig; - // Filter out empty arrays from the modelConfig const filteredModelConfig = Object.entries(modelConfig).reduce< - Record - >((acc, [key, value]) => { - if (!Array.isArray(value) || value.length > 0) { - acc[key] = value; + Record + >((acc, [provider, config]) => { + if ( + typeof config === "object" && + config !== null && + "models" in config && + Array.isArray(config.models) + ) { + acc[provider] = config.models; } return acc; }, {}); + modelConfigCache[configPath] = filteredModelConfig; return filteredModelConfig; } diff --git a/packages/graph/package.json b/packages/graph/package.json new file mode 100644 index 00000000..8c43bf79 --- /dev/null +++ b/packages/graph/package.json @@ -0,0 +1,29 @@ +{ + "name": "@ai-citizens/graph", + "version": "0.0.3", + "description": "", + "type": "module", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" + } + }, + "scripts": { + "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": {}, + "peerDependencies": { + "dotenv": "^16.4.5" + }, + "devDependencies": { + "@types/node": "^18" + } +} diff --git a/packages/graph/src/index.ts b/packages/graph/src/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/graph/tsconfig.cjs.json b/packages/graph/tsconfig.cjs.json new file mode 100644 index 00000000..56a21284 --- /dev/null +++ b/packages/graph/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "./dist/cjs", + "moduleResolution": "Node" + } +} diff --git a/packages/graph/tsconfig.json b/packages/graph/tsconfig.json new file mode 100644 index 00000000..73a12443 --- /dev/null +++ b/packages/graph/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "incremental": true, + "target": "ESNext", + "module": "ESNext", + "declaration": true, + "esModuleInterop": true, + "outDir": "./dist/esm", + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "allowJs": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"] +} diff --git a/packages/tools/fetch-github.ts b/packages/tools/fetch-github.ts new file mode 100644 index 00000000..3c21e184 --- /dev/null +++ b/packages/tools/fetch-github.ts @@ -0,0 +1,19 @@ +import {GithubRepoLoader} from '@langchain/community/document_loaders/web/github' +import {Document} from '@langchain/core/documents' + +export const run = async (dir: string, ignorePaths: string[] = []): Promise => { + const loader = new GithubRepoLoader(dir, { + branch: 'main', + ignorePaths, + maxConcurrency: 3, + recursive: false, + unknown: 'warn', + }) + + const docs = [] + for await (const doc of loader.loadAsStream()) { + docs.push(doc) + } + + return docs +} diff --git a/packages/tools/fetch-youtube.ts b/packages/tools/fetch-youtube.ts new file mode 100644 index 00000000..babebf61 --- /dev/null +++ b/packages/tools/fetch-youtube.ts @@ -0,0 +1,14 @@ +import { YoutubeLoader } from "@langchain/community/document_loaders/web/youtube"; +import { Document } from "@langchain/core/documents"; + +export const run = async ( + url: string +): Promise>[]> => { + const loader = YoutubeLoader.createFromUrl(url, { + addVideoInfo: true, + language: "en", + }); + + const docs = await loader.load(); + return docs; +}; diff --git a/packages/tools/package.json b/packages/tools/package.json new file mode 100644 index 00000000..74d3fc49 --- /dev/null +++ b/packages/tools/package.json @@ -0,0 +1,30 @@ +{ + "name": "@ai-citizens/graph", + "version": "0.0.3", + "description": "", + "type": "module", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" + } + }, + "scripts": { + "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": {}, + "peerDependencies": { + "dotenv": "^16.4.5", + "@langchain/community": "^0.2.22" + }, + "devDependencies": { + "@types/node": "^18" + } +} diff --git a/packages/tools/process/extract-links.ts b/packages/tools/process/extract-links.ts new file mode 100644 index 00000000..298126df --- /dev/null +++ b/packages/tools/process/extract-links.ts @@ -0,0 +1,14 @@ +import {StringOutputParser} from '@langchain/core/output_parsers' + +import modelManager from '../model-manager.js' +import {extractRelevantLinks} from '../prompts/index.js' + +export const run = async (content: string) => { + const llm = modelManager.anthropicModel({ + model: 'claude-3-5-sonnet-20240620', + }) + const prompt = extractRelevantLinks + const chain = prompt.pipe(llm).pipe(new StringOutputParser()) + const response = await chain.invoke({content}) + return response +} diff --git a/packages/tools/process/parse-transcript.ts b/packages/tools/process/parse-transcript.ts new file mode 100644 index 00000000..7ec92d53 --- /dev/null +++ b/packages/tools/process/parse-transcript.ts @@ -0,0 +1,14 @@ +import { StringOutputParser } from "@langchain/core/output_parsers"; + +import modelManager from "../model-manager.js"; +import { analyzeTranscriptTemplate } from "../prompts/analyze-transcript.js"; + +export const run = async (transcript: string) => { + const llm = getModel({ + model: "gpt-4o", + }); + const prompt = analyzeTranscriptTemplate; + const chain = prompt.pipe(llm).pipe(new StringOutputParser()); + const response = await chain.invoke({ transcript }); + return response; +}; diff --git a/packages/tools/scrape-website.ts b/packages/tools/scrape-website.ts new file mode 100644 index 00000000..d629ca15 --- /dev/null +++ b/packages/tools/scrape-website.ts @@ -0,0 +1,24 @@ +import {ChatOpenAI, OpenAIEmbeddings} from '@langchain/openai' +import {WebBrowser} from 'langchain/tools/webbrowser' + +const model = new ChatOpenAI({temperature: 0}) +const embeddings = new OpenAIEmbeddings() + +export const browser = new WebBrowser({embeddings, model}) + +export async function run(url: string) { + const result = await browser.invoke(url) + + return result + + /* + Joseph Campbell was a mythologist and writer who discussed spirituality, psychological archetypes, cultural myths, and the mythology of self. He sat down with Bill Moyers for a lengthy conversation at George Lucas’s Skywalker Ranch in California, which continued the following year at the American Museum of Natural History in New York. The resulting 24 hours of raw footage were edited down to six one-hour episodes and broadcast on PBS in 1988, shortly after Campbell’s death, in what became one of the most popular in the history of public television. + + Relevant Links: + - [The Holstee Manifesto](http://holstee.com/manifesto-bp) + - [The Silent Music of the Mind: Remembering Oliver Sacks](https://www.themarginalian.org/2015/08/31/remembering-oliver-sacks) + - [Joseph Campbell series](http://billmoyers.com/spotlight/download-joseph-campbell-and-the-power-of-myth-audio/) + - [Bill Moyers](https://www.themarginalian.org/tag/bill-moyers/) + - [books](https://www.themarginalian.org/tag/books/) + */ +} diff --git a/packages/tools/tmp.json b/packages/tools/tmp.json new file mode 100644 index 00000000..e69de29b diff --git a/packages/tools/transform-query.ts b/packages/tools/transform-query.ts new file mode 100644 index 00000000..f6f1a276 --- /dev/null +++ b/packages/tools/transform-query.ts @@ -0,0 +1,38 @@ +import {StringOutputParser} from '@langchain/core/output_parsers' +import {ChatPromptTemplate} from '@langchain/core/prompts' +import {ChatOpenAI} from '@langchain/openai' +/** + * Transform the query to produce a better question. + * + * @param {GraphState} state The current state of the graph. + * @param {RunnableConfig | undefined} config The configuration object for tracing. + * @returns {Promise} The new state object. + */ +export async function transformQuery(state: {question: string}) { + // console.log('---TRANSFORM QUERY---') + // Pull in the prompt + const prompt = ChatPromptTemplate.fromTemplate( + `You are generating a question that is well optimized for semantic search retrieval. + Look at the input and try to reason about the underlying sematic intent / meaning. + Here is the initial question: + \n ------- \n + {question} + \n ------- \n + Formulate an improved question: `, + ) + + // Grader + const model = new ChatOpenAI({ + modelName: 'gpt-4-0125-preview', + streaming: true, + temperature: 0, + }) + + // Prompt + const chain = prompt.pipe(model).pipe(new StringOutputParser()) + const betterQuestion = await chain.invoke({question: state.question}) + + return { + question: betterQuestion, + } +} diff --git a/packages/tools/tsconfig.cjs.json b/packages/tools/tsconfig.cjs.json new file mode 100644 index 00000000..56a21284 --- /dev/null +++ b/packages/tools/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "./dist/cjs", + "moduleResolution": "Node" + } +} diff --git a/packages/tools/tsconfig.json b/packages/tools/tsconfig.json new file mode 100644 index 00000000..73a12443 --- /dev/null +++ b/packages/tools/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "incremental": true, + "target": "ESNext", + "module": "ESNext", + "declaration": true, + "esModuleInterop": true, + "outDir": "./dist/esm", + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "allowJs": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"] +} From 02d3c4377a74c6941b72b5e7efff56b21bb9f7a8 Mon Sep 17 00:00:00 2001 From: Josh Mabry Date: Thu, 1 Aug 2024 22:28:23 -0700 Subject: [PATCH 02/18] update default config and typing --- packages/cli/src/utils/get-model-config.ts | 12 +- packages/llm/src/model-manager.ts | 99 ++- pnpm-lock.yaml | 951 ++++++++++++++++++++- 3 files changed, 991 insertions(+), 71 deletions(-) diff --git a/packages/cli/src/utils/get-model-config.ts b/packages/cli/src/utils/get-model-config.ts index 74a43ed9..535510cf 100644 --- a/packages/cli/src/utils/get-model-config.ts +++ b/packages/cli/src/utils/get-model-config.ts @@ -1,5 +1,6 @@ import fs from "fs"; import path from "path"; +import { modelConfig as defaultModelConfig } from "@ai-citizens/llm"; const configPath = path.join( process.env.AVA_CONFIG_PATH || process.cwd(), @@ -12,9 +13,14 @@ export function getModelConfig() { if (modelConfigCache[configPath]) { return modelConfigCache[configPath]; } - const configFile = fs.readFileSync(configPath, "utf8"); - const modelConfig = JSON.parse(configFile).modelConfig; - + let modelConfig = {}; + try { + const configFile = fs.readFileSync(configPath, "utf8"); + modelConfig = JSON.parse(configFile).modelConfig; + } catch (e) { + modelConfig = defaultModelConfig; + console.log(`Error reading model config: ${e}`); + } const filteredModelConfig = Object.entries(modelConfig).reduce< Record >((acc, [provider, config]) => { diff --git a/packages/llm/src/model-manager.ts b/packages/llm/src/model-manager.ts index bf3954bc..83f67c0b 100644 --- a/packages/llm/src/model-manager.ts +++ b/packages/llm/src/model-manager.ts @@ -4,47 +4,64 @@ import { ChatGroq } from "@langchain/groq"; import { ChatOllama } from "@langchain/ollama"; import { ChatOpenAI } from "@langchain/openai"; -const modelConfig = { - anthropic: [ - "claude-3-5-sonnet-20240620", - "claude-3-haiku-20240307", - "claude-3-opus-20240229", - "claude-3-sonnet-20240229", - ] as const, - google: ["gemini-1.0-pro", "gemini-1.5-flash", "gemini-1.5-pro"] as const, - groq: [ - "gemma-7b-it", - "gemma2-9b-it", - "llama-3.1-8b-instant", - "llama-3.1-70b-versatile", - "mixtral-8x7b-32768", - ] as const, - local: ["hermes-2-pro-llama-3-8b"] as const, - ollama: ["llama3.1"] as const, - openAI: [ - "gpt-3.5-turbo", - "gpt-4", - "gpt-4-0125-preview", - "gpt-4-turbo", - "gpt-4o", - "gpt-4o-mini", - ] as const, +export const modelConfig = { + anthropic: { + models: [ + "claude-3-5-sonnet-20240620", + "claude-3-haiku-20240307", + "claude-3-opus-20240229", + "claude-3-sonnet-20240229", + ] as const, + }, + google: { + models: ["gemini-1.0-pro", "gemini-1.5-flash", "gemini-1.5-pro"] as const, + }, + groq: { + models: [ + "gemma-7b-it", + "gemma2-9b-it", + "llama-3.1-8b-instant", + "llama-3.1-70b-versatile", + "mixtral-8x7b-32768", + ] as const, + }, + local: { + models: ["hermes-2-pro-llama-3-8b"] as const, + }, + ollama: { + models: ["llama3.1"] as const, + }, + openAI: { + models: [ + "gpt-3.5-turbo", + "gpt-4", + "gpt-4-0125-preview", + "gpt-4-turbo", + "gpt-4o", + "gpt-4o-mini", + ] as const, + }, }; -export type AllModels = (typeof modelConfig)[keyof typeof modelConfig][number]; -export const allModels = Object.values(modelConfig).flat(); +export type AllModels = + (typeof modelConfig)[keyof typeof modelConfig]["models"][number]; + +export const allModels = Object.values(modelConfig).flatMap( + (config) => config.models +); + export function isAllModel(model: string): model is AllModels { - return Object.values(modelConfig).some((models) => + return Object.values(modelConfig).some((config) => // @ts-expect-error this could be anything - models.includes(model) + config.models.includes(model) ); } -type OpenAIModel = (typeof modelConfig.openAI)[number]; -type GroqModel = (typeof modelConfig.groq)[number]; -type AnthropicModel = (typeof modelConfig.anthropic)[number]; -type GoogleModel = (typeof modelConfig.google)[number]; -type LocalModel = (typeof modelConfig.local)[number]; -type OllamaModel = (typeof modelConfig.ollama)[number]; +type OpenAIModel = (typeof modelConfig.openAI.models)[number]; +type GroqModel = (typeof modelConfig.groq.models)[number]; +type AnthropicModel = (typeof modelConfig.anthropic.models)[number]; +type GoogleModel = (typeof modelConfig.google.models)[number]; +type LocalModel = (typeof modelConfig.local.models)[number]; +type OllamaModel = (typeof modelConfig.ollama.models)[number]; export type Model = | AnthropicModel | GoogleModel @@ -178,7 +195,7 @@ export const getModel = ({ model: Model; temperature?: number; }) => { - if (modelConfig.openAI.includes(model as OpenAIModel)) { + if (modelConfig["openAI"].models.includes(model as OpenAIModel)) { return openAiModel({ baseUrl, maxTokens, @@ -187,11 +204,11 @@ export const getModel = ({ }); } - if (modelConfig.groq.includes(model as GroqModel)) { + if (modelConfig["groq"].models.includes(model as GroqModel)) { return groqModel({ maxTokens, model: model as GroqModel, temperature }); } - if (modelConfig.anthropic.includes(model as AnthropicModel)) { + if (modelConfig["anthropic"].models.includes(model as AnthropicModel)) { return anthropicModel({ maxTokens, model: model as AnthropicModel, @@ -199,15 +216,15 @@ export const getModel = ({ }); } - if (modelConfig.google.includes(model as GoogleModel)) { + if (modelConfig["google"].models.includes(model as GoogleModel)) { return googleModel({ maxTokens, model: model as GoogleModel, temperature }); } - if (modelConfig.local.includes(model as LocalModel)) { + if (modelConfig["local"].models.includes(model as LocalModel)) { return localModel({ baseURL: baseUrl, maxTokens, model, temperature }); } - if (modelConfig.ollama.includes(model as OllamaModel)) { + if (modelConfig["ollama"].models.includes(model as OllamaModel)) { return ollamaModel({ model: model as OllamaModel, temperature }); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f04e241c..a08eb0c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@langchain/core': specifier: ^0.2.18 - version: 0.2.18(openai@4.53.2) + version: 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -38,22 +38,22 @@ importers: version: link:../utils '@langchain/anthropic': specifier: ^0.2.10 - version: 0.2.10(openai@4.53.2) + version: 0.2.10(langchain@0.2.12)(openai@4.53.2) '@langchain/core': specifier: ^0.2.18 - version: 0.2.18(openai@4.53.2) + version: 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) '@langchain/google-genai': specifier: ^0.0.23 - version: 0.0.23(openai@4.53.2)(zod@3.23.8) + version: 0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8) '@langchain/groq': specifier: ^0.0.15 - version: 0.0.15(openai@4.53.2) + version: 0.0.15(langchain@0.2.12)(openai@4.53.2) '@langchain/ollama': specifier: ^0.0.2 - version: 0.0.2(openai@4.53.2) + version: 0.0.2(langchain@0.2.12)(openai@4.53.2) '@langchain/openai': specifier: ^0.2.5 - version: 0.2.5 + version: 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2)) '@oclif/core': specifier: ^4.0.17 version: 4.0.17 @@ -92,23 +92,56 @@ importers: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.7.3)(@types/node@18.19.42)(typescript@5.5.4) + packages/graph: + dependencies: + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + devDependencies: + '@types/node': + specifier: ^18 + version: 18.19.42 + packages/llm: dependencies: '@langchain/anthropic': specifier: ^0.2.10 - version: 0.2.10(openai@4.53.2) + version: 0.2.10(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) '@langchain/google-genai': specifier: ^0.0.23 - version: 0.0.23(openai@4.53.2)(zod@3.23.8) + version: 0.0.23(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)(zod@3.23.8) '@langchain/groq': specifier: ^0.0.15 - version: 0.0.15(openai@4.53.2) + version: 0.0.15(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) '@langchain/ollama': specifier: ^0.0.2 - version: 0.0.2(openai@4.53.2) + version: 0.0.2(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) '@langchain/openai': specifier: ^0.2.5 - version: 0.2.5 + version: 0.2.5(langchain@0.2.12(openai@4.53.2)) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + devDependencies: + '@types/node': + specifier: ^18 + version: 18.19.42 + + packages/prompts: + dependencies: + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + devDependencies: + '@types/node': + specifier: ^18 + version: 18.19.42 + + packages/tools: + dependencies: + '@langchain/community': + specifier: ^0.2.22 + version: 0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -437,6 +470,375 @@ packages: resolution: {integrity: sha512-Tb0k8/oUitFzupSxPAmKNnKr28IxZYrF0K7vZUcHLlRA2tljBbUiU9hFnuSiN0VBTttrrFkNQ1VsltBbOL79eQ==} engines: {node: '>=18'} + '@langchain/community@0.2.22': + resolution: {integrity: sha512-KxT6Pj0ovJkSgiVHKorIeH0Bi7QDwMiuCD8apLNKkgHz9NC8ZxzKt5LqpVApNbnPWkCwm9EZ3oBfYGaz+D3jMg==} + engines: {node: '>=18'} + peerDependencies: + '@aws-crypto/sha256-js': ^5.0.0 + '@aws-sdk/client-bedrock-agent-runtime': ^3.583.0 + '@aws-sdk/client-bedrock-runtime': ^3.422.0 + '@aws-sdk/client-dynamodb': ^3.310.0 + '@aws-sdk/client-kendra': ^3.352.0 + '@aws-sdk/client-lambda': ^3.310.0 + '@aws-sdk/client-s3': ^3.310.0 + '@aws-sdk/client-sagemaker-runtime': ^3.310.0 + '@aws-sdk/client-sfn': ^3.310.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@azure/search-documents': ^12.0.0 + '@azure/storage-blob': ^12.15.0 + '@browserbasehq/sdk': '*' + '@clickhouse/client': ^0.2.5 + '@cloudflare/ai': '*' + '@datastax/astra-db-ts': ^1.0.0 + '@elastic/elasticsearch': ^8.4.0 + '@getmetal/metal-sdk': '*' + '@getzep/zep-cloud': ^1.0.6 + '@getzep/zep-js': ^0.9.0 + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@google-ai/generativelanguage': '*' + '@google-cloud/storage': ^6.10.1 || ^7.7.0 + '@gradientai/nodejs-sdk': ^1.2.0 + '@huggingface/inference': ^2.6.4 + '@langchain/langgraph': ~0.0.26 + '@layerup/layerup-security': ^1.5.12 + '@mendable/firecrawl-js': ^0.0.13 + '@mlc-ai/web-llm': 0.2.46 + '@mozilla/readability': '*' + '@neondatabase/serverless': '*' + '@notionhq/client': ^2.2.10 + '@opensearch-project/opensearch': '*' + '@pinecone-database/pinecone': '*' + '@planetscale/database': ^1.8.0 + '@premai/prem-sdk': ^0.3.25 + '@qdrant/js-client-rest': ^1.8.2 + '@raycast/api': ^1.55.2 + '@rockset/client': ^0.9.1 + '@smithy/eventstream-codec': ^2.0.5 + '@smithy/protocol-http': ^3.0.6 + '@smithy/signature-v4': ^2.0.10 + '@smithy/util-utf8': ^2.0.0 + '@spider-cloud/spider-client': ^0.0.21 + '@supabase/postgrest-js': ^1.1.1 + '@supabase/supabase-js': ^2.10.0 + '@tensorflow-models/universal-sentence-encoder': '*' + '@tensorflow/tfjs-converter': '*' + '@tensorflow/tfjs-core': '*' + '@upstash/ratelimit': ^1.1.3 + '@upstash/redis': ^1.20.6 + '@upstash/vector': ^1.1.1 + '@vercel/kv': ^0.2.3 + '@vercel/postgres': ^0.5.0 + '@writerai/writer-sdk': ^0.40.2 + '@xata.io/client': ^0.28.0 + '@xenova/transformers': ^2.17.2 + '@zilliz/milvus2-sdk-node': '>=2.3.5' + apify-client: ^2.7.1 + assemblyai: ^4.6.0 + better-sqlite3: '>=9.4.0 <12.0.0' + cassandra-driver: ^4.7.2 + cborg: ^4.1.1 + cheerio: ^1.0.0-rc.12 + chromadb: '*' + closevector-common: 0.1.3 + closevector-node: 0.1.6 + closevector-web: 0.1.6 + cohere-ai: '*' + convex: ^1.3.1 + couchbase: ^4.3.0 + crypto-js: ^4.2.0 + d3-dsv: ^2.0.0 + discord.js: ^14.14.1 + dria: ^0.0.3 + duck-duck-scrape: ^2.2.5 + epub2: ^3.0.1 + faiss-node: ^0.5.1 + firebase-admin: ^11.9.0 || ^12.0.0 + google-auth-library: '*' + googleapis: ^126.0.1 + hnswlib-node: ^3.0.0 + html-to-text: ^9.0.5 + ignore: ^5.2.0 + interface-datastore: ^8.2.11 + ioredis: ^5.3.2 + it-all: ^3.0.4 + jsdom: '*' + jsonwebtoken: ^9.0.2 + llmonitor: ^0.5.9 + lodash: ^4.17.21 + lunary: ^0.6.11 + mammoth: ^1.6.0 + mongodb: '>=5.2.0' + mysql2: ^3.3.3 + neo4j-driver: '*' + node-llama-cpp: '*' + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + pdf-parse: 1.1.1 + pg: ^8.11.0 + pg-copy-streams: ^6.0.5 + pickleparser: ^0.2.1 + playwright: ^1.32.1 + portkey-ai: ^0.1.11 + puppeteer: '*' + redis: '*' + replicate: ^0.29.4 + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.20 + typesense: ^1.5.3 + usearch: ^1.1.1 + vectordb: ^0.1.4 + voy-search: 0.6.2 + weaviate-ts-client: '*' + web-auth-library: ^1.0.3 + ws: ^8.14.2 + youtube-transcript: ^1.0.6 + youtubei.js: ^9.1.0 + peerDependenciesMeta: + '@aws-crypto/sha256-js': + optional: true + '@aws-sdk/client-bedrock-agent-runtime': + optional: true + '@aws-sdk/client-bedrock-runtime': + optional: true + '@aws-sdk/client-dynamodb': + optional: true + '@aws-sdk/client-kendra': + optional: true + '@aws-sdk/client-lambda': + optional: true + '@aws-sdk/client-s3': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@azure/search-documents': + optional: true + '@azure/storage-blob': + optional: true + '@browserbasehq/sdk': + optional: true + '@clickhouse/client': + optional: true + '@cloudflare/ai': + optional: true + '@datastax/astra-db-ts': + optional: true + '@elastic/elasticsearch': + optional: true + '@getmetal/metal-sdk': + optional: true + '@getzep/zep-cloud': + optional: true + '@getzep/zep-js': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@google-ai/generativelanguage': + optional: true + '@google-cloud/storage': + optional: true + '@gradientai/nodejs-sdk': + optional: true + '@huggingface/inference': + optional: true + '@langchain/langgraph': + optional: true + '@layerup/layerup-security': + optional: true + '@mendable/firecrawl-js': + optional: true + '@mlc-ai/web-llm': + optional: true + '@mozilla/readability': + optional: true + '@neondatabase/serverless': + optional: true + '@notionhq/client': + optional: true + '@opensearch-project/opensearch': + optional: true + '@pinecone-database/pinecone': + optional: true + '@planetscale/database': + optional: true + '@premai/prem-sdk': + optional: true + '@qdrant/js-client-rest': + optional: true + '@raycast/api': + optional: true + '@rockset/client': + optional: true + '@smithy/eventstream-codec': + optional: true + '@smithy/protocol-http': + optional: true + '@smithy/signature-v4': + optional: true + '@smithy/util-utf8': + optional: true + '@spider-cloud/spider-client': + optional: true + '@supabase/postgrest-js': + optional: true + '@supabase/supabase-js': + optional: true + '@tensorflow-models/universal-sentence-encoder': + optional: true + '@tensorflow/tfjs-converter': + optional: true + '@tensorflow/tfjs-core': + optional: true + '@upstash/ratelimit': + optional: true + '@upstash/redis': + optional: true + '@upstash/vector': + optional: true + '@vercel/kv': + optional: true + '@vercel/postgres': + optional: true + '@writerai/writer-sdk': + optional: true + '@xata.io/client': + optional: true + '@xenova/transformers': + optional: true + '@zilliz/milvus2-sdk-node': + optional: true + apify-client: + optional: true + assemblyai: + optional: true + better-sqlite3: + optional: true + cassandra-driver: + optional: true + cborg: + optional: true + cheerio: + optional: true + chromadb: + optional: true + closevector-common: + optional: true + closevector-node: + optional: true + closevector-web: + optional: true + cohere-ai: + optional: true + convex: + optional: true + couchbase: + optional: true + crypto-js: + optional: true + d3-dsv: + optional: true + discord.js: + optional: true + dria: + optional: true + duck-duck-scrape: + optional: true + epub2: + optional: true + faiss-node: + optional: true + firebase-admin: + optional: true + google-auth-library: + optional: true + googleapis: + optional: true + hnswlib-node: + optional: true + html-to-text: + optional: true + ignore: + optional: true + interface-datastore: + optional: true + ioredis: + optional: true + it-all: + optional: true + jsdom: + optional: true + jsonwebtoken: + optional: true + llmonitor: + optional: true + lodash: + optional: true + lunary: + optional: true + mammoth: + optional: true + mongodb: + optional: true + mysql2: + optional: true + neo4j-driver: + optional: true + node-llama-cpp: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + pg: + optional: true + pg-copy-streams: + optional: true + pickleparser: + optional: true + playwright: + optional: true + portkey-ai: + optional: true + puppeteer: + optional: true + redis: + optional: true + replicate: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + typesense: + optional: true + usearch: + optional: true + vectordb: + optional: true + voy-search: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + ws: + optional: true + youtube-transcript: + optional: true + youtubei.js: + optional: true + '@langchain/core@0.2.18': resolution: {integrity: sha512-ru542BwNcsnDfjTeDbIkFIchwa54ctHZR+kVrC8U9NPS9/36iM8p8ruprOV7Zccj/oxtLE5UpEhV+9MZhVcFlA==} engines: {node: '>=18'} @@ -457,6 +859,10 @@ packages: resolution: {integrity: sha512-gQXS5VBFyAco0jgSnUVan6fYVSIxlffmDaeDGpXrAmz2nQPgiN/h24KYOt2NOZ1zRheRzRuO/CfRagMhyVUaFA==} engines: {node: '>=18'} + '@langchain/textsplitters@0.0.3': + resolution: {integrity: sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==} + engines: {node: '>=18'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -913,6 +1319,10 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + binary-search@1.3.6: resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} @@ -1187,6 +1597,9 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + expr-eval@2.0.2: + resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -1247,6 +1660,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -1557,9 +1974,199 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + langchain@0.2.12: + resolution: {integrity: sha512-ZHtJrHUpridZ7IQu7N/wAQ6iMAAO7VLzkupHqKP79S6p+alrPbn1BjRnh+PeGm92YiY5DafTCuvchmujxx7bCQ==} + engines: {node: '>=18'} + peerDependencies: + '@aws-sdk/client-s3': '*' + '@aws-sdk/client-sagemaker-runtime': '*' + '@aws-sdk/client-sfn': '*' + '@aws-sdk/credential-provider-node': '*' + '@azure/storage-blob': '*' + '@browserbasehq/sdk': '*' + '@gomomento/sdk': '*' + '@gomomento/sdk-core': '*' + '@gomomento/sdk-web': ^1.51.1 + '@langchain/anthropic': '*' + '@langchain/aws': '*' + '@langchain/cohere': '*' + '@langchain/community': '*' + '@langchain/google-genai': '*' + '@langchain/google-vertexai': '*' + '@langchain/groq': '*' + '@langchain/mistralai': '*' + '@langchain/ollama': '*' + '@mendable/firecrawl-js': '*' + '@notionhq/client': '*' + '@pinecone-database/pinecone': '*' + '@supabase/supabase-js': '*' + '@vercel/kv': '*' + '@xata.io/client': '*' + apify-client: '*' + assemblyai: '*' + axios: '*' + cheerio: '*' + chromadb: '*' + convex: '*' + couchbase: '*' + d3-dsv: '*' + epub2: '*' + faiss-node: '*' + fast-xml-parser: '*' + handlebars: ^4.7.8 + html-to-text: '*' + ignore: '*' + ioredis: '*' + jsdom: '*' + mammoth: '*' + mongodb: '*' + node-llama-cpp: '*' + notion-to-md: '*' + officeparser: '*' + pdf-parse: '*' + peggy: ^3.0.2 + playwright: '*' + puppeteer: '*' + pyodide: ^0.24.1 + redis: '*' + sonix-speech-recognition: '*' + srt-parser-2: '*' + typeorm: '*' + weaviate-ts-client: '*' + web-auth-library: '*' + ws: '*' + youtube-transcript: '*' + youtubei.js: '*' + peerDependenciesMeta: + '@aws-sdk/client-s3': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@azure/storage-blob': + optional: true + '@browserbasehq/sdk': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@gomomento/sdk-web': + optional: true + '@langchain/anthropic': + optional: true + '@langchain/aws': + optional: true + '@langchain/cohere': + optional: true + '@langchain/community': + optional: true + '@langchain/google-genai': + optional: true + '@langchain/google-vertexai': + optional: true + '@langchain/groq': + optional: true + '@langchain/mistralai': + optional: true + '@langchain/ollama': + optional: true + '@mendable/firecrawl-js': + optional: true + '@notionhq/client': + optional: true + '@pinecone-database/pinecone': + optional: true + '@supabase/supabase-js': + optional: true + '@vercel/kv': + optional: true + '@xata.io/client': + optional: true + apify-client: + optional: true + assemblyai: + optional: true + axios: + optional: true + cheerio: + optional: true + chromadb: + optional: true + convex: + optional: true + couchbase: + optional: true + d3-dsv: + optional: true + epub2: + optional: true + faiss-node: + optional: true + fast-xml-parser: + optional: true + handlebars: + optional: true + html-to-text: + optional: true + ignore: + optional: true + ioredis: + optional: true + jsdom: + optional: true + mammoth: + optional: true + mongodb: + optional: true + node-llama-cpp: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + peggy: + optional: true + playwright: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + ws: + optional: true + youtube-transcript: + optional: true + youtubei.js: + optional: true + + langchainhub@0.0.11: + resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} + langsmith@0.1.39: resolution: {integrity: sha512-K2/qbc96JhrZbSL74RbZ0DBOpTB9Mxicu8RQrZ88Xsp1bH2O3+y5EdcvC0g/1YzQWQhcQ4peknCA24c3VTNiNA==} peerDependencies: @@ -1859,6 +2466,9 @@ packages: resolution: {integrity: sha512-ohYEv6OV3jsFGqNrgolDDWN6Ssx1nFg6JDJQuaBFo4SL2i+MBoOQ16n2Pq1iBF5lH1PKnfCIOfqAGkmzPvdB9g==} hasBin: true + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2446,6 +3056,11 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + yarn@1.22.22: resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==} engines: {node: '>=4.0.0'} @@ -2781,10 +3396,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@langchain/anthropic@0.2.10(openai@4.53.2)': + '@langchain/anthropic@0.2.10(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': dependencies: '@anthropic-ai/sdk': 0.22.0 - '@langchain/core': 0.2.18(openai@4.53.2) + '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) fast-xml-parser: 4.4.1 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -2793,13 +3408,59 @@ snapshots: - langchain - openai - '@langchain/core@0.2.18(openai@4.53.2)': + '@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2)': + dependencies: + '@anthropic-ai/sdk': 0.22.0 + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + fast-xml-parser: 4.4.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - encoding + - langchain + - openai + + '@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2)': + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2)) + binary-extensions: 2.3.0 + expr-eval: 2.0.2 + flat: 5.0.2 + js-yaml: 4.1.0 + langchain: 0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2) + langsmith: 0.1.39(mbttg6lyqqe6inzhgs3ca7uscq) + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + optionalDependencies: + ignore: 5.3.1 + lodash: 4.17.21 + transitivePeerDependencies: + - '@gomomento/sdk-web' + - '@langchain/anthropic' + - '@langchain/aws' + - '@langchain/cohere' + - '@langchain/google-genai' + - '@langchain/google-vertexai' + - '@langchain/groq' + - '@langchain/mistralai' + - '@langchain/ollama' + - axios + - encoding + - fast-xml-parser + - handlebars + - openai + - peggy + - pyodide + + '@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2)': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.39(@langchain/core@0.2.18(openai@4.53.2))(openai@4.53.2) + langsmith: 0.1.39(mbttg6lyqqe6inzhgs3ca7uscq) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -2811,20 +3472,78 @@ snapshots: - langchain - openai - '@langchain/google-genai@0.0.23(openai@4.53.2)(zod@3.23.8)': + '@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2)': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.12 + langsmith: 0.1.39(@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - langchain + - openai + + '@langchain/core@0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.12 + langsmith: 0.1.39(@langchain/core@0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - langchain + - openai + + '@langchain/google-genai@0.0.23(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)(zod@3.23.8)': + dependencies: + '@google/generative-ai': 0.7.1 + '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - langchain + - openai + - zod + + '@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8)': dependencies: '@google/generative-ai': 0.7.1 - '@langchain/core': 0.2.18(openai@4.53.2) + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - langchain - openai - zod - '@langchain/groq@0.0.15(openai@4.53.2)': + '@langchain/groq@0.0.15(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + '@langchain/openai': 0.2.5(langchain@0.2.12(openai@4.53.2)) + groq-sdk: 0.3.3 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - encoding + - langchain + - openai + + '@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2)': dependencies: - '@langchain/core': 0.2.18(openai@4.53.2) - '@langchain/openai': 0.2.5 + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2)) groq-sdk: 0.3.3 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -2833,18 +3552,27 @@ snapshots: - langchain - openai - '@langchain/ollama@0.0.2(openai@4.53.2)': + '@langchain/ollama@0.0.2(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': dependencies: - '@langchain/core': 0.2.18(openai@4.53.2) + '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) ollama: 0.5.6 uuid: 10.0.0 transitivePeerDependencies: - langchain - openai - '@langchain/openai@0.2.5': + '@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2)': dependencies: - '@langchain/core': 0.2.18(openai@4.53.2) + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + ollama: 0.5.6 + uuid: 10.0.0 + transitivePeerDependencies: + - langchain + - openai + + '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))': + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) js-tiktoken: 1.0.12 openai: 4.53.2 zod: 3.23.8 @@ -2853,6 +3581,54 @@ snapshots: - encoding - langchain + '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))': + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + js-tiktoken: 1.0.12 + openai: 4.53.2 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - encoding + - langchain + + '@langchain/openai@0.2.5(langchain@0.2.12(openai@4.53.2))': + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + js-tiktoken: 1.0.12 + openai: 4.53.2 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - encoding + - langchain + + '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2)': + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) + js-tiktoken: 1.0.12 + transitivePeerDependencies: + - langchain + - openai + + '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2)': + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + js-tiktoken: 1.0.12 + transitivePeerDependencies: + - langchain + - openai + optional: true + + '@langchain/textsplitters@0.0.3(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + js-tiktoken: 1.0.12 + transitivePeerDependencies: + - langchain + - openai + optional: true + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.25.0 @@ -3382,6 +4158,8 @@ snapshots: dependencies: is-windows: 1.0.2 + binary-extensions@2.3.0: {} + binary-search@1.3.6: {} bl@4.1.0: @@ -3727,6 +4505,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + expr-eval@2.0.2: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -3796,6 +4576,8 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat@5.0.2: {} + flatted@3.3.1: {} form-data-encoder@1.7.2: {} @@ -4091,11 +4873,109 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonpointer@5.0.1: {} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - langsmith@0.1.39(@langchain/core@0.2.18(openai@4.53.2))(openai@4.53.2): + langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2): + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2)) + '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) + binary-extensions: 2.3.0 + js-tiktoken: 1.0.12 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langchainhub: 0.0.11 + langsmith: 0.1.39(mbttg6lyqqe6inzhgs3ca7uscq) + ml-distance: 4.0.1 + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.5.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + optionalDependencies: + '@langchain/anthropic': 0.2.10(langchain@0.2.12)(openai@4.53.2) + '@langchain/community': 0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2) + '@langchain/google-genai': 0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8) + '@langchain/groq': 0.0.15(langchain@0.2.12)(openai@4.53.2) + '@langchain/ollama': 0.0.2(langchain@0.2.12)(openai@4.53.2) + fast-xml-parser: 4.4.1 + ignore: 5.3.1 + transitivePeerDependencies: + - encoding + - openai + + langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2): + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2)) + '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + binary-extensions: 2.3.0 + js-tiktoken: 1.0.12 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langchainhub: 0.0.11 + langsmith: 0.1.39(@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + ml-distance: 4.0.1 + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.5.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + optionalDependencies: + '@langchain/anthropic': 0.2.10(langchain@0.2.12)(openai@4.53.2) + '@langchain/google-genai': 0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8) + '@langchain/groq': 0.0.15(langchain@0.2.12)(openai@4.53.2) + '@langchain/ollama': 0.0.2(langchain@0.2.12)(openai@4.53.2) + fast-xml-parser: 4.4.1 + transitivePeerDependencies: + - encoding + - openai + optional: true + + langchain@0.2.12(openai@4.53.2): + dependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + '@langchain/openai': 0.2.5(langchain@0.2.12(openai@4.53.2)) + '@langchain/textsplitters': 0.0.3(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + binary-extensions: 2.3.0 + js-tiktoken: 1.0.12 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langchainhub: 0.0.11 + langsmith: 0.1.39(@langchain/core@0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + ml-distance: 4.0.1 + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.5.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - encoding + - openai + optional: true + + langchainhub@0.0.11: {} + + langsmith@0.1.39(@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2): + dependencies: + '@types/uuid': 9.0.8 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + langchain: 0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2) + openai: 4.53.2 + + langsmith@0.1.39(@langchain/core@0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(openai@4.53.2))(openai@4.53.2): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -4103,7 +4983,20 @@ snapshots: p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.18(openai@4.53.2) + '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + langchain: 0.2.12(openai@4.53.2) + openai: 4.53.2 + + langsmith@0.1.39(mbttg6lyqqe6inzhgs3ca7uscq): + dependencies: + '@types/uuid': 9.0.8 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) + langchain: 0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2) openai: 4.53.2 levn@0.4.1: @@ -4311,6 +5204,8 @@ snapshots: transitivePeerDependencies: - encoding + openapi-types@12.1.3: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4868,6 +5763,8 @@ snapshots: yallist@4.0.0: {} + yaml@2.5.0: {} + yarn@1.22.22: {} yn@3.1.1: {} From c21e21f201d995b37c31f13dc1885aa1821793c0 Mon Sep 17 00:00:00 2001 From: Josh Mabry Date: Thu, 1 Aug 2024 22:29:08 -0700 Subject: [PATCH 03/18] add prompts pkg --- packages/prompts/package.json | 29 +++++++ packages/prompts/src/system/index.ts | 0 .../src/templates/analyze-transcript.ts | 35 +++++++++ .../prompts/src/templates/chain-of-density.ts | 78 +++++++++++++++++++ .../src/templates/distill-knowledge.ts | 42 ++++++++++ .../src/templates/extract-relevant-links.ts | 57 ++++++++++++++ .../prompts/src/templates/generate-prompt.ts | 43 ++++++++++ .../src/templates/generate-search-terms.ts | 60 ++++++++++++++ packages/prompts/src/templates/index.ts | 9 +++ .../prompts/src/templates/prompt-tagging.ts | 52 +++++++++++++ .../src/templates/stable-diffusion-prompt.ts | 38 +++++++++ .../prompts/src/templates/tree-of-thought.ts | 34 ++++++++ packages/prompts/tsconfig.cjs.json | 8 ++ packages/prompts/tsconfig.json | 21 +++++ 14 files changed, 506 insertions(+) create mode 100644 packages/prompts/package.json create mode 100644 packages/prompts/src/system/index.ts create mode 100644 packages/prompts/src/templates/analyze-transcript.ts create mode 100644 packages/prompts/src/templates/chain-of-density.ts create mode 100644 packages/prompts/src/templates/distill-knowledge.ts create mode 100644 packages/prompts/src/templates/extract-relevant-links.ts create mode 100644 packages/prompts/src/templates/generate-prompt.ts create mode 100644 packages/prompts/src/templates/generate-search-terms.ts create mode 100644 packages/prompts/src/templates/index.ts create mode 100644 packages/prompts/src/templates/prompt-tagging.ts create mode 100644 packages/prompts/src/templates/stable-diffusion-prompt.ts create mode 100644 packages/prompts/src/templates/tree-of-thought.ts create mode 100644 packages/prompts/tsconfig.cjs.json create mode 100644 packages/prompts/tsconfig.json diff --git a/packages/prompts/package.json b/packages/prompts/package.json new file mode 100644 index 00000000..626f62f9 --- /dev/null +++ b/packages/prompts/package.json @@ -0,0 +1,29 @@ +{ + "name": "@ai-citizens/prompts", + "version": "0.0.3", + "description": "", + "type": "module", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" + } + }, + "scripts": { + "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": {}, + "peerDependencies": { + "dotenv": "^16.4.5" + }, + "devDependencies": { + "@types/node": "^18" + } +} diff --git a/packages/prompts/src/system/index.ts b/packages/prompts/src/system/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/prompts/src/templates/analyze-transcript.ts b/packages/prompts/src/templates/analyze-transcript.ts new file mode 100644 index 00000000..adbf9e81 --- /dev/null +++ b/packages/prompts/src/templates/analyze-transcript.ts @@ -0,0 +1,35 @@ +import { ChatPromptTemplate } from "@langchain/core/prompts"; + +/** Takes a given transcript and provides a summary, key insights and well as areas of possible contention + * @params transcript + */ +export const analyzeTranscriptTemplate = ChatPromptTemplate.fromTemplate( + `You will be given a transcript. Your task is to summarize the content, offer key insights, and identify any points of contention or unclear information. Follow these steps: + + 1. Read the following video transcript carefully: + + {transcript} + + 2. Summarize the main points of the video content in a concise manner. Focus on the key topics discussed and the overall message of the video. + 3. Identify and explain the key insights presented in the video. These should be the most important or novel ideas that viewers can take away from the content. + 4. Analyze the transcript for any points of contention or areas where the information presented is unclear or potentially controversial. This could include conflicting statements, ambiguous explanations, or topics that may require further clarification. + 5. Present your analysis in the following format: + + Provide a concise summary of the video content here, capturing the main points and overall message. + + + List and briefly explain the key insights from the video. Use bullet points for clarity. + • Key insight 1 + • Key insight 2 + • Key insight 3 (add more if necessary) + + + Identify and explain any points of contention, unclear information, or potentially controversial topics discussed in the video. Use bullet points for clarity. + • Contention/unclear point 1 + • Contention/unclear point 2 + • Contention/unclear point 3 (add more if necessary) + + Leave empty if no points of contention or the content is clear + + Remember to base your analysis solely on the information provided in the transcript. Do not include any external information or personal opinions. If there are no clear points of contention or unclear information, state that in the appropriate section.` +); diff --git a/packages/prompts/src/templates/chain-of-density.ts b/packages/prompts/src/templates/chain-of-density.ts new file mode 100644 index 00000000..b616d347 --- /dev/null +++ b/packages/prompts/src/templates/chain-of-density.ts @@ -0,0 +1,78 @@ +import {ChatPromptTemplate} from '@langchain/core/prompts' + +/** + * Creates a series of increasingly concise entity-dense summaries of a given article + * + * @params article + */ +export const chainOfDensity = + ChatPromptTemplate.fromTemplate(`You will be given an article and asked to generate increasingly concise entity-dense summaries of it. Here is the article: + +
+{article} +
+ +Your task is to create 5 increasingly concise and entity-dense summaries of the above article. You will do this by repeating the following two-step process 5 times: + +Step 1: Identify 1-3 informative entities from the article which are missing from the previously generated summary. Enclose these entities in [square brackets]. + +Step 2: Write a new, denser summary of identical length to the previous summary. This new summary should cover every entity and detail from the previous summary plus the newly identified missing entities. + +A missing entity is defined as: +- Relevant: to the main stories in the article +- Specific: descriptive yet concise (5 words or fewer) +- Novel: not present in the previous summary +- Faithful: actually present in the article +- Anywhere: can be located anywhere in the article + +Follow these guidelines when creating your summaries: +1. The first summary should be long (4-5 sentences, approximately 80 words), yet highly non-specific, containing little information beyond the entities marked as missing. Use overly verbose language and fillers (e.g., "this article discusses") to reach about 80 words. +2. Make every word count. Rewrite the previous summary to improve flow and make space for additional entities. +3. Create space by using fusion, compression, and removal of uninformative phrases like "the article discusses". +4. The summaries should become highly dense and concise, yet self-contained (easily understood without the article). +5. Missing entities can appear anywhere in the new summary. +6. Never drop entities from the previous summary. If space cannot be made, add fewer new entities. +7. Use the exact same number of words for each summary. + +Present your output in the following format: + + + + Entity 1 + Entity 2 + Entity 3 + + Your summary here + + + + Entity 4 + Entity 5 + + Your summary here + + + + Entity 6 + Entity 7 + Entity 8 + + Your summary here + + + + Entity 9 + Entity 10 + + Your summary here + + + + Entity 11 + Entity 12 + Entity 13 + + Your summary here + + +Begin the task now.`) diff --git a/packages/prompts/src/templates/distill-knowledge.ts b/packages/prompts/src/templates/distill-knowledge.ts new file mode 100644 index 00000000..9ec7f9f4 --- /dev/null +++ b/packages/prompts/src/templates/distill-knowledge.ts @@ -0,0 +1,42 @@ +import {ChatPromptTemplate} from '@langchain/core/prompts' + +/** + * Distills key knowledge from a given context + * @params context + */ +export const distillKnowledge = + ChatPromptTemplate.fromTemplate(`You are tasked with distilling key knowledge from a given context. Your goal is to extract and summarize the most important information in a clear, concise format that would be easy for a language model to understand and learn from. + +Here is the context to analyze: + + +{context} + + +Please read the context carefully to fully understand the key information and knowledge it contains. It is important to retain key technical details as you will be summarizing frameworks and concepts from the context. + +First, use a section to think through how to distill and summarize the most important knowledge from the context. Consider the following: + +1. What are the main ideas, concepts, or frameworks presented? +2. What key facts or details are crucial to understanding these concepts? +3. How can you structure this information in a clear, logical manner? +4. What unnecessary details or fluff can be removed while retaining the core knowledge? + + +[Your analysis goes here] + + +Based on your analysis, please output the distilled knowledge from the context in a section. Follow these guidelines: + +1. Capture the core information in a succinct, well-organized manner. +2. Use clear, concise language optimized for language model comprehension. +3. Structure the information logically, using bullet points, numbered lists, or short paragraphs as appropriate. +4. Include key technical details and definitions where necessary. +5. Aim for completeness in covering the main ideas, but prioritize brevity and clarity. + + +[Your distilled knowledge goes here] + + +Remember, the goal is to create a summary that a language model could easily learn from and apply to related tasks or questions. +`) diff --git a/packages/prompts/src/templates/extract-relevant-links.ts b/packages/prompts/src/templates/extract-relevant-links.ts new file mode 100644 index 00000000..29406b20 --- /dev/null +++ b/packages/prompts/src/templates/extract-relevant-links.ts @@ -0,0 +1,57 @@ +import {ChatPromptTemplate} from '@langchain/core/prompts' + +/** + * Extracts relevant links from a given piece of content + * @params content + */ +export const extractRelevantLinks = + ChatPromptTemplate.fromTemplate(`You are tasked with extracting relevant links from a given piece of content. Your goal is to find links that provide additional context or information related to the main topic, while avoiding marketing or advertisement-focused links. + +Here is the content you will be working with: + + +{content} + + +Follow these steps to complete the task: + +1. Carefully read through the content and identify all links present. + +2. For each link, evaluate its relevance to the main topic of the content. Consider the following guidelines: + - The link should provide additional information, context, or depth to the topic discussed. + - The link should lead to reputable sources or official websites related to the subject matter. + - Avoid links that are primarily for marketing purposes, product promotions, or advertisements. + - Exclude links to social media profiles unless they are directly relevant to the content's subject. + +3. For links you deem relevant, format them as markdown links within tags. The format should be: + [Link text](URL) + +4. If you're unsure about a link's relevance, use the tags to think through your decision. For example: + + +Considering the link to "example.com/product". While it's related to the topic, it seems to be a product page rather than providing additional context. I'll exclude this link. + + +5. After evaluating all links, compile your final list of relevant links. + +6. Present your final output within tags, with each link on a new line. + +Here's an example of good and bad link selections: + +Good: [NASA's Mars Exploration Program](https://mars.nasa.gov/) +Bad: [Buy Mars-themed T-shirts](https://example.com/mars-tshirts) + +Remember, the goal is to provide valuable, context-adding links, not to compile an exhaustive list of all links in the content. + +Your final output should look like this: + + +[Relevant link 1](URL1) +[Relevant link 2](URL2) +[Relevant link 3](URL3) + + +If no relevant links are found, output: + + +`) diff --git a/packages/prompts/src/templates/generate-prompt.ts b/packages/prompts/src/templates/generate-prompt.ts new file mode 100644 index 00000000..ec313942 --- /dev/null +++ b/packages/prompts/src/templates/generate-prompt.ts @@ -0,0 +1,43 @@ +import {ChatPromptTemplate} from '@langchain/core/prompts' + +/** + * Creates a comprehensive prompt given a users initial prompt for an LLM + * + * @params userInput + */ +export const generateLLMPrompt = + ChatPromptTemplate.fromTemplate(`You are tasked with creating a comprehensive prompt for a language model based on a user's input. Your goal is to expand upon the user's prompt, providing clear and detailed instructions that will guide the language model to produce the desired output. + +Here is the user's prompt: + +{userInput} + + +Follow these steps to create a comprehensive prompt: + +1. Analyze the user's prompt and identify the main task or question being asked. + +2. Expand on the prompt by providing more context, specific instructions, and any necessary background information that will help the language model understand the task better. + +3. Define all variables using single curly braces, like this: {variable_name}. Ensure that each variable is clearly explained and its purpose is evident in the context of the prompt. + +4. Instruct the language model to return any pertinent data or information using XML tags. Specify the names of these tags based on the type of information being requested. For example: + + + + +5. Structure the prompt in a logical order, typically following these steps: + a. Introduction and context + b. Specific instructions + c. Input variables (if any) + d. Output format requirements + e. Additional guidelines or constraints + +6. If appropriate, include one or two examples of expected input and output to further clarify the task. + +7. Ensure that the prompt is clear, concise, and free of ambiguity. Use simple language and avoid jargon unless it's necessary for the task. + +8. Double-check that all variables are properly defined and that the required XML tags are clearly specified. + +Write your comprehensive prompt inside tags. Remember to maintain consistency in tone and style throughout the prompt, and make sure all instructions are clear and actionable for the language model. +`) diff --git a/packages/prompts/src/templates/generate-search-terms.ts b/packages/prompts/src/templates/generate-search-terms.ts new file mode 100644 index 00000000..1fa4a44c --- /dev/null +++ b/packages/prompts/src/templates/generate-search-terms.ts @@ -0,0 +1,60 @@ +import {ChatPromptTemplate} from '@langchain/core/prompts' + +/** Generates SEO terms / related search results given a query */ +/** @params searchQuery */ +export const generateSeoTerms = + ChatPromptTemplate.fromTemplate(`You are tasked with creating a list of related terms that could potentially produce greater returns from a search engine, given a specific search term. This task aims to expand the scope of a search query and uncover additional relevant results that might not appear with the original search term alone. + +Here is the search term you will be working with: + +{searchQuery} + + +To complete this task, follow these steps: + +1. Analyze the given search term: + - Identify the main topic or concept + - Consider potential subtopics or related areas + - Think about synonyms, broader terms, and more specific terms + +2. Generate a list of related terms: + - Include synonyms and close variations of the search term + - Add broader category terms that encompass the search term + - Include more specific or narrower terms related to the search term + - Consider related concepts or associated ideas + - Think about common phrases or collocations that include the search term + +3. Provide your list of related terms in the following format: + + ... + ... + ... + + +Aim to provide at least 5 related terms, but no more than 10. Each term should be a word or short phrase, not a complete sentence. + +Here are two examples to guide you: + +Example 1: +organic gardening + +Natural pest control +Composting techniques +Heirloom seeds +Permaculture +Sustainable agriculture + + +Example 2: +artificial intelligence ethics + +Machine learning bias +AI governance +Algorithmic fairness +Responsible AI development +Ethical implications of AI + + +Remember to focus on terms that are closely related to the original search term but offer different perspectives or aspects of the topic. Strive for a balance between relevance and diversity in your list of related terms. + +Begin your analysis and provide your list of related terms now.`) diff --git a/packages/prompts/src/templates/index.ts b/packages/prompts/src/templates/index.ts new file mode 100644 index 00000000..e2c2f73e --- /dev/null +++ b/packages/prompts/src/templates/index.ts @@ -0,0 +1,9 @@ +export * from "./analyze-transcript.js"; +export * from "./chain-of-density.js"; +export * from "./distill-knowledge.js"; +export * from "./extract-relevant-links.js"; +export * from "./generate-prompt.js"; +export * from "./generate-search-terms.js"; +export * from "./prompt-tagging.js"; +export * from "./stable-diffusion-prompt.js"; +export * from "./tree-of-thought.js"; diff --git a/packages/prompts/src/templates/prompt-tagging.ts b/packages/prompts/src/templates/prompt-tagging.ts new file mode 100644 index 00000000..41929158 --- /dev/null +++ b/packages/prompts/src/templates/prompt-tagging.ts @@ -0,0 +1,52 @@ +import {ChatPromptTemplate} from '@langchain/core/prompts' + +/** + * Creates a comprehensive prompt given a users initial prompt for an LLM + * + * @params prompt + */ +export const generatePromptTags = + ChatPromptTemplate.fromTemplate(`You are tasked with creating a set of tags for a given prompt. These tags will be used for easy semantic search and recall of the prompt later. Your goal is to analyze the prompt and generate relevant tags that capture its key concepts, intent, and potential applications. + +Here is the prompt you need to analyze: + + +{prompt} + + +Please provide your output in the following format: + + +... + + +Follow these steps to complete the task: + +1. Create a brief, descriptive title for the prompt. This should be a concise phrase that captures the main purpose or theme of the prompt. Place this title within the tags. + +2. Write a short summary of the prompt, highlighting its main points and objectives. This summary should be no more than 2-3 sentences long. Place this summary within the <summary> tags. + +3. Generate a list of relevant tags for the prompt. Consider the following aspects when creating tags: + - The main topic or subject of the prompt + - The type of task or action required (e.g., analysis, generation, classification) + - Key concepts or themes mentioned + - Potential applications or use cases + - Relevant fields or domains (e.g., natural language processing, content creation, data analysis) + - Any specific techniques or methodologies mentioned + +4. Create as many tags as you think are sufficient to accurately represent the prompt's content and intent. Typically, this might be between 5-15 tags, but use your judgment based on the complexity and breadth of the prompt. + +5. Each tag should be a single word or short phrase (no more than 2-3 words). Place each tag within its own <tag> tags inside the <tags> section. + +Examples of good tags might include: +- "text-generation" +- "sentiment-analysis" +- "prompt-engineering" +- "data-classification" +- "creative-writing" +- "code-generation" +- "language-model" +- "task-specific" +- "content-moderation" + +Remember to enclose your entire output within the specified XML tags, providing a title, summary, and a comprehensive set of tags that will facilitate easy search and recall of this prompt in the future.`) diff --git a/packages/prompts/src/templates/stable-diffusion-prompt.ts b/packages/prompts/src/templates/stable-diffusion-prompt.ts new file mode 100644 index 00000000..2a0a2c3a --- /dev/null +++ b/packages/prompts/src/templates/stable-diffusion-prompt.ts @@ -0,0 +1,38 @@ +import {ChatPromptTemplate} from '@langchain/core/prompts' + +/** + * Creates a prompt for a Stable Diffusion image generator given a users input + * + * @params userInput + */ +export const generateStableDiffusionPrompt = + ChatPromptTemplate.fromTemplate(`You are an AI assistant tasked with creating a detailed prompt for the Stable Diffusion image generator based on a user's input. Your goal is to transform the user's description into a rich, descriptive prompt that will guide the image generator to produce a high-quality, accurate visual representation. +Follow these steps to create an effective prompt: + +Analyze the user's input and identify the key elements they want to see in the image. +Expand on these elements by adding descriptive details, such as: + +Style (e.g., photorealistic, cartoon, oil painting, digital art) +Lighting conditions (e.g., soft natural light, dramatic shadows, neon glow) +Color palette (e.g., vibrant, muted, monochromatic) +Composition (e.g., close-up, wide shot, bird's-eye view) +Mood or atmosphere (e.g., serene, mysterious, energetic) + + +Include specific details about the subject matter, such as textures, materials, or unique features. +Add relevant artistic references or inspirations if applicable (e.g., "in the style of Van Gogh" or "inspired by cyberpunk aesthetics"). +Use clear and concise language, avoiding ambiguous terms or overly complex descriptions. +Ensure that the prompt is coherent and flows well when read as a single statement. +If the user's input is vague or lacks detail, ask for clarification or make reasonable assumptions based on the context provided. + +Keep the prompt short and keyword driven, don't ramble on + +Provide your generated prompt within the following XML tags: +<generatedPrompt></generatedPrompt> +Example: +User input: "A cat in a garden" +<generatedPrompt>a cat in a forest, highly detailed, digital art, trending on artstation, backlighting, by kawacy, by wayne mclouglin, by don bluth, by ken sugimori, by louis wain, fan art</generatedPrompt> +Now, please process the following user input and create a detailed prompt for the Stable Diffusion image generator: + +{userInput} +`) diff --git a/packages/prompts/src/templates/tree-of-thought.ts b/packages/prompts/src/templates/tree-of-thought.ts new file mode 100644 index 00000000..df3f183d --- /dev/null +++ b/packages/prompts/src/templates/tree-of-thought.ts @@ -0,0 +1,34 @@ +import { ChatPromptTemplate } from "@langchain/core/prompts"; + +/** + * Creates a comprehensive prompt given a users initial prompt for an LLM + * + * @params userInput + */ +export const treeOfThought = + ChatPromptTemplate.fromTemplate(`You are an AI assistant tasked with answering questions using a deliberative reasoning process that explores multiple paths of thought. Your goal is to provide insightful, well-reasoned answers while explaining your thought process. + +Here is the question you need to answer: +<question> +{userInput} +</question> + +Follow these steps to answer the question: + +1. Analyze the question carefully and break it down into logical sub-questions. This will help you create a framework for reasoning. Write these sub-questions in a numbered list inside <sub-questions> tags. + +2. For each sub-question, generate 2-3 intermediate thoughts that represent steps towards an answer. These thoughts should aim to reframe the question, provide context, analyze assumptions, or bridge concepts. Write each set of thoughts for a sub-question inside <thoughts> tags, with each thought on a new line preceded by a dash (-). + +3. Evaluate each thought based on its clarity, relevance, logical flow, and coverage of concepts. Assign a score from 1-10 for each thought, with 10 being the highest. Write your evaluations inside <evaluation> tags, with each evaluation on a new line in the format: "Thought: [brief summary] - Score: [X]/10 - Reason: [brief explanation]". + +4. Based on your evaluations, construct a chain of reasoning that connects the strongest thoughts in a natural order. If you determine that the current chain doesn't fully answer the question, backtrack and explore alternative paths by substituting different high-scoring thoughts. Explain your reasoning process, including why some thoughts were deemed less ideal, inside <reasoning> tags. + +5. Once you have constructed a reasoning chain that thoroughly answers all sub-questions in a clear, logical manner, synthesize the key insights into a final concise answer. + +6. Write your final response inside <answer> tags. Include your intermediate thoughts inline to illustrate your deliberative reasoning process. Structure your response as follows: + - Start with a brief introduction of your approach + - Present your reasoning chain, including intermediate thoughts and explanations + - Conclude with your synthesized final answer + +Remember to provide explanatory details on your thought process rather than just stating conclusions. Your goal is to produce an insightful answer while demonstrating the deliberative reasoning that led to it. + `); diff --git a/packages/prompts/tsconfig.cjs.json b/packages/prompts/tsconfig.cjs.json new file mode 100644 index 00000000..56a21284 --- /dev/null +++ b/packages/prompts/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "./dist/cjs", + "moduleResolution": "Node" + } +} diff --git a/packages/prompts/tsconfig.json b/packages/prompts/tsconfig.json new file mode 100644 index 00000000..73a12443 --- /dev/null +++ b/packages/prompts/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "incremental": true, + "target": "ESNext", + "module": "ESNext", + "declaration": true, + "esModuleInterop": true, + "outDir": "./dist/esm", + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "allowJs": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"] +} From 150d0e0279c25cd10e71ecaeb5b291e09719a408 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Thu, 1 Aug 2024 22:38:32 -0700 Subject: [PATCH 04/18] restructure --- packages/tools/package.json | 6 ++++-- packages/tools/{ => src}/process/extract-links.ts | 0 packages/tools/{ => src}/process/parse-transcript.ts | 0 packages/tools/{ => src/retrieve}/fetch-github.ts | 0 packages/tools/{ => src/retrieve}/fetch-youtube.ts | 0 packages/tools/{ => src/retrieve}/scrape-website.ts | 0 6 files changed, 4 insertions(+), 2 deletions(-) rename packages/tools/{ => src}/process/extract-links.ts (100%) rename packages/tools/{ => src}/process/parse-transcript.ts (100%) rename packages/tools/{ => src/retrieve}/fetch-github.ts (100%) rename packages/tools/{ => src/retrieve}/fetch-youtube.ts (100%) rename packages/tools/{ => src/retrieve}/scrape-website.ts (100%) diff --git a/packages/tools/package.json b/packages/tools/package.json index 74d3fc49..452422f6 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@ai-citizens/graph", - "version": "0.0.3", + "version": "0.0.0", "description": "", "type": "module", "main": "./dist/cjs/index.js", @@ -19,7 +19,9 @@ "keywords": [], "author": "", "license": "ISC", - "dependencies": {}, + "dependencies": { + "@ai-citizens/llm": "workspace:*" + }, "peerDependencies": { "dotenv": "^16.4.5", "@langchain/community": "^0.2.22" diff --git a/packages/tools/process/extract-links.ts b/packages/tools/src/process/extract-links.ts similarity index 100% rename from packages/tools/process/extract-links.ts rename to packages/tools/src/process/extract-links.ts diff --git a/packages/tools/process/parse-transcript.ts b/packages/tools/src/process/parse-transcript.ts similarity index 100% rename from packages/tools/process/parse-transcript.ts rename to packages/tools/src/process/parse-transcript.ts diff --git a/packages/tools/fetch-github.ts b/packages/tools/src/retrieve/fetch-github.ts similarity index 100% rename from packages/tools/fetch-github.ts rename to packages/tools/src/retrieve/fetch-github.ts diff --git a/packages/tools/fetch-youtube.ts b/packages/tools/src/retrieve/fetch-youtube.ts similarity index 100% rename from packages/tools/fetch-youtube.ts rename to packages/tools/src/retrieve/fetch-youtube.ts diff --git a/packages/tools/scrape-website.ts b/packages/tools/src/retrieve/scrape-website.ts similarity index 100% rename from packages/tools/scrape-website.ts rename to packages/tools/src/retrieve/scrape-website.ts From 84b9d032cdc38d9818dc02d126dcdfc5b34210b3 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Thu, 1 Aug 2024 22:38:47 -0700 Subject: [PATCH 05/18] reset version --- packages/graph/package.json | 2 +- packages/prompts/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graph/package.json b/packages/graph/package.json index 8c43bf79..b4ae7f08 100644 --- a/packages/graph/package.json +++ b/packages/graph/package.json @@ -1,6 +1,6 @@ { "name": "@ai-citizens/graph", - "version": "0.0.3", + "version": "0.0.0", "description": "", "type": "module", "main": "./dist/cjs/index.js", diff --git a/packages/prompts/package.json b/packages/prompts/package.json index 626f62f9..3981f93b 100644 --- a/packages/prompts/package.json +++ b/packages/prompts/package.json @@ -1,6 +1,6 @@ { "name": "@ai-citizens/prompts", - "version": "0.0.3", + "version": "0.0.0", "description": "", "type": "module", "main": "./dist/cjs/index.js", From 51222e2094eccea4fd0862726a799c9f13c7ebb0 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Thu, 1 Aug 2024 22:39:02 -0700 Subject: [PATCH 06/18] update lockfile --- pnpm-lock.yaml | 573 ++++++++++++++++++++++++------------------------- 1 file changed, 285 insertions(+), 288 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a08eb0c9..d8bfc739 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@langchain/core': specifier: ^0.2.18 - version: 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + version: 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -23,7 +23,7 @@ importers: version: 18.19.42 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.7.3)(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.7.4)(@types/node@18.19.42)(typescript@5.5.4) typescript: specifier: ^5.5.4 version: 5.5.4 @@ -38,22 +38,22 @@ importers: version: link:../utils '@langchain/anthropic': specifier: ^0.2.10 - version: 0.2.10(langchain@0.2.12)(openai@4.53.2) + version: 0.2.12(langchain@0.2.12)(openai@4.54.0) '@langchain/core': specifier: ^0.2.18 - version: 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + version: 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) '@langchain/google-genai': specifier: ^0.0.23 - version: 0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8) + version: 0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8) '@langchain/groq': specifier: ^0.0.15 - version: 0.0.15(langchain@0.2.12)(openai@4.53.2) + version: 0.0.15(langchain@0.2.12)(openai@4.54.0) '@langchain/ollama': specifier: ^0.0.2 - version: 0.0.2(langchain@0.2.12)(openai@4.53.2) + version: 0.0.2(langchain@0.2.12)(openai@4.54.0) '@langchain/openai': specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2)) + version: 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0)) '@oclif/core': specifier: ^4.0.17 version: 4.0.17 @@ -62,7 +62,7 @@ importers: version: 6.2.7 '@oclif/plugin-plugins': specifier: ^5 - version: 5.3.9 + version: 5.4.0 clipboardy: specifier: ^4.0.0 version: 4.0.0 @@ -90,7 +90,7 @@ importers: version: 0.3.4 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.7.3)(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.7.4)(@types/node@18.19.42)(typescript@5.5.4) packages/graph: dependencies: @@ -106,19 +106,19 @@ importers: dependencies: '@langchain/anthropic': specifier: ^0.2.10 - version: 0.2.10(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + version: 0.2.12(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) '@langchain/google-genai': specifier: ^0.0.23 - version: 0.0.23(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)(zod@3.23.8) + version: 0.0.23(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)(zod@3.23.8) '@langchain/groq': specifier: ^0.0.15 - version: 0.0.15(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + version: 0.0.15(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) '@langchain/ollama': specifier: ^0.0.2 - version: 0.0.2(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + version: 0.0.2(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) '@langchain/openai': specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.12(openai@4.53.2)) + version: 0.2.5(langchain@0.2.12(openai@4.54.0)) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -139,9 +139,12 @@ importers: packages/tools: dependencies: + '@ai-citizens/llm': + specifier: workspace:* + version: link:../llm '@langchain/community': specifier: ^0.2.22 - version: 0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2) + version: 0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -167,13 +170,13 @@ importers: version: 18.3.0 '@typescript-eslint/eslint-plugin': specifier: ^7.15.0 - version: 7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^7.15.0 - version: 7.17.0(eslint@8.57.0)(typescript@5.5.4) + version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) '@vitejs/plugin-react-swc': specifier: ^3.5.0 - version: 3.7.0(vite@5.3.5(@types/node@22.0.0)) + version: 3.7.0(vite@5.3.5(@types/node@18.19.42)) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -188,7 +191,7 @@ importers: version: 5.5.4 vite: specifier: ^5.3.4 - version: 5.3.5(@types/node@22.0.0) + version: 5.3.5(@types/node@18.19.42) packages/utils: dependencies: @@ -466,8 +469,8 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@langchain/anthropic@0.2.10': - resolution: {integrity: sha512-Tb0k8/oUitFzupSxPAmKNnKr28IxZYrF0K7vZUcHLlRA2tljBbUiU9hFnuSiN0VBTttrrFkNQ1VsltBbOL79eQ==} + '@langchain/anthropic@0.2.12': + resolution: {integrity: sha512-F74kgQiHHLMSc1CYB3wAPh6ou+ql8ExOqeOMe/NPwK8MuMqC6By/44lAtuV/hOSE/pUmQCNfJmnYwuwteXCXRA==} engines: {node: '>=18'} '@langchain/community@0.2.22': @@ -839,8 +842,8 @@ packages: youtubei.js: optional: true - '@langchain/core@0.2.18': - resolution: {integrity: sha512-ru542BwNcsnDfjTeDbIkFIchwa54ctHZR+kVrC8U9NPS9/36iM8p8ruprOV7Zccj/oxtLE5UpEhV+9MZhVcFlA==} + '@langchain/core@0.2.19': + resolution: {integrity: sha512-Q3q3yUuKuwIDHYef+Vk4BmtkJsNZGkdKV1pNUomL1+v2pOKmu2kchQh2oLg74tqupsr2ICVQAMjYzcPrXnNmzQ==} engines: {node: '>=18'} '@langchain/google-genai@0.0.23': @@ -944,8 +947,8 @@ packages: resolution: {integrity: sha512-gwrCZW0EjbMe6iIXrkXWpIcfoqo+uMvWRudV3nkwa7ARL2U2GWy8RQ3+bqXvqByauRUcbgv3D6+38lSWqmMwtA==} engines: {node: '>=18.0.0'} - '@oclif/plugin-plugins@5.3.9': - resolution: {integrity: sha512-79PM/ACAbuyxF6XMRdzW12OOJ1XsNb5h/vWWglISbYf7IlI/Uyo26B7ix+mvdL0nq/XSDaMePBad1+aR5BmXzg==} + '@oclif/plugin-plugins@5.4.0': + resolution: {integrity: sha512-nps0twvQypi4X3iWDpkft8+fG7xeJFwevF9al2YQIXo2wHgkXqX7ZfR6h4xjItRBwOoaXtJfBehVuWUw6IXWNw==} engines: {node: '>=18.0.0'} '@oclif/screen@1.0.4': @@ -953,148 +956,148 @@ packages: engines: {node: '>=8.0.0'} deprecated: Deprecated in favor of @oclif/core - '@rollup/rollup-android-arm-eabi@4.19.1': - resolution: {integrity: sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==} + '@rollup/rollup-android-arm-eabi@4.19.2': + resolution: {integrity: sha512-OHflWINKtoCFSpm/WmuQaWW4jeX+3Qt3XQDepkkiFTsoxFc5BpF3Z5aDxFZgBqRjO6ATP5+b1iilp4kGIZVWlA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.19.1': - resolution: {integrity: sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==} + '@rollup/rollup-android-arm64@4.19.2': + resolution: {integrity: sha512-k0OC/b14rNzMLDOE6QMBCjDRm3fQOHAL8Ldc9bxEWvMo4Ty9RY6rWmGetNTWhPo+/+FNd1lsQYRd0/1OSix36A==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.19.1': - resolution: {integrity: sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==} + '@rollup/rollup-darwin-arm64@4.19.2': + resolution: {integrity: sha512-IIARRgWCNWMTeQH+kr/gFTHJccKzwEaI0YSvtqkEBPj7AshElFq89TyreKNFAGh5frLfDCbodnq+Ye3dqGKPBw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.19.1': - resolution: {integrity: sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==} + '@rollup/rollup-darwin-x64@4.19.2': + resolution: {integrity: sha512-52udDMFDv54BTAdnw+KXNF45QCvcJOcYGl3vQkp4vARyrcdI/cXH8VXTEv/8QWfd6Fru8QQuw1b2uNersXOL0g==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.19.1': - resolution: {integrity: sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.19.2': + resolution: {integrity: sha512-r+SI2t8srMPYZeoa1w0o/AfoVt9akI1ihgazGYPQGRilVAkuzMGiTtexNZkrPkQsyFrvqq/ni8f3zOnHw4hUbA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.19.1': - resolution: {integrity: sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==} + '@rollup/rollup-linux-arm-musleabihf@4.19.2': + resolution: {integrity: sha512-+tYiL4QVjtI3KliKBGtUU7yhw0GMcJJuB9mLTCEauHEsqfk49gtUBXGtGP3h1LW8MbaTY6rSFIQV1XOBps1gBA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.19.1': - resolution: {integrity: sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==} + '@rollup/rollup-linux-arm64-gnu@4.19.2': + resolution: {integrity: sha512-OR5DcvZiYN75mXDNQQxlQPTv4D+uNCUsmSCSY2FolLf9W5I4DSoJyg7z9Ea3TjKfhPSGgMJiey1aWvlWuBzMtg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.19.1': - resolution: {integrity: sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==} + '@rollup/rollup-linux-arm64-musl@4.19.2': + resolution: {integrity: sha512-Hw3jSfWdUSauEYFBSFIte6I8m6jOj+3vifLg8EU3lreWulAUpch4JBjDMtlKosrBzkr0kwKgL9iCfjA8L3geoA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': - resolution: {integrity: sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.19.2': + resolution: {integrity: sha512-rhjvoPBhBwVnJRq/+hi2Q3EMiVF538/o9dBuj9TVLclo9DuONqt5xfWSaE6MYiFKpo/lFPJ/iSI72rYWw5Hc7w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.19.1': - resolution: {integrity: sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==} + '@rollup/rollup-linux-riscv64-gnu@4.19.2': + resolution: {integrity: sha512-EAz6vjPwHHs2qOCnpQkw4xs14XJq84I81sDRGPEjKPFVPBw7fwvtwhVjcZR6SLydCv8zNK8YGFblKWd/vRmP8g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.19.1': - resolution: {integrity: sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==} + '@rollup/rollup-linux-s390x-gnu@4.19.2': + resolution: {integrity: sha512-IJSUX1xb8k/zN9j2I7B5Re6B0NNJDJ1+soezjNojhT8DEVeDNptq2jgycCOpRhyGj0+xBn7Cq+PK7Q+nd2hxLA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.19.1': - resolution: {integrity: sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==} + '@rollup/rollup-linux-x64-gnu@4.19.2': + resolution: {integrity: sha512-OgaToJ8jSxTpgGkZSkwKE+JQGihdcaqnyHEFOSAU45utQ+yLruE1dkonB2SDI8t375wOKgNn8pQvaWY9kPzxDQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.19.1': - resolution: {integrity: sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==} + '@rollup/rollup-linux-x64-musl@4.19.2': + resolution: {integrity: sha512-5V3mPpWkB066XZZBgSd1lwozBk7tmOkKtquyCJ6T4LN3mzKENXyBwWNQn8d0Ci81hvlBw5RoFgleVpL6aScLYg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.19.1': - resolution: {integrity: sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==} + '@rollup/rollup-win32-arm64-msvc@4.19.2': + resolution: {integrity: sha512-ayVstadfLeeXI9zUPiKRVT8qF55hm7hKa+0N1V6Vj+OTNFfKSoUxyZvzVvgtBxqSb5URQ8sK6fhwxr9/MLmxdA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.19.1': - resolution: {integrity: sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==} + '@rollup/rollup-win32-ia32-msvc@4.19.2': + resolution: {integrity: sha512-Mda7iG4fOLHNsPqjWSjANvNZYoW034yxgrndof0DwCy0D3FvTjeNo+HGE6oGWgvcLZNLlcp0hLEFcRs+UGsMLg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.19.1': - resolution: {integrity: sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==} + '@rollup/rollup-win32-x64-msvc@4.19.2': + resolution: {integrity: sha512-DPi0ubYhSow/00YqmG1jWm3qt1F8aXziHc/UNy8bo9cpCacqhuWu+iSq/fp2SyEQK7iYTZ60fBU9cat3MXTjIQ==} cpu: [x64] os: [win32] - '@swc/core-darwin-arm64@1.7.3': - resolution: {integrity: sha512-CTkHa6MJdov9t41vuV2kmQIMu+Q19LrEHGIR/UiJYH06SC/sOu35ZZH8DyfLp9ZoaCn21gwgWd61ixOGQlwzTw==} + '@swc/core-darwin-arm64@1.7.4': + resolution: {integrity: sha512-RbWrdGh+x9xKFUA9/kPZRR8OPxUsDUuPyLjPIGLYZMO+ftht2vhVH7QsUq6lg+jAP34eIya72UA1isiZe+BRaA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.7.3': - resolution: {integrity: sha512-mun623y6rCoZ2EFIYfIRqXYRFufJOopoYSJcxYhZUrfTpAvQ1zLngjQpWCUU1krggXR2U0PQj+ls0DfXUTraNg==} + '@swc/core-darwin-x64@1.7.4': + resolution: {integrity: sha512-TxCWMJs4OrqApjFuT8cUiqMz0zg97F0JsXBEeZ7zjkyv9XJ/rN2pdwqMlZv0Wv2C2rivOPo6FsWYlZ3V8ZHhyA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.7.3': - resolution: {integrity: sha512-4Jz4UcIcvZNMp9qoHbBx35bo3rjt8hpYLPqnR4FFq6gkAsJIMFC56UhRZwdEQoDuYiOFMBnnrsg31Fyo6YQypA==} + '@swc/core-linux-arm-gnueabihf@1.7.4': + resolution: {integrity: sha512-5IhwIJZAgkkfI6PqgQ3xk0/2hTAVsAczIPLiR2Epp30EgsNo1KIFL0ZHzrnvJPy5BZ3jy3T1dEbDE/memBOEmA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.7.3': - resolution: {integrity: sha512-p+U/M/oqV7HC4erQ5TVWHhJU1984QD+wQBPxslAYq751bOQGm0R/mXK42GjugqjnR6yYrAiwKKbpq4iWVXNePA==} + '@swc/core-linux-arm64-gnu@1.7.4': + resolution: {integrity: sha512-0787jri83jigf26mF8FndWehh7jqMaHwAm/OV6VdToyNo/g+d1AxVpkEizrywZK46el+AObnHUIHIHwZgO21LA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.7.3': - resolution: {integrity: sha512-s6VzyaJwaRGTi2mz2h6Ywxfmgpkc69IxhuMzl+sl34plH0V0RgnZDm14HoCGIKIzRk4+a2EcBV1ZLAfWmPACQg==} + '@swc/core-linux-arm64-musl@1.7.4': + resolution: {integrity: sha512-A45hGKWAGcjU5Ol0uQUoK0tHerwEKxfprYUZbmPLpD2yrpMZr+dTrwY2n075sixs7RuZEccBkgGNpehEe5BPBQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.7.3': - resolution: {integrity: sha512-IrFY48C356Z2dU2pjYg080yvMXzmSV3Lmm/Wna4cfcB1nkVLjWsuYwwRAk9CY7E19c+q8N1sMNggubAUDYoX2g==} + '@swc/core-linux-x64-gnu@1.7.4': + resolution: {integrity: sha512-bcO1MpAm39TXqqHuYW4ox4vDvhB7jkguwMwxvmL+cKBGsUHrIoUTfGt9NM9N4D4CvOwULlxqbyt19veUJ7CVPw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.7.3': - resolution: {integrity: sha512-qoLgxBlBnnyUEDu5vmRQqX90h9jldU1JXI96e6eh2d1gJyKRA0oSK7xXmTzorv1fGHiHulv9qiJOUG+g6uzJWg==} + '@swc/core-linux-x64-musl@1.7.4': + resolution: {integrity: sha512-N6nXuHyDO/q5kPN2xQxz5BEvhFpgnFSkP+9wxg5xWq+qIQL5bv37jk8dkKvMLx/8fHzTqrIjPDSRzVbcL7sqXg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.7.3': - resolution: {integrity: sha512-OAd7jVVJ7nb0Ev80VAa1aeK+FldPeC4eZ35H4Qn6EICzIz0iqJo2T33qLKkSZiZEBKSoF4KcwrqYfkjLOp5qWg==} + '@swc/core-win32-arm64-msvc@1.7.4': + resolution: {integrity: sha512-7W1owqCNR1cG+mpS55juiZlR/lrAdxB1pH32egeOipNKOLGwyqmlzQ0g9tkQTNgzwgfpCUg8z606+GqqXvajZw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.7.3': - resolution: {integrity: sha512-31+Le1NyfSnILFV9+AhxfFOG0DK0272MNhbIlbcv4w/iqpjkhaOnNQnLsYJD1Ow7lTX1MtIZzTjOhRlzSviRWg==} + '@swc/core-win32-ia32-msvc@1.7.4': + resolution: {integrity: sha512-saLkY+q7zNPk4gYiUBCc93FYPo4ECXMjHcSPtLVHoPZBIxRrklgaAf6aDpblBo30nVdoBE2V3YPd0Y/cPiY6RQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.7.3': - resolution: {integrity: sha512-jVQPbYrwcuueI4QB0fHC29SVrkFOBcfIspYDlgSoHnEz6tmLMqUy+txZUypY/ZH/KaK0HEY74JkzgbRC1S6LFQ==} + '@swc/core-win32-x64-msvc@1.7.4': + resolution: {integrity: sha512-zKF6jpRBNuVKgOf2W5dMcPyjwcNCp21syjl9lvLRbCeIg+1U+zjdoQCAmMWWoPNE7fLg+yfvohnnOJG2AdzQ9Q==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.7.3': - resolution: {integrity: sha512-HHAlbXjWI6Kl9JmmUW1LSygT1YbblXgj2UvvDzMkTBPRzYMhW6xchxdO8HbtMPtFYRt/EQq9u1z7j4ttRSrFsA==} + '@swc/core@1.7.4': + resolution: {integrity: sha512-+wSycNxOw9QQz81AJAZlNS34EtOIifwUXMPACg05PWjECsjOKDTXLCVPx6J0lRaxhHSGBU2OYs9mRfIvxGt3CA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -1141,9 +1144,6 @@ packages: '@types/node@18.19.42': resolution: {integrity: sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==} - '@types/node@22.0.0': - resolution: {integrity: sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==} - '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -1165,8 +1165,8 @@ packages: '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@typescript-eslint/eslint-plugin@7.17.0': - resolution: {integrity: sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==} + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1176,8 +1176,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.17.0': - resolution: {integrity: sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==} + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1186,12 +1186,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.17.0': - resolution: {integrity: sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==} + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.17.0': - resolution: {integrity: sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==} + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1200,12 +1200,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.17.0': - resolution: {integrity: sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==} + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.17.0': - resolution: {integrity: sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==} + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1213,14 +1213,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.17.0': - resolution: {integrity: sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==} + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.17.0': - resolution: {integrity: sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==} + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': @@ -2167,8 +2167,8 @@ packages: langchainhub@0.0.11: resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} - langsmith@0.1.39: - resolution: {integrity: sha512-K2/qbc96JhrZbSL74RbZ0DBOpTB9Mxicu8RQrZ88Xsp1bH2O3+y5EdcvC0g/1YzQWQhcQ4peknCA24c3VTNiNA==} + langsmith@0.1.40: + resolution: {integrity: sha512-11E2WLbh/+41+Qc0w8fJJTC/iz91BA+zXRMX/Wz0KSstnfzIPBoiWa++Kp2X8yCIDNywWWLJhy/B8gYzm7VKig==} peerDependencies: '@langchain/core': '*' langchain: '*' @@ -2311,6 +2311,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -2462,8 +2465,8 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - openai@4.53.2: - resolution: {integrity: sha512-ohYEv6OV3jsFGqNrgolDDWN6Ssx1nFg6JDJQuaBFo4SL2i+MBoOQ16n2Pq1iBF5lH1PKnfCIOfqAGkmzPvdB9g==} + openai@4.54.0: + resolution: {integrity: sha512-e/12BdtTtj+tXs7iHm+Dm7H7WjEWnw7O52B2wSfCQ6lD5F6cvjzo7cANXy5TJ1Q3/qc8YRPT5wBTTFtP5sBp1g==} hasBin: true openapi-types@12.1.3: @@ -2684,8 +2687,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.19.1: - resolution: {integrity: sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==} + rollup@4.19.2: + resolution: {integrity: sha512-6/jgnN1svF9PjNYJ4ya3l+cqutg49vOZ4rVgsDKxdl+5gpGPnByFXWGyfH9YGx9i3nfBwSu1Iyu6vGwFFA0BdQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2924,9 +2927,6 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.11.1: - resolution: {integrity: sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==} - universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3396,10 +3396,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@langchain/anthropic@0.2.10(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': + '@langchain/anthropic@0.2.12(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': dependencies: '@anthropic-ai/sdk': 0.22.0 - '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) fast-xml-parser: 4.4.1 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3408,10 +3408,10 @@ snapshots: - langchain - openai - '@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2)': + '@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0)': dependencies: '@anthropic-ai/sdk': 0.22.0 - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) fast-xml-parser: 4.4.1 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3420,16 +3420,16 @@ snapshots: - langchain - openai - '@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2)': + '@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) - '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2)) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)) binary-extensions: 2.3.0 expr-eval: 2.0.2 flat: 5.0.2 js-yaml: 4.1.0 - langchain: 0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2) - langsmith: 0.1.39(mbttg6lyqqe6inzhgs3ca7uscq) + langchain: 0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0) + langsmith: 0.1.40(xzehiv3ljp2f6jzrciipwzadji) uuid: 10.0.0 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3454,13 +3454,13 @@ snapshots: - peggy - pyodide - '@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2)': + '@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0)': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.39(mbttg6lyqqe6inzhgs3ca7uscq) + langsmith: 0.1.40(xzehiv3ljp2f6jzrciipwzadji) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -3472,13 +3472,13 @@ snapshots: - langchain - openai - '@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2)': + '@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0)': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.39(@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + langsmith: 0.1.40(@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -3490,13 +3490,13 @@ snapshots: - langchain - openai - '@langchain/core@0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': + '@langchain/core@0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.39(@langchain/core@0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + langsmith: 0.1.40(@langchain/core@0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -3508,30 +3508,30 @@ snapshots: - langchain - openai - '@langchain/google-genai@0.0.23(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)(zod@3.23.8)': + '@langchain/google-genai@0.0.23(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)(zod@3.23.8)': dependencies: '@google/generative-ai': 0.7.1 - '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - langchain - openai - zod - '@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8)': + '@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8)': dependencies: '@google/generative-ai': 0.7.1 - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - langchain - openai - zod - '@langchain/groq@0.0.15(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': + '@langchain/groq@0.0.15(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) - '@langchain/openai': 0.2.5(langchain@0.2.12(openai@4.53.2)) + '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(openai@4.54.0)) groq-sdk: 0.3.3 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3540,10 +3540,10 @@ snapshots: - langchain - openai - '@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2)': + '@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) - '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2)) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0)) groq-sdk: 0.3.3 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3552,77 +3552,77 @@ snapshots: - langchain - openai - '@langchain/ollama@0.0.2(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': + '@langchain/ollama@0.0.2(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) ollama: 0.5.6 uuid: 10.0.0 transitivePeerDependencies: - langchain - openai - '@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2)': + '@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) ollama: 0.5.6 uuid: 10.0.0 transitivePeerDependencies: - langchain - openai - '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))': + '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) js-tiktoken: 1.0.12 - openai: 4.53.2 + openai: 4.54.0 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - encoding - langchain - '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))': + '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) js-tiktoken: 1.0.12 - openai: 4.53.2 + openai: 4.54.0 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - encoding - langchain - '@langchain/openai@0.2.5(langchain@0.2.12(openai@4.53.2))': + '@langchain/openai@0.2.5(langchain@0.2.12(openai@4.54.0))': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) js-tiktoken: 1.0.12 - openai: 4.53.2 + openai: 4.54.0 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - encoding - langchain - '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2)': + '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain - openai - '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2)': + '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain - openai optional: true - '@langchain/textsplitters@0.0.3(langchain@0.2.12(openai@4.53.2))(openai@4.53.2)': + '@langchain/textsplitters@0.0.3(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain @@ -3820,7 +3820,7 @@ snapshots: dependencies: '@oclif/core': 4.0.17 - '@oclif/plugin-plugins@5.3.9': + '@oclif/plugin-plugins@5.4.0': dependencies: '@oclif/core': 4.0.17 ansis: 3.3.2 @@ -3838,99 +3838,99 @@ snapshots: '@oclif/screen@1.0.4': {} - '@rollup/rollup-android-arm-eabi@4.19.1': + '@rollup/rollup-android-arm-eabi@4.19.2': optional: true - '@rollup/rollup-android-arm64@4.19.1': + '@rollup/rollup-android-arm64@4.19.2': optional: true - '@rollup/rollup-darwin-arm64@4.19.1': + '@rollup/rollup-darwin-arm64@4.19.2': optional: true - '@rollup/rollup-darwin-x64@4.19.1': + '@rollup/rollup-darwin-x64@4.19.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.19.1': + '@rollup/rollup-linux-arm-gnueabihf@4.19.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.19.1': + '@rollup/rollup-linux-arm-musleabihf@4.19.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.19.1': + '@rollup/rollup-linux-arm64-gnu@4.19.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.19.1': + '@rollup/rollup-linux-arm64-musl@4.19.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.19.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.19.1': + '@rollup/rollup-linux-riscv64-gnu@4.19.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.19.1': + '@rollup/rollup-linux-s390x-gnu@4.19.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.19.1': + '@rollup/rollup-linux-x64-gnu@4.19.2': optional: true - '@rollup/rollup-linux-x64-musl@4.19.1': + '@rollup/rollup-linux-x64-musl@4.19.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.19.1': + '@rollup/rollup-win32-arm64-msvc@4.19.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.19.1': + '@rollup/rollup-win32-ia32-msvc@4.19.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.19.1': + '@rollup/rollup-win32-x64-msvc@4.19.2': optional: true - '@swc/core-darwin-arm64@1.7.3': + '@swc/core-darwin-arm64@1.7.4': optional: true - '@swc/core-darwin-x64@1.7.3': + '@swc/core-darwin-x64@1.7.4': optional: true - '@swc/core-linux-arm-gnueabihf@1.7.3': + '@swc/core-linux-arm-gnueabihf@1.7.4': optional: true - '@swc/core-linux-arm64-gnu@1.7.3': + '@swc/core-linux-arm64-gnu@1.7.4': optional: true - '@swc/core-linux-arm64-musl@1.7.3': + '@swc/core-linux-arm64-musl@1.7.4': optional: true - '@swc/core-linux-x64-gnu@1.7.3': + '@swc/core-linux-x64-gnu@1.7.4': optional: true - '@swc/core-linux-x64-musl@1.7.3': + '@swc/core-linux-x64-musl@1.7.4': optional: true - '@swc/core-win32-arm64-msvc@1.7.3': + '@swc/core-win32-arm64-msvc@1.7.4': optional: true - '@swc/core-win32-ia32-msvc@1.7.3': + '@swc/core-win32-ia32-msvc@1.7.4': optional: true - '@swc/core-win32-x64-msvc@1.7.3': + '@swc/core-win32-x64-msvc@1.7.4': optional: true - '@swc/core@1.7.3': + '@swc/core@1.7.4': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.12 optionalDependencies: - '@swc/core-darwin-arm64': 1.7.3 - '@swc/core-darwin-x64': 1.7.3 - '@swc/core-linux-arm-gnueabihf': 1.7.3 - '@swc/core-linux-arm64-gnu': 1.7.3 - '@swc/core-linux-arm64-musl': 1.7.3 - '@swc/core-linux-x64-gnu': 1.7.3 - '@swc/core-linux-x64-musl': 1.7.3 - '@swc/core-win32-arm64-msvc': 1.7.3 - '@swc/core-win32-ia32-msvc': 1.7.3 - '@swc/core-win32-x64-msvc': 1.7.3 + '@swc/core-darwin-arm64': 1.7.4 + '@swc/core-darwin-x64': 1.7.4 + '@swc/core-linux-arm-gnueabihf': 1.7.4 + '@swc/core-linux-arm64-gnu': 1.7.4 + '@swc/core-linux-arm64-musl': 1.7.4 + '@swc/core-linux-x64-gnu': 1.7.4 + '@swc/core-linux-x64-musl': 1.7.4 + '@swc/core-win32-arm64-msvc': 1.7.4 + '@swc/core-win32-ia32-msvc': 1.7.4 + '@swc/core-win32-x64-msvc': 1.7.4 '@swc/counter@0.1.3': {} @@ -3971,11 +3971,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.0.0': - dependencies: - undici-types: 6.11.1 - optional: true - '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.0': @@ -3997,14 +3992,14 @@ snapshots: '@types/uuid@9.0.8': {} - '@typescript-eslint/eslint-plugin@7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.17.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.17.0 - '@typescript-eslint/type-utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.17.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -4015,12 +4010,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 7.17.0 - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.17.0 + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: @@ -4028,15 +4023,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.17.0': + '@typescript-eslint/scope-manager@7.18.0': dependencies: - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/visitor-keys': 7.17.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.17.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) @@ -4045,12 +4040,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.17.0': {} + '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.17.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/visitor-keys': 7.17.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -4062,28 +4057,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.17.0(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.17.0 - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.17.0': + '@typescript-eslint/visitor-keys@7.18.0': dependencies: - '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.0(vite@5.3.5(@types/node@22.0.0))': + '@vitejs/plugin-react-swc@3.7.0(vite@5.3.5(@types/node@18.19.42))': dependencies: - '@swc/core': 1.7.3 - vite: 5.3.5(@types/node@22.0.0) + '@swc/core': 1.7.4 + vite: 5.3.5(@types/node@18.19.42) transitivePeerDependencies: - '@swc/helpers' @@ -4724,7 +4719,7 @@ snapshots: humanize-ms@1.2.1: dependencies: - ms: 2.1.2 + ms: 2.1.3 hyperlinker@1.0.0: {} @@ -4879,17 +4874,17 @@ snapshots: dependencies: json-buffer: 3.0.1 - langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2): + langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0): dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) - '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2)) - '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)) + '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.39(mbttg6lyqqe6inzhgs3ca7uscq) + langsmith: 0.1.40(xzehiv3ljp2f6jzrciipwzadji) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -4898,28 +4893,28 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) optionalDependencies: - '@langchain/anthropic': 0.2.10(langchain@0.2.12)(openai@4.53.2) - '@langchain/community': 0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2) - '@langchain/google-genai': 0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8) - '@langchain/groq': 0.0.15(langchain@0.2.12)(openai@4.53.2) - '@langchain/ollama': 0.0.2(langchain@0.2.12)(openai@4.53.2) + '@langchain/anthropic': 0.2.12(langchain@0.2.12)(openai@4.54.0) + '@langchain/community': 0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0) + '@langchain/google-genai': 0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8) + '@langchain/groq': 0.0.15(langchain@0.2.12)(openai@4.54.0) + '@langchain/ollama': 0.0.2(langchain@0.2.12)(openai@4.54.0) fast-xml-parser: 4.4.1 ignore: 5.3.1 transitivePeerDependencies: - encoding - openai - langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2): + langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0): dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) - '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2)) - '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0)) + '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.39(@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) + langsmith: 0.1.40(@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -4928,27 +4923,27 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) optionalDependencies: - '@langchain/anthropic': 0.2.10(langchain@0.2.12)(openai@4.53.2) - '@langchain/google-genai': 0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8) - '@langchain/groq': 0.0.15(langchain@0.2.12)(openai@4.53.2) - '@langchain/ollama': 0.0.2(langchain@0.2.12)(openai@4.53.2) + '@langchain/anthropic': 0.2.12(langchain@0.2.12)(openai@4.54.0) + '@langchain/google-genai': 0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8) + '@langchain/groq': 0.0.15(langchain@0.2.12)(openai@4.54.0) + '@langchain/ollama': 0.0.2(langchain@0.2.12)(openai@4.54.0) fast-xml-parser: 4.4.1 transitivePeerDependencies: - encoding - openai optional: true - langchain@0.2.12(openai@4.53.2): + langchain@0.2.12(openai@4.54.0): dependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) - '@langchain/openai': 0.2.5(langchain@0.2.12(openai@4.53.2)) - '@langchain/textsplitters': 0.0.3(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(openai@4.54.0)) + '@langchain/textsplitters': 0.0.3(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.39(@langchain/core@0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) + langsmith: 0.1.40(@langchain/core@0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -4963,41 +4958,44 @@ snapshots: langchainhub@0.0.11: {} - langsmith@0.1.39(@langchain/core@0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2): + langsmith@0.1.40(@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 p-queue: 6.6.2 p-retry: 4.6.2 + semver: 7.6.3 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2))(openai@4.53.2) - langchain: 0.2.12(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.53.2) - openai: 4.53.2 + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + langchain: 0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0) + openai: 4.54.0 - langsmith@0.1.39(@langchain/core@0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2))(langchain@0.2.12(openai@4.53.2))(openai@4.53.2): + langsmith@0.1.40(@langchain/core@0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(openai@4.54.0))(openai@4.54.0): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 p-queue: 6.6.2 p-retry: 4.6.2 + semver: 7.6.3 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(openai@4.53.2))(openai@4.53.2) - langchain: 0.2.12(openai@4.53.2) - openai: 4.53.2 + '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + langchain: 0.2.12(openai@4.54.0) + openai: 4.54.0 - langsmith@0.1.39(mbttg6lyqqe6inzhgs3ca7uscq): + langsmith@0.1.40(xzehiv3ljp2f6jzrciipwzadji): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 p-queue: 6.6.2 p-retry: 4.6.2 + semver: 7.6.3 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.18(langchain@0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2))(openai@4.53.2) - langchain: 0.2.12(@langchain/anthropic@0.2.10(langchain@0.2.12)(openai@4.53.2))(@langchain/community@0.2.22(@langchain/anthropic@0.2.10)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.53.2))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.53.2)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.53.2))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.53.2))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.53.2) - openai: 4.53.2 + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) + langchain: 0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0) + openai: 4.54.0 levn@0.4.1: dependencies: @@ -5128,6 +5126,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + mustache@4.2.0: {} mute-stream@1.0.0: {} @@ -5192,7 +5192,7 @@ snapshots: dependencies: mimic-fn: 4.0.0 - openai@4.53.2: + openai@4.54.0: dependencies: '@types/node': 18.19.42 '@types/node-fetch': 2.6.11 @@ -5424,26 +5424,26 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.19.1: + rollup@4.19.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.19.1 - '@rollup/rollup-android-arm64': 4.19.1 - '@rollup/rollup-darwin-arm64': 4.19.1 - '@rollup/rollup-darwin-x64': 4.19.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.19.1 - '@rollup/rollup-linux-arm-musleabihf': 4.19.1 - '@rollup/rollup-linux-arm64-gnu': 4.19.1 - '@rollup/rollup-linux-arm64-musl': 4.19.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.19.1 - '@rollup/rollup-linux-riscv64-gnu': 4.19.1 - '@rollup/rollup-linux-s390x-gnu': 4.19.1 - '@rollup/rollup-linux-x64-gnu': 4.19.1 - '@rollup/rollup-linux-x64-musl': 4.19.1 - '@rollup/rollup-win32-arm64-msvc': 4.19.1 - '@rollup/rollup-win32-ia32-msvc': 4.19.1 - '@rollup/rollup-win32-x64-msvc': 4.19.1 + '@rollup/rollup-android-arm-eabi': 4.19.2 + '@rollup/rollup-android-arm64': 4.19.2 + '@rollup/rollup-darwin-arm64': 4.19.2 + '@rollup/rollup-darwin-x64': 4.19.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.19.2 + '@rollup/rollup-linux-arm-musleabihf': 4.19.2 + '@rollup/rollup-linux-arm64-gnu': 4.19.2 + '@rollup/rollup-linux-arm64-musl': 4.19.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.19.2 + '@rollup/rollup-linux-riscv64-gnu': 4.19.2 + '@rollup/rollup-linux-s390x-gnu': 4.19.2 + '@rollup/rollup-linux-x64-gnu': 4.19.2 + '@rollup/rollup-linux-x64-musl': 4.19.2 + '@rollup/rollup-win32-arm64-msvc': 4.19.2 + '@rollup/rollup-win32-ia32-msvc': 4.19.2 + '@rollup/rollup-win32-x64-msvc': 4.19.2 fsevents: 2.3.3 run-async@3.0.0: {} @@ -5610,7 +5610,7 @@ snapshots: dependencies: typescript: 5.5.4 - ts-node@10.9.2(@swc/core@1.7.3)(@types/node@18.19.42)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.7.4)(@types/node@18.19.42)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -5628,7 +5628,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.7.3 + '@swc/core': 1.7.4 tslib@2.6.3: {} @@ -5654,9 +5654,6 @@ snapshots: undici-types@5.26.5: {} - undici-types@6.11.1: - optional: true - universalify@0.1.2: {} uri-js@4.4.1: @@ -5678,13 +5675,13 @@ snapshots: validate-npm-package-name@5.0.1: {} - vite@5.3.5(@types/node@22.0.0): + vite@5.3.5(@types/node@18.19.42): dependencies: esbuild: 0.21.5 postcss: 8.4.40 - rollup: 4.19.1 + rollup: 4.19.2 optionalDependencies: - '@types/node': 22.0.0 + '@types/node': 18.19.42 fsevents: 2.3.3 wcwidth@1.0.1: From e63638b1e74b6a5d850bc016226599f4fe830cd3 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Fri, 2 Aug 2024 14:12:07 -0700 Subject: [PATCH 07/18] update build pipelines --- package.json | 13 +- packages/cli/package.json | 3 + packages/cli/tsconfig.json | 4 +- packages/graph/package.json | 14 +- packages/graph/tsconfig.json | 6 +- packages/llm/package.json | 8 +- packages/llm/tsconfig.json | 6 +- packages/prompts/package.json | 5 +- packages/prompts/tsconfig.json | 7 +- packages/tools/package.json | 17 +- packages/tools/tsconfig.json | 9 +- packages/ui/package.json | 1 + packages/utils/tsconfig.json | 2 +- pnpm-lock.yaml | 577 ++++++++++++++++++++++++++------- tsconfig.base.json | 5 +- tsconfig.json | 10 +- 16 files changed, 533 insertions(+), 154 deletions(-) diff --git a/package.json b/package.json index 9ec00382..af065e1e 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "version": "0.0.0", "description": "", "scripts": { - "build": "pnpm -r run build", + "clean": "pnpm -r run clean", + "build": "pnpm run clean && pnpm -r run build", "ci:publish": "pnpm publish --access public -r --filter \"@ai-citizens/*\" --no-git-checks", "ci:version": "changeset version", "publish": "pnpm publish -r --filter \"@ai-citizens/*\" --no-git-checks", @@ -16,12 +17,16 @@ "license": "ISC", "devDependencies": { "@changesets/cli": "^2.27.7", + "@types/node": "^18", + "rimraf": "^6.0.1", "ts-node": "^10.9.2", - "typescript": "^5.5.4", - "@types/node": "^18" + "typescript": "^5.5.4" }, "dependencies": { - "@langchain/core": "^0.2.18", + "@ai-citizens/llm": "workspace:*", + "@ai-citizens/tools": "workspace:*", + "@ai-citizens/prompts": "workspace:*", + "@ai-citizens/utils": "workspace:*", "dotenv": "^16.4.5" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index b569959f..ef7bb157 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -33,6 +33,9 @@ "dependencies": { "@ai-citizens/llm": "workspace:*", "@ai-citizens/utils": "workspace:*", + "@ai-citizens/graph": "workspace:*", + "@ai-citizens/prompts": "workspace:*", + "@ai-citizens/tools": "workspace:*", "@langchain/anthropic": "^0.2.10", "@langchain/google-genai": "^0.0.23", "@langchain/groq": "^0.0.15", diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 1eb064ff..13789e69 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -6,13 +6,13 @@ "@ai-citizen/utils": ["../utils"] }, "declaration": true, - "module": "Node16", + "module": "NodeNext", "outDir": "dist", "rootDir": "./src", "composite": true, "strict": true, "target": "es2022", - "moduleResolution": "node16", + "moduleResolution": "NodeNext", "typeRoots": ["node_modules/@types", "node_modules/@ai-citizen/types"] }, "ts-node": { diff --git a/packages/graph/package.json b/packages/graph/package.json index b4ae7f08..0b63daf7 100644 --- a/packages/graph/package.json +++ b/packages/graph/package.json @@ -13,14 +13,22 @@ } }, "scripts": { - "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", - "test": "echo \"Error: no test specified\" && exit 1" + "clean": "rimraf dist", + "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json" }, "keywords": [], "author": "", "license": "ISC", - "dependencies": {}, + "dependencies": { + "@langchain/langgraph": "^0.0.31", + "@langchain/core": "^0.2.18", + "uuid": "^10.0.0" + }, "peerDependencies": { + "@ai-citizens/llm": "workspace:*", + "@ai-citizens/prompts": "workspace:*", + "@ai-citizens/utils": "workspace:*", + "@ai-citizens/tools": "workspace:*", "dotenv": "^16.4.5" }, "devDependencies": { diff --git a/packages/graph/tsconfig.json b/packages/graph/tsconfig.json index 73a12443..eb160a28 100644 --- a/packages/graph/tsconfig.json +++ b/packages/graph/tsconfig.json @@ -2,18 +2,18 @@ "compilerOptions": { "incremental": true, "target": "ESNext", - "module": "ESNext", + "module": "NodeNext", "declaration": true, "esModuleInterop": true, "outDir": "./dist/esm", "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "moduleResolution": "Bundler", + "moduleResolution": "NodeNext", "resolveJsonModule": true, "allowJs": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"] + "@ai-citizens/*": ["../*"] } }, "include": ["src/**/*"], diff --git a/packages/llm/package.json b/packages/llm/package.json index 138a0181..3b532eb5 100644 --- a/packages/llm/package.json +++ b/packages/llm/package.json @@ -13,8 +13,8 @@ } }, "scripts": { - "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", - "test": "echo \"Error: no test specified\" && exit 1" + "clean": "rimraf dist", + "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json" }, "keywords": [], "author": "", @@ -29,7 +29,5 @@ "peerDependencies": { "dotenv": "^16.4.5" }, - "devDependencies": { - "@types/node": "^18" - } + "devDependencies": {} } diff --git a/packages/llm/tsconfig.json b/packages/llm/tsconfig.json index 73a12443..cdb0f301 100644 --- a/packages/llm/tsconfig.json +++ b/packages/llm/tsconfig.json @@ -2,18 +2,18 @@ "compilerOptions": { "incremental": true, "target": "ESNext", - "module": "ESNext", + "module": "NodeNext", "declaration": true, "esModuleInterop": true, "outDir": "./dist/esm", "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "moduleResolution": "Bundler", + "moduleResolution": "NodeNext", "resolveJsonModule": true, "allowJs": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"] + "@ai-citizen/*": ["../*"] } }, "include": ["src/**/*"], diff --git a/packages/prompts/package.json b/packages/prompts/package.json index 3981f93b..c12aadeb 100644 --- a/packages/prompts/package.json +++ b/packages/prompts/package.json @@ -13,14 +13,15 @@ } }, "scripts": { - "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", - "test": "echo \"Error: no test specified\" && exit 1" + "clean": "rimraf dist", + "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json" }, "keywords": [], "author": "", "license": "ISC", "dependencies": {}, "peerDependencies": { + "@langchain/core": "^0.2.18", "dotenv": "^16.4.5" }, "devDependencies": { diff --git a/packages/prompts/tsconfig.json b/packages/prompts/tsconfig.json index 73a12443..3e53eb78 100644 --- a/packages/prompts/tsconfig.json +++ b/packages/prompts/tsconfig.json @@ -1,19 +1,20 @@ { "compilerOptions": { "incremental": true, + "types": ["node"], "target": "ESNext", - "module": "ESNext", + "module": "NodeNext", "declaration": true, "esModuleInterop": true, "outDir": "./dist/esm", "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "moduleResolution": "Bundler", + "moduleResolution": "NodeNext", "resolveJsonModule": true, "allowJs": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"] + "@ai-citizen/*": ["../*"] } }, "include": ["src/**/*"], diff --git a/packages/tools/package.json b/packages/tools/package.json index 452422f6..e002811e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,5 +1,5 @@ { - "name": "@ai-citizens/graph", + "name": "@ai-citizens/tools", "version": "0.0.0", "description": "", "type": "module", @@ -13,18 +13,23 @@ } }, "scripts": { - "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", - "test": "echo \"Error: no test specified\" && exit 1" + "clean": "rimraf dist", + "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { - "@ai-citizens/llm": "workspace:*" + "@ai-citizens/llm": "workspace:*", + "@ai-citizens/prompts": "workspace:*", + "@ai-citizens/utils": "workspace:*", + "@langchain/community": "^0.2.22", + "@langchain/core": "^0.2.18", + "youtube-transcript": "^1.2.1", + "youtubei.js": "^10.0.0" }, "peerDependencies": { - "dotenv": "^16.4.5", - "@langchain/community": "^0.2.22" + "dotenv": "^16.4.5" }, "devDependencies": { "@types/node": "^18" diff --git a/packages/tools/tsconfig.json b/packages/tools/tsconfig.json index 73a12443..de281007 100644 --- a/packages/tools/tsconfig.json +++ b/packages/tools/tsconfig.json @@ -2,18 +2,21 @@ "compilerOptions": { "incremental": true, "target": "ESNext", - "module": "ESNext", + "module": "NodeNext", "declaration": true, "esModuleInterop": true, "outDir": "./dist/esm", "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "moduleResolution": "Bundler", + "moduleResolution": "NodeNext", "resolveJsonModule": true, "allowJs": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"] + "@ai-citizen/*": ["../*"], + "@ai-citizens/graph": ["../graph/dist/esm"], + "@ai-citizens/utils": ["../utils/dist/esm"], + "@ai-citizens/prompts": ["../prompts/dist/esm"] } }, "include": ["src/**/*"], diff --git a/packages/ui/package.json b/packages/ui/package.json index f60d3e59..77830665 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -5,6 +5,7 @@ "type": "module", "scripts": { "dev": "vite", + "clean": "rimraf dist", "build": "tsc -b && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index 73a12443..a6bdfa7d 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -13,7 +13,7 @@ "allowJs": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"] + "@ai-citizen/*": ["../*"] } }, "include": ["src/**/*"], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8bfc739..9a2ddfba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,18 @@ importers: .: dependencies: - '@langchain/core': - specifier: ^0.2.18 - version: 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + '@ai-citizens/llm': + specifier: workspace:* + version: link:packages/llm + '@ai-citizens/prompts': + specifier: workspace:* + version: link:packages/prompts + '@ai-citizens/tools': + specifier: workspace:* + version: link:packages/tools + '@ai-citizens/utils': + specifier: workspace:* + version: link:packages/utils dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -20,19 +29,31 @@ importers: version: 2.27.7 '@types/node': specifier: ^18 - version: 18.19.42 + version: 18.19.43 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.7.4)(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.7.5)(@types/node@18.19.43)(typescript@5.5.4) typescript: specifier: ^5.5.4 version: 5.5.4 packages/cli: dependencies: + '@ai-citizens/graph': + specifier: workspace:* + version: link:../graph '@ai-citizens/llm': specifier: workspace:* version: link:../llm + '@ai-citizens/prompts': + specifier: workspace:* + version: link:../prompts + '@ai-citizens/tools': + specifier: workspace:* + version: link:../tools '@ai-citizens/utils': specifier: workspace:* version: link:../utils @@ -84,74 +105,109 @@ importers: version: 9.0.7 '@types/node': specifier: ^18 - version: 18.19.42 + version: 18.19.43 shx: specifier: ^0.3.3 version: 0.3.4 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.7.4)(@types/node@18.19.42)(typescript@5.5.4) + version: 10.9.2(@swc/core@1.7.5)(@types/node@18.19.43)(typescript@5.5.4) packages/graph: dependencies: + '@ai-citizens/llm': + specifier: workspace:* + version: link:../llm + '@ai-citizens/prompts': + specifier: workspace:* + version: link:../prompts + '@ai-citizens/tools': + specifier: workspace:* + version: link:../tools + '@ai-citizens/utils': + specifier: workspace:* + version: link:../utils + '@langchain/core': + specifier: ^0.2.18 + version: 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + '@langchain/langgraph': + specifier: ^0.0.31 + version: 0.0.31(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) dotenv: specifier: ^16.4.5 version: 16.4.5 + uuid: + specifier: ^10.0.0 + version: 10.0.0 devDependencies: '@types/node': specifier: ^18 - version: 18.19.42 + version: 18.19.43 packages/llm: dependencies: '@langchain/anthropic': specifier: ^0.2.10 - version: 0.2.12(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + version: 0.2.12 '@langchain/google-genai': specifier: ^0.0.23 - version: 0.0.23(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)(zod@3.23.8) + version: 0.0.23(zod@3.23.8) '@langchain/groq': specifier: ^0.0.15 - version: 0.0.15(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + version: 0.0.15 '@langchain/ollama': specifier: ^0.0.2 - version: 0.0.2(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + version: 0.0.2 '@langchain/openai': specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.12(openai@4.54.0)) + version: 0.2.5 dotenv: specifier: ^16.4.5 version: 16.4.5 - devDependencies: - '@types/node': - specifier: ^18 - version: 18.19.42 packages/prompts: dependencies: + '@langchain/core': + specifier: ^0.2.18 + version: 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) dotenv: specifier: ^16.4.5 version: 16.4.5 devDependencies: '@types/node': specifier: ^18 - version: 18.19.42 + version: 18.19.43 packages/tools: dependencies: '@ai-citizens/llm': specifier: workspace:* version: link:../llm + '@ai-citizens/prompts': + specifier: workspace:* + version: link:../prompts + '@ai-citizens/utils': + specifier: workspace:* + version: link:../utils '@langchain/community': specifier: ^0.2.22 - version: 0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0) + version: 0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0) + '@langchain/core': + specifier: ^0.2.18 + version: 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) dotenv: specifier: ^16.4.5 version: 16.4.5 + youtube-transcript: + specifier: ^1.2.1 + version: 1.2.1 + youtubei.js: + specifier: ^10.0.0 + version: 10.3.0 devDependencies: '@types/node': specifier: ^18 - version: 18.19.42 + version: 18.19.43 packages/ui: dependencies: @@ -176,7 +232,7 @@ importers: version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) '@vitejs/plugin-react-swc': specifier: ^3.5.0 - version: 3.7.0(vite@5.3.5(@types/node@18.19.42)) + version: 3.7.0(vite@5.3.5(@types/node@18.19.43)) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -191,13 +247,13 @@ importers: version: 5.5.4 vite: specifier: ^5.3.4 - version: 5.3.5(@types/node@18.19.42) + version: 5.3.5(@types/node@18.19.43) packages/utils: dependencies: '@types/node': specifier: ^18 - version: 18.19.42 + version: 18.19.43 typescript: specifier: ^5.5.4 version: 5.5.4 @@ -438,6 +494,10 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@google/generative-ai@0.7.1': resolution: {integrity: sha512-WTjMLLYL/xfA5BW6xAycRPiAX7FNHKAxrid/ayqC1QMam0KAK0NbMeS9Lubw80gVg5xFMLE+H7pw4wdNzTOlxw==} engines: {node: '>=18.0.0'} @@ -459,6 +519,10 @@ packages: resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} engines: {node: '>=18'} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -854,6 +918,15 @@ packages: resolution: {integrity: sha512-JN6dlPNHZEFKc8JjQzO+H7IqCpcE3s/1nYnb+sHxpc22Amr3yxXgp6CvanLhmD+R8Wj1AE1vG7AkzjM8MLtv+A==} engines: {node: '>=18'} + '@langchain/langgraph@0.0.31': + resolution: {integrity: sha512-f5QMSLy/RnLktsqnNm2mq8gp1xplHwQf87XIPVO0IYuumOJiafx5lE7ahPO+fVmCzAz6LxcsVocvD0JqxXR/2w==} + engines: {node: '>=18'} + peerDependencies: + better-sqlite3: ^9.5.0 + peerDependenciesMeta: + better-sqlite3: + optional: true + '@langchain/ollama@0.0.2': resolution: {integrity: sha512-RMgEensnUeL9+4/5Z2v8E2bjEazyq0THQtYEXF9M4cd2DRwIwq9KJmQMLwOqIZO4vNVWJd5Vn4v17ZRnikGytg==} engines: {node: '>=18'} @@ -956,6 +1029,10 @@ packages: engines: {node: '>=8.0.0'} deprecated: Deprecated in favor of @oclif/core + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@rollup/rollup-android-arm-eabi@4.19.2': resolution: {integrity: sha512-OHflWINKtoCFSpm/WmuQaWW4jeX+3Qt3XQDepkkiFTsoxFc5BpF3Z5aDxFZgBqRjO6ATP5+b1iilp4kGIZVWlA==} cpu: [arm] @@ -1036,68 +1113,68 @@ packages: cpu: [x64] os: [win32] - '@swc/core-darwin-arm64@1.7.4': - resolution: {integrity: sha512-RbWrdGh+x9xKFUA9/kPZRR8OPxUsDUuPyLjPIGLYZMO+ftht2vhVH7QsUq6lg+jAP34eIya72UA1isiZe+BRaA==} + '@swc/core-darwin-arm64@1.7.5': + resolution: {integrity: sha512-Y+bvW9C4/u26DskMbtQKT4FU6QQenaDYkKDi028vDIKAa7v1NZqYG9wmhD/Ih7n5EUy2uJ5I5EWD7WaoLzT6PA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.7.4': - resolution: {integrity: sha512-TxCWMJs4OrqApjFuT8cUiqMz0zg97F0JsXBEeZ7zjkyv9XJ/rN2pdwqMlZv0Wv2C2rivOPo6FsWYlZ3V8ZHhyA==} + '@swc/core-darwin-x64@1.7.5': + resolution: {integrity: sha512-AuIbDlcaAhYS6mtF4UqvXgrLeAfXZbVf4pgtgShPbutF80VbCQiIB55zOFz5aZdCpsBVuCWcBq0zLneK+VQKkQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.7.4': - resolution: {integrity: sha512-5IhwIJZAgkkfI6PqgQ3xk0/2hTAVsAczIPLiR2Epp30EgsNo1KIFL0ZHzrnvJPy5BZ3jy3T1dEbDE/memBOEmA==} + '@swc/core-linux-arm-gnueabihf@1.7.5': + resolution: {integrity: sha512-99uBPHITRqgGwCXAjHY94VaV3Z40+D2NQNgR1t6xQpO8ZnevI6YSzX6GVZfBnV7+7oisiGkrVEwfIRRa+1s8FA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.7.4': - resolution: {integrity: sha512-0787jri83jigf26mF8FndWehh7jqMaHwAm/OV6VdToyNo/g+d1AxVpkEizrywZK46el+AObnHUIHIHwZgO21LA==} + '@swc/core-linux-arm64-gnu@1.7.5': + resolution: {integrity: sha512-xHL3Erlz+OGGCG4h6K2HWiR56H5UYMuBWWPbbUufi2bJpfhuKQy/X3vWffwL8ZVfJmCUwr4/G91GHcm32uYzRg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.7.4': - resolution: {integrity: sha512-A45hGKWAGcjU5Ol0uQUoK0tHerwEKxfprYUZbmPLpD2yrpMZr+dTrwY2n075sixs7RuZEccBkgGNpehEe5BPBQ==} + '@swc/core-linux-arm64-musl@1.7.5': + resolution: {integrity: sha512-5ArGdqvFMszNHdi4a67vopeYq8d1K+FuTWDrblHrAvZFhAyv+GQz2PnKqYOgl0sWmQxsNPfNwBFtxACpUO3Jzg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.7.4': - resolution: {integrity: sha512-bcO1MpAm39TXqqHuYW4ox4vDvhB7jkguwMwxvmL+cKBGsUHrIoUTfGt9NM9N4D4CvOwULlxqbyt19veUJ7CVPw==} + '@swc/core-linux-x64-gnu@1.7.5': + resolution: {integrity: sha512-mSVVV/PFzCGtI1nVQQyx34NwCMgSurF6ZX/me8pUAX054vsE/pSFL66xN+kQOe/1Z/LOd4UmXFkZ/EzOSnYcSg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.7.4': - resolution: {integrity: sha512-N6nXuHyDO/q5kPN2xQxz5BEvhFpgnFSkP+9wxg5xWq+qIQL5bv37jk8dkKvMLx/8fHzTqrIjPDSRzVbcL7sqXg==} + '@swc/core-linux-x64-musl@1.7.5': + resolution: {integrity: sha512-09hY3ZKMUORXVunESKS9yuP78+gQbr759GKHo8wyCdtAx8lCZdEjfI5NtC7/1VqwfeE32/U6u+5MBTVhZTt0AA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.7.4': - resolution: {integrity: sha512-7W1owqCNR1cG+mpS55juiZlR/lrAdxB1pH32egeOipNKOLGwyqmlzQ0g9tkQTNgzwgfpCUg8z606+GqqXvajZw==} + '@swc/core-win32-arm64-msvc@1.7.5': + resolution: {integrity: sha512-B/UDtPI3RlYRFW42xQxOpl6kI/9LtkD7No+XeRIKQTPe15EP2o+rUlv7CmKljVBXgJ8KmaQbZlaEh1YP+QZEEQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.7.4': - resolution: {integrity: sha512-saLkY+q7zNPk4gYiUBCc93FYPo4ECXMjHcSPtLVHoPZBIxRrklgaAf6aDpblBo30nVdoBE2V3YPd0Y/cPiY6RQ==} + '@swc/core-win32-ia32-msvc@1.7.5': + resolution: {integrity: sha512-BgLesVGmIY6Nub/sURqtSRvWYcbCE/ACfuZB3bZHVKD6nsZJJuOpdB8oC41fZPyc8yZUzL3XTBIifkT2RP+w9w==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.7.4': - resolution: {integrity: sha512-zKF6jpRBNuVKgOf2W5dMcPyjwcNCp21syjl9lvLRbCeIg+1U+zjdoQCAmMWWoPNE7fLg+yfvohnnOJG2AdzQ9Q==} + '@swc/core-win32-x64-msvc@1.7.5': + resolution: {integrity: sha512-CnF557tidLfQRPczcqDJ8x+LBQYsFa0Ra6w2+YU1iFUboaI2jJVuqt3vEChu80y6JiRIBAaaV2L/GawDJh1dIQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.7.4': - resolution: {integrity: sha512-+wSycNxOw9QQz81AJAZlNS34EtOIifwUXMPACg05PWjECsjOKDTXLCVPx6J0lRaxhHSGBU2OYs9mRfIvxGt3CA==} + '@swc/core@1.7.5': + resolution: {integrity: sha512-qKK0/Ta4qvxs/ok3XyYVPT7OBenwRn1sSINf1cKQTBHPqr7U/uB4k2GTl6JgEs8H4PiJrMTNWfMLTucIoVSfAg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -1141,8 +1218,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@18.19.42': - resolution: {integrity: sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==} + '@types/node@18.19.43': + resolution: {integrity: sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==} '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -1268,6 +1345,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1280,6 +1361,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + ansicolors@0.3.2: resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} @@ -1502,6 +1587,9 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -1510,6 +1598,9 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -1667,6 +1758,10 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} @@ -1730,6 +1825,11 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -1937,11 +2037,18 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + jackspeak@4.0.1: + resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + engines: {node: 20 || >=22} + jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true + jintr@2.1.1: + resolution: {integrity: sha512-89cwX4ouogeDGOBsEVsVYsnWWvWjchmwXBB4kiBhmjOKw19FiOKhNhMhpxhTlK2ctl7DS+d/ethfmuBpzoNNgA==} + js-tiktoken@1.0.12: resolution: {integrity: sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ==} @@ -2228,6 +2335,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.0: + resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==} + engines: {node: 20 || >=22} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -2272,6 +2383,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2286,6 +2401,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -2531,6 +2650,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2569,6 +2691,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2687,6 +2813,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + rollup@4.19.2: resolution: {integrity: sha512-6/jgnN1svF9PjNYJ4ya3l+cqutg49vOZ4rVgsDKxdl+5gpGPnByFXWGyfH9YGx9i3nfBwSu1Iyu6vGwFFA0BdQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2791,6 +2922,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2798,6 +2933,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -2927,6 +3066,10 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3040,6 +3183,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3078,6 +3225,13 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} + youtube-transcript@1.2.1: + resolution: {integrity: sha512-TvEGkBaajKw+B6y91ziLuBLsa5cawgowou+Bk0ciGpjELDfAzSzTGXaZmeSSkUeknCPpEr/WGApOHDwV7V+Y9Q==} + engines: {node: '>=18.0.0'} + + youtubei.js@10.3.0: + resolution: {integrity: sha512-tLmeJCECK2xF2hZZtF2nEqirdKVNLFSDpa0LhTaXY3tngtL7doQXyy7M2CLueramDTlmCnFaW+rctHirTPFaRQ==} + zod-to-json-schema@3.23.2: resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} peerDependencies: @@ -3090,7 +3244,7 @@ snapshots: '@anthropic-ai/sdk@0.22.0': dependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.43 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -3371,6 +3525,8 @@ snapshots: '@eslint/js@8.57.0': {} + '@fastify/busboy@2.1.1': {} + '@google/generative-ai@0.7.1': {} '@humanwhocodes/config-array@0.11.14': @@ -3387,6 +3543,15 @@ snapshots: '@inquirer/figures@1.0.5': {} + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.0': {} @@ -3396,10 +3561,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@langchain/anthropic@0.2.12(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': + '@langchain/anthropic@0.2.12': dependencies: '@anthropic-ai/sdk': 0.22.0 - '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19 fast-xml-parser: 4.4.1 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3411,7 +3576,7 @@ snapshots: '@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0)': dependencies: '@anthropic-ai/sdk': 0.22.0 - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) fast-xml-parser: 4.4.1 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3420,22 +3585,25 @@ snapshots: - langchain - openai - '@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)': + '@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0)': dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) - '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0)) binary-extensions: 2.3.0 expr-eval: 2.0.2 flat: 5.0.2 js-yaml: 4.1.0 - langchain: 0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0) - langsmith: 0.1.40(xzehiv3ljp2f6jzrciipwzadji) + langchain: 0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0) + langsmith: 0.1.40(p32oeytzsqo3mlmoi5nwf67yli) uuid: 10.0.0 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) optionalDependencies: + '@langchain/langgraph': 0.0.31(langchain@0.2.12)(openai@4.54.0) ignore: 5.3.1 lodash: 4.17.21 + youtube-transcript: 1.2.1 + youtubei.js: 10.3.0 transitivePeerDependencies: - '@gomomento/sdk-web' - '@langchain/anthropic' @@ -3454,13 +3622,31 @@ snapshots: - peggy - pyodide - '@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0)': + '@langchain/core@0.2.19': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.40(xzehiv3ljp2f6jzrciipwzadji) + langsmith: 0.1.40(@langchain/core@0.2.19) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - langchain + - openai + + '@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0)': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.12 + langsmith: 0.1.40(p32oeytzsqo3mlmoi5nwf67yli) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -3508,30 +3694,48 @@ snapshots: - langchain - openai - '@langchain/google-genai@0.0.23(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)(zod@3.23.8)': + '@langchain/core@0.2.19(openai@4.54.0)': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.12 + langsmith: 0.1.40(@langchain/core@0.2.19(openai@4.54.0))(openai@4.54.0) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - langchain + - openai + + '@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8)': dependencies: '@google/generative-ai': 0.7.1 - '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - langchain - openai - zod - '@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8)': + '@langchain/google-genai@0.0.23(zod@3.23.8)': dependencies: '@google/generative-ai': 0.7.1 - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19 zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - langchain - openai - zod - '@langchain/groq@0.0.15(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': + '@langchain/groq@0.0.15': dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) - '@langchain/openai': 0.2.5(langchain@0.2.12(openai@4.54.0)) + '@langchain/core': 0.2.19 + '@langchain/openai': 0.2.5 groq-sdk: 0.3.3 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3542,8 +3746,8 @@ snapshots: '@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) - '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0)) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0)) groq-sdk: 0.3.3 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) @@ -3552,9 +3756,28 @@ snapshots: - langchain - openai - '@langchain/ollama@0.0.2(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': + '@langchain/langgraph@0.0.31(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': dependencies: '@langchain/core': 0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0) + uuid: 10.0.0 + zod: 3.23.8 + transitivePeerDependencies: + - langchain + - openai + + '@langchain/langgraph@0.0.31(langchain@0.2.12)(openai@4.54.0)': + dependencies: + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) + uuid: 10.0.0 + zod: 3.23.8 + transitivePeerDependencies: + - langchain + - openai + optional: true + + '@langchain/ollama@0.0.2': + dependencies: + '@langchain/core': 0.2.19 ollama: 0.5.6 uuid: 10.0.0 transitivePeerDependencies: @@ -3563,16 +3786,27 @@ snapshots: '@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) ollama: 0.5.6 uuid: 10.0.0 transitivePeerDependencies: - langchain - openai - '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))': + '@langchain/openai@0.2.5': dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(openai@4.54.0) + js-tiktoken: 1.0.12 + openai: 4.54.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - encoding + - langchain + + '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))': + dependencies: + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) js-tiktoken: 1.0.12 openai: 4.54.0 zod: 3.23.8 @@ -3602,10 +3836,11 @@ snapshots: transitivePeerDependencies: - encoding - langchain + optional: true - '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0)': + '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain @@ -3838,6 +4073,9 @@ snapshots: '@oclif/screen@1.0.4': {} + '@pkgjs/parseargs@0.11.0': + optional: true + '@rollup/rollup-android-arm-eabi@4.19.2': optional: true @@ -3886,51 +4124,51 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.19.2': optional: true - '@swc/core-darwin-arm64@1.7.4': + '@swc/core-darwin-arm64@1.7.5': optional: true - '@swc/core-darwin-x64@1.7.4': + '@swc/core-darwin-x64@1.7.5': optional: true - '@swc/core-linux-arm-gnueabihf@1.7.4': + '@swc/core-linux-arm-gnueabihf@1.7.5': optional: true - '@swc/core-linux-arm64-gnu@1.7.4': + '@swc/core-linux-arm64-gnu@1.7.5': optional: true - '@swc/core-linux-arm64-musl@1.7.4': + '@swc/core-linux-arm64-musl@1.7.5': optional: true - '@swc/core-linux-x64-gnu@1.7.4': + '@swc/core-linux-x64-gnu@1.7.5': optional: true - '@swc/core-linux-x64-musl@1.7.4': + '@swc/core-linux-x64-musl@1.7.5': optional: true - '@swc/core-win32-arm64-msvc@1.7.4': + '@swc/core-win32-arm64-msvc@1.7.5': optional: true - '@swc/core-win32-ia32-msvc@1.7.4': + '@swc/core-win32-ia32-msvc@1.7.5': optional: true - '@swc/core-win32-x64-msvc@1.7.4': + '@swc/core-win32-x64-msvc@1.7.5': optional: true - '@swc/core@1.7.4': + '@swc/core@1.7.5': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.12 optionalDependencies: - '@swc/core-darwin-arm64': 1.7.4 - '@swc/core-darwin-x64': 1.7.4 - '@swc/core-linux-arm-gnueabihf': 1.7.4 - '@swc/core-linux-arm64-gnu': 1.7.4 - '@swc/core-linux-arm64-musl': 1.7.4 - '@swc/core-linux-x64-gnu': 1.7.4 - '@swc/core-linux-x64-musl': 1.7.4 - '@swc/core-win32-arm64-msvc': 1.7.4 - '@swc/core-win32-ia32-msvc': 1.7.4 - '@swc/core-win32-x64-msvc': 1.7.4 + '@swc/core-darwin-arm64': 1.7.5 + '@swc/core-darwin-x64': 1.7.5 + '@swc/core-linux-arm-gnueabihf': 1.7.5 + '@swc/core-linux-arm64-gnu': 1.7.5 + '@swc/core-linux-arm64-musl': 1.7.5 + '@swc/core-linux-x64-gnu': 1.7.5 + '@swc/core-linux-x64-musl': 1.7.5 + '@swc/core-win32-arm64-msvc': 1.7.5 + '@swc/core-win32-ia32-msvc': 1.7.5 + '@swc/core-win32-x64-msvc': 1.7.5 '@swc/counter@0.1.3': {} @@ -3951,7 +4189,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.19.42 + '@types/node': 18.19.43 '@types/inquirer@9.0.7': dependencies: @@ -3962,12 +4200,12 @@ snapshots: '@types/node-fetch@2.6.11': dependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.43 form-data: 4.0.0 '@types/node@12.20.55': {} - '@types/node@18.19.42': + '@types/node@18.19.43': dependencies: undici-types: 5.26.5 @@ -3988,7 +4226,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.43 '@types/uuid@9.0.8': {} @@ -4075,10 +4313,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.0(vite@5.3.5(@types/node@18.19.42))': + '@vitejs/plugin-react-swc@3.7.0(vite@5.3.5(@types/node@18.19.43))': dependencies: - '@swc/core': 1.7.4 - vite: 5.3.5(@types/node@18.19.42) + '@swc/core': 1.7.5 + vite: 5.3.5(@types/node@18.19.43) transitivePeerDependencies: - '@swc/helpers' @@ -4115,6 +4353,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.0.1: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -4125,6 +4365,8 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + ansicolors@0.3.2: {} ansis@3.3.2: {} @@ -4347,12 +4589,16 @@ snapshots: dotenv@16.4.5: {} + eastasianwidth@0.2.0: {} + ejs@3.1.10: dependencies: jake: 10.9.2 emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -4575,6 +4821,11 @@ snapshots: flatted@3.3.1: {} + foreground-child@3.2.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + form-data-encoder@1.7.2: {} form-data@4.0.0: @@ -4635,6 +4886,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@11.0.0: + dependencies: + foreground-child: 3.2.1 + jackspeak: 4.0.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -4674,7 +4934,7 @@ snapshots: groq-sdk@0.3.3: dependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.43 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -4832,6 +5092,12 @@ snapshots: isexe@3.1.1: {} + jackspeak@4.0.1: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jake@10.9.2: dependencies: async: 3.2.5 @@ -4839,6 +5105,10 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jintr@2.1.1: + dependencies: + acorn: 8.12.1 + js-tiktoken@1.0.12: dependencies: base64-js: 1.5.1 @@ -4874,17 +5144,17 @@ snapshots: dependencies: json-buffer: 3.0.1 - langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0): + langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0): dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) - '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)) - '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0)) + '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.40(xzehiv3ljp2f6jzrciipwzadji) + langsmith: 0.1.40(p32oeytzsqo3mlmoi5nwf67yli) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -4894,12 +5164,14 @@ snapshots: zod-to-json-schema: 3.23.2(zod@3.23.8) optionalDependencies: '@langchain/anthropic': 0.2.12(langchain@0.2.12)(openai@4.54.0) - '@langchain/community': 0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0) + '@langchain/community': 0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0) '@langchain/google-genai': 0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8) '@langchain/groq': 0.0.15(langchain@0.2.12)(openai@4.54.0) '@langchain/ollama': 0.0.2(langchain@0.2.12)(openai@4.54.0) fast-xml-parser: 4.4.1 ignore: 5.3.1 + youtube-transcript: 1.2.1 + youtubei.js: 10.3.0 transitivePeerDependencies: - encoding - openai @@ -4984,7 +5256,7 @@ snapshots: langchain: 0.2.12(openai@4.54.0) openai: 4.54.0 - langsmith@0.1.40(xzehiv3ljp2f6jzrciipwzadji): + langsmith@0.1.40(@langchain/core@0.2.19(openai@4.54.0))(openai@4.54.0): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -4993,8 +5265,31 @@ snapshots: semver: 7.6.3 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0))(openai@4.54.0) - langchain: 0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0) + '@langchain/core': 0.2.19(openai@4.54.0) + openai: 4.54.0 + + langsmith@0.1.40(@langchain/core@0.2.19): + dependencies: + '@types/uuid': 9.0.8 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.6.3 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.2.19 + + langsmith@0.1.40(p32oeytzsqo3mlmoi5nwf67yli): + dependencies: + '@types/uuid': 9.0.8 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.6.3 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(openai@4.54.0) + langchain: 0.2.12(@langchain/anthropic@0.2.12(langchain@0.2.12)(openai@4.54.0))(@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0))(@langchain/google-genai@0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8))(@langchain/groq@0.0.15(langchain@0.2.12)(openai@4.54.0))(@langchain/ollama@0.0.2(langchain@0.2.12)(openai@4.54.0))(fast-xml-parser@4.4.1)(ignore@5.3.1)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0) openai: 4.54.0 levn@0.4.1: @@ -5045,6 +5340,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.0.0: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -5085,6 +5382,10 @@ snapshots: mimic-fn@4.0.0: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -5099,6 +5400,8 @@ snapshots: minimist@1.2.8: {} + minipass@7.1.2: {} + mkdirp-classic@0.5.3: {} ml-array-mean@1.1.6: @@ -5194,7 +5497,7 @@ snapshots: openai@4.54.0: dependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.43 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -5271,6 +5574,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -5304,6 +5609,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.0 + minipass: 7.1.2 + path-type@4.0.0: {} picocolors@1.0.1: {} @@ -5424,6 +5734,11 @@ snapshots: dependencies: glob: 7.2.3 + rimraf@6.0.1: + dependencies: + glob: 11.0.0 + package-json-from-dist: 1.0.0 + rollup@4.19.2: dependencies: '@types/estree': 1.0.5 @@ -5532,6 +5847,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -5540,6 +5861,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + strip-bom@3.0.0: {} strip-bom@4.0.0: {} @@ -5610,14 +5935,14 @@ snapshots: dependencies: typescript: 5.5.4 - ts-node@10.9.2(@swc/core@1.7.4)(@types/node@18.19.42)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.7.5)(@types/node@18.19.43)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.42 + '@types/node': 18.19.43 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -5628,7 +5953,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.7.4 + '@swc/core': 1.7.5 tslib@2.6.3: {} @@ -5654,6 +5979,10 @@ snapshots: undici-types@5.26.5: {} + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + universalify@0.1.2: {} uri-js@4.4.1: @@ -5675,13 +6004,13 @@ snapshots: validate-npm-package-name@5.0.1: {} - vite@5.3.5(@types/node@18.19.42): + vite@5.3.5(@types/node@18.19.43): dependencies: esbuild: 0.21.5 postcss: 8.4.40 rollup: 4.19.2 optionalDependencies: - '@types/node': 18.19.42 + '@types/node': 18.19.43 fsevents: 2.3.3 wcwidth@1.0.1: @@ -5738,6 +6067,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@3.0.3: @@ -5770,6 +6105,14 @@ snapshots: yoctocolors-cjs@2.1.2: {} + youtube-transcript@1.2.1: {} + + youtubei.js@10.3.0: + dependencies: + jintr: 2.1.1 + tslib: 2.6.3 + undici: 5.28.4 + zod-to-json-schema@3.23.2(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/tsconfig.base.json b/tsconfig.base.json index 831c1c7d..566ee6f5 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,5 +1,8 @@ { "compilerOptions": { + "paths": { + "@ai-citizen/*": ["./packages/*"] + }, "strict": true, "strictNullChecks": true, "esModuleInterop": true, @@ -9,6 +12,6 @@ "skipLibCheck": true, "sourceMap": true, "jsx": "react-jsx", - "moduleResolution": "node" + "moduleResolution": "NodeNext" } } diff --git a/tsconfig.json b/tsconfig.json index ffcbb947..57bfd21e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,11 @@ { - "extends": "./tsconfig.base.json" + "extends": "./tsconfig.base.json", + "references": [ + { "path": "packages/llm" }, + { "path": "packages/prompts" }, + { "path": "packages/graph" }, + { "path": "packages/utils" }, + { "path": "packages/tools" }, + { "path": "packages/cli" } + ] } From cdc07bb99aaeb99224ce4d8106276f93848fbdfb Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Fri, 2 Aug 2024 14:14:29 -0700 Subject: [PATCH 08/18] update files for monorepo --- packages/cli/src/commands/test/graph.ts | 37 +++ packages/graph/src/examples/graph-example.ts | 89 ++++++ packages/graph/src/examples/moa.ts | 272 ++++++++++++++++++ packages/graph/src/index.ts | 1 + packages/graph/src/reducers/index.ts | 0 packages/graph/src/youtube-parser/README.md | 172 +++++++++++ packages/graph/src/youtube-parser/index.ts | 1 + .../src/youtube-parser/youtube-parser.ts | 173 +++++++++++ packages/prompts/src/index.ts | 1 + packages/tools/src/enhance/index.ts | 1 + packages/tools/src/enhance/transform-query.ts | 46 +++ packages/tools/src/index.ts | 3 + packages/tools/src/process/extract-links.ts | 30 +- packages/tools/src/process/index.ts | 2 + .../tools/src/process/parse-transcript.ts | 9 +- packages/tools/src/retrieve/fetch-github.ts | 23 +- packages/tools/src/retrieve/fetch-youtube.ts | 2 +- packages/tools/src/retrieve/index.ts | 2 + packages/tools/src/retrieve/quick-scrape.ts | 25 ++ packages/tools/src/retrieve/scrape-website.ts | 24 -- packages/tools/transform-query.ts | 38 --- 21 files changed, 862 insertions(+), 89 deletions(-) create mode 100644 packages/cli/src/commands/test/graph.ts create mode 100644 packages/graph/src/examples/graph-example.ts create mode 100644 packages/graph/src/examples/moa.ts create mode 100644 packages/graph/src/reducers/index.ts create mode 100644 packages/graph/src/youtube-parser/README.md create mode 100644 packages/graph/src/youtube-parser/index.ts create mode 100644 packages/graph/src/youtube-parser/youtube-parser.ts create mode 100644 packages/prompts/src/index.ts create mode 100644 packages/tools/src/enhance/index.ts create mode 100644 packages/tools/src/enhance/transform-query.ts create mode 100644 packages/tools/src/index.ts create mode 100644 packages/tools/src/process/index.ts create mode 100644 packages/tools/src/retrieve/index.ts create mode 100644 packages/tools/src/retrieve/quick-scrape.ts delete mode 100644 packages/tools/src/retrieve/scrape-website.ts delete mode 100644 packages/tools/transform-query.ts diff --git a/packages/cli/src/commands/test/graph.ts b/packages/cli/src/commands/test/graph.ts new file mode 100644 index 00000000..d2d9a573 --- /dev/null +++ b/packages/cli/src/commands/test/graph.ts @@ -0,0 +1,37 @@ +import { Args, Command, Flags } from "@oclif/core"; +import { processYouTubeVideo } from "@ai-citizens/graph"; + +export default class TestGraph extends Command { + static override args = { + file: Args.string({ description: "file to read" }), + }; + + static override description = "describe the command here"; + + static override examples = ["<%= config.bin %> <%= command.id %>"]; + + static override flags = { + // flag with no value (-f, --force) + force: Flags.boolean({ char: "f" }), + // flag with a value (-n, --name=VALUE) + name: Flags.string({ char: "n", description: "name to print" }), + }; + + public async run(): Promise<void> { + const { args, flags } = await this.parse(TestGraph); + + const name = flags.name ?? "world"; + this.log( + `hello ${name} from /Users/joshua/dev/acai-monorepo/packages/cli/src/commands/test/graph.ts` + ); + if (args.file && flags.force) { + this.log(`you input --force and --file: ${args.file}`); + } + + const transcript = await processYouTubeVideo( + "https://www.youtube.com/watch?v=dQw4w9WgXcQ" + ); + + console.log(transcript); + } +} diff --git a/packages/graph/src/examples/graph-example.ts b/packages/graph/src/examples/graph-example.ts new file mode 100644 index 00000000..21fce071 --- /dev/null +++ b/packages/graph/src/examples/graph-example.ts @@ -0,0 +1,89 @@ +// import { RunnableConfig } from "@langchain/core/runnables"; +// import { +// END, +// MemorySaver, +// START, +// StateGraph, +// StateGraphArgs, +// } from "@langchain/langgraph"; + +// interface IState { +// input: number; +// results?: number; +// } + +// const graphState: StateGraphArgs<IState>["channels"] = { +// input: { +// default: () => 0, +// value: (prev?: number, next?: number) => next ?? prev ?? 0, +// }, +// results: { +// default: () => 0, +// value: (prev?: number, next?: number) => next ?? prev ?? 0, +// }, +// }; + +// function doubleNode(state: IState, config?: RunnableConfig) { +// console.log(config); +// const { input } = state; +// return { results: input * 2 }; +// } + +// function randomNode(state: IState, config?: RunnableConfig) { +// console.log(config); +// return { results: Math.random() * state.input }; +// } + +// function randomDivide(state: IState, config?: RunnableConfig) { +// console.log(config); +// const random = Math.random(); +// if (random === 0) { +// return { results: 0 }; +// } + +// return { results: state.input / random }; +// } + +// function continueProgram(state: IState) { +// if (state.results && state.results > 75) { +// console.log("Continuing program"); +// return "double"; +// } + +// return END; +// } + +// // doubles the input, then randomly multiplies, then randomly divides +// // if output is greater than 75 after final node, go back to double and start over +// const mathGraph = new StateGraph<IState>({ +// channels: graphState, +// }) +// // add the nodes +// .addNode("double", doubleNode) +// .addNode("random", randomNode) +// .addNode("randomDivide", randomDivide) +// // set the entry point from START +// .addEdge(START, "double") +// .addEdge("double", "random") +// .addEdge("random", "randomDivide") +// // the conditional edge runs and navigates to the END node if the number is greater than 75 +// .addConditionalEdges("randomDivide", continueProgram); + +// // Initialize any compatible CheckPointSaver +// const memory = new MemorySaver(); +// const persistentMathGraph = mathGraph.compile({ checkpointer: memory }); + +// // using the thread_id we can re run certain nodes using the state as it was in memory at that time + +// const config = { configurable: { thread_id: "1234" }, recursionLimit: 50 }; +// const inputs = { +// input: 20, +// }; + +// for await (const event of await persistentMathGraph.stream(inputs, config)) { +// console.log(event); +// } + +// // export default persistentMathGraph + +// // // https://smith.langchain.com/public/ae46dfc9-05ca-49cd-8beb-4d040518c3ec/r diff --git a/packages/graph/src/examples/moa.ts b/packages/graph/src/examples/moa.ts new file mode 100644 index 00000000..0ae1584a --- /dev/null +++ b/packages/graph/src/examples/moa.ts @@ -0,0 +1,272 @@ +import { StringOutputParser } from "@langchain/core/output_parsers"; +import { PromptTemplate } from "@langchain/core/prompts"; +import { END, START, StateGraph, StateGraphArgs } from "@langchain/langgraph"; +import { v4 as uuidv4 } from "uuid"; +import { + anthropicModel, + getModel, + googleModel, + groqModel, + ollamaModel, +} from "@ai-citizens/llm"; + +const parser = new StringOutputParser(); +// @TODO: Update to be data driven +// Define the state interfaces +interface MoAState { + aggregatorResponses: { id: string; response: string }[][]; + finalResponse: string; + inputPrompt: string; + proposerResponses: { id: string; response: string }[]; +} + +// Reducer for string properties +export function stringReducer(left: string = "", right?: string): string { + return right ?? left; +} + +// Reducer for array of objects +//example: [{id: "a", response: "b"}, {id: "c", response: "d"}] => [{id: "a", response: "b"}, {id: "c", response: "d"}] +export function objectArrayReducer( + left: { id: string; response: string }[] = [], + right?: { id: string; response: string }[] +): { id: string; response: string }[] { + const leftIdxById: Record<string, number> = {}; + for (const [i, val] of left.entries()) { + leftIdxById[val.id] = i; + } + + const merged = [...left]; + if (right) + for (const val of right) { + const existingIdx = leftIdxById[val.id]; + if (existingIdx === undefined) { + merged.push(val); + } else { + merged[existingIdx] = val; + } + } + + return merged; +} + +// Reducer for array of arrays +//example: [["a", "b"], ["c", "d"]] => ["a", "b", "c", "d"] +export function arrayOfArraysReducer( + left: { id: string; response: string }[][] = [], + right?: { id: string; response: string }[][] +): { id: string; response: string }[][] { + if (!right) return left; + return [...left, ...right]; +} + +export const arrayReducer = (left: any[] = [], right?: any[]): any[] => { + return [...left, ...right]; +}; +// Update the graphState with specific reducers +const graphState: StateGraphArgs<MoAState>["channels"] = { + aggregatorResponses: { + default: () => [], + value: arrayOfArraysReducer, + }, + finalResponse: { + default: () => "", + value: stringReducer, + }, + inputPrompt: { + default: () => "", + value: stringReducer, + }, + proposerResponses: { + default: () => [], + value: arrayReducer, + }, +}; +async function generateResponseWithModel1(prompt: string): Promise<string> { + const model = await getModel({ model: "gpt-4o" }); + + const response = await model.invoke(prompt); + + const parsedResponse = await parser.invoke(response); + + return parsedResponse; +} + +async function generateResponseWithModel2(prompt: string): Promise<string> { + const model = googleModel({}); + + const response = await model.invoke(prompt); + + const parsedResponse = await parser.invoke(response); + + return parsedResponse; +} + +async function generateResponseWithModel3(prompt: string): Promise<string> { + const model = anthropicModel({}); + + const response = await model.invoke(prompt); + + const parsedResponse = await parser.invoke(response); + + return parsedResponse; +} + +async function generateResponseWithModel4(prompt: string): Promise<string> { + const model = groqModel({ model: "gemma-7b-it" }); + + const response = await model.invoke(prompt); + + const parsedResponse = await parser.invoke(response); + + return parsedResponse; +} + +const template = ` +You are an AI assistant tasked with synthesizing multiple responses into a single coherent response. Your goal is to analyze the given responses, extract the most relevant information, and generate a comprehensive and well-structured response. +Here are the responses you need to synthesize: +{responses} +Please provide a synthesized response that combines the key points from the given responses while maintaining clarity and coherence. The synthesized response should be in your own words and not exceed 200 words. +`; +const promptTemplate = new PromptTemplate({ + inputVariables: ["responses"], + template, +}); +// Function to synthesize responses from multiple sources +async function synthesizeResponses(responses: string[]): Promise<string> { + const model = anthropicModel({ + model: "claude-3-haiku-20240307", + }); + const formattedResponses = responses + .map((response, index) => `Response ${index + 1}: ${response}`) + .join("\n"); + const prompt = await promptTemplate.format({ responses: formattedResponses }); + const gradingResponse = await model.invoke(prompt); + const synthesizedResponse = await parser.invoke(gradingResponse); + return synthesizedResponse; +} + +async function secondSynthesisResponse(responses: string[]): Promise<string> { + const model = groqModel({ model: "gemma2-9b-it" }); + const formattedResponses = responses + .map((response, index) => `Response ${index + 1}: ${response}`) + .join("\n"); + const prompt = await promptTemplate.format({ responses: formattedResponses }); + const gradingResponse = await model.invoke(prompt); + const synthesizedResponse = await parser.invoke(gradingResponse); + return synthesizedResponse; +} + +async function finalSynthesizedResponse(responses: string[]): Promise<string> { + const model = await ollamaModel({ model: "llama3.1" }); + const formattedResponses = responses + .map((response, index) => `Response ${index + 1}: ${response}`) + .join("\n"); + const prompt = await promptTemplate.format({ responses: formattedResponses }); + const gradingResponse = await model.invoke(prompt); + const synthesizedResponse = await parser.invoke(gradingResponse); + return synthesizedResponse; +} + +// Define the proposer graph +const proposerBuilder = new StateGraph<MoAState>({ channels: graphState }); +proposerBuilder + .addNode("proposerAgent1", async (state) => { + const response = await generateResponseWithModel1(state.inputPrompt); + return { + proposerResponses: [{ id: uuidv4(), response }], + }; + }) + .addNode("proposerAgent2", async (state) => { + const response = await generateResponseWithModel2(state.inputPrompt); + return { + proposerResponses: [{ id: uuidv4(), response }], + }; + }) + .addNode("proposerAgent3", async (state) => { + const response = await generateResponseWithModel3(state.inputPrompt); + return { + proposerResponses: [{ id: uuidv4(), response }], + }; + }) + .addNode("proposerAgent4", async (state) => { + const response = await generateResponseWithModel4(state.inputPrompt); + return { + proposerResponses: [{ id: uuidv4(), response }], + }; + }) + .addEdge(START, "proposerAgent1") + .addEdge(START, "proposerAgent2") + .addEdge(START, "proposerAgent3") + .addEdge(START, "proposerAgent4") + .addEdge("proposerAgent1", END) + .addEdge("proposerAgent2", END) + .addEdge("proposerAgent3", END) + .addEdge("proposerAgent4", END); + +// Define the aggregator graph +const aggregatorBuilder = new StateGraph<MoAState>({ channels: graphState }); +aggregatorBuilder + .addNode("aggregatorAgent1", async (state) => { + const synthesizedResponse = await synthesizeResponses( + state.proposerResponses.map((r) => r.response) + ); + return { + aggregatorResponses: [[{ id: uuidv4(), response: synthesizedResponse }]], + }; + }) + .addNode("aggregatorAgent2", async (state) => { + const synthesizedResponse = await secondSynthesisResponse( + state.proposerResponses.map((r) => r.response) + ); + return { + aggregatorResponses: [[{ id: uuidv4(), response: synthesizedResponse }]], + }; + }) + .addNode("finalAggregator", async (state) => { + const allResponses = state.aggregatorResponses + .flat() + .map((r) => r.response); + const finalResponse = await finalSynthesizedResponse(allResponses); + return { + finalResponse, + }; + }) + .addEdge(START, "aggregatorAgent1") + .addEdge(START, "aggregatorAgent2") + .addEdge("aggregatorAgent1", "finalAggregator") + .addEdge("aggregatorAgent2", "finalAggregator") + .addEdge("finalAggregator", END); + +// Define the parent graph +const parentBuilder = new StateGraph<MoAState>({ channels: graphState }); +parentBuilder + .addNode("proposer", proposerBuilder.compile()) + .addNode("aggregator", aggregatorBuilder.compile()) + .addEdge(START, "proposer") + .addEdge("proposer", "aggregator") + .addEdge("aggregator", END); + +const graph = parentBuilder.compile(); + +// // Set the input prompt +// const initialState: Partial<MoAState> = { +// inputPrompt: 'Who is the Muffin Man?', +// } + +// // Run the graph +// const finalState = await graph.invoke(initialState) + +// // Get the final output +// const {finalResponse} = finalState + +// console.log('Final output:', finalResponse) +// // console.log('Final state:', finalState) + +export const moaResponse = async (prompt: string) => { + const initialState: Partial<MoAState> = { + inputPrompt: prompt, + }; + const { finalResponse } = await graph.invoke(initialState); + return finalResponse; +}; diff --git a/packages/graph/src/index.ts b/packages/graph/src/index.ts index e69de29b..2b22c579 100644 --- a/packages/graph/src/index.ts +++ b/packages/graph/src/index.ts @@ -0,0 +1 @@ +export * from "./youtube-parser/index.js"; diff --git a/packages/graph/src/reducers/index.ts b/packages/graph/src/reducers/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/graph/src/youtube-parser/README.md b/packages/graph/src/youtube-parser/README.md new file mode 100644 index 00000000..3be6a477 --- /dev/null +++ b/packages/graph/src/youtube-parser/README.md @@ -0,0 +1,172 @@ +```ts +import { END, START, StateGraph, StateGraphArgs } from "@langchain/langgraph"; +import { BaseMessage } from "@langchain/core/messages"; +import { IterableReadableStream } from "@langchain/core/utils/stream"; + +// Define the YouTube video state interface +interface YouTubeVideoState { + title: string; + description: string; + summary: string; + relatedUrls: string[]; + url: string; + highlights: string[]; + transcription: string; + /* + messages field for potential LLM interactions + */ + messages: BaseMessage[]; + error: string; +} + +const stringReducer = (prev: string = "", next?: string): string => + next ?? prev; +const arrayReducer = <T>(prev: T[] = [], next?: T[]): T[] => { + if (!next) return prev; + return [...prev, ...next]; +}; +// Update the graphState with specific reducers for YouTube video state +const youtubeGraphState: StateGraphArgs<YouTubeVideoState>["channels"] = { + title: { + default: () => "", + value: stringReducer, + }, + description: { + default: () => "", + value: stringReducer, + }, + summary: { + default: () => "", + value: stringReducer, + }, + relatedUrls: { + default: () => [], + value: (prev: string[] = [], next?: string[]): string[] => { + if (!next) return prev; + return [...new Set([...prev, ...next])]; + }, + }, + url: { + default: () => "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + value: stringReducer, + }, + highlights: { + default: () => [], + value: arrayReducer, + }, + transcription: { + default: () => "", + value: (prev: string = "", next?: string): string => next ?? prev, + }, + messages: { + default: () => [], + value: arrayReducer, + }, + error: { + default: () => "", + value: stringReducer, + }, +}; + +// Define the YouTube graph +const youtubeGraphBuilder = new StateGraph<YouTubeVideoState>({ + channels: youtubeGraphState, +}); + +youtubeGraphBuilder + .addNode("getMetadata", async (state) => { + console.log("getMetadata", state); + // Fetch metadata (title, url, etc.) from YouTube API + // Return updated state or catch error to send to handleError node + // if error { + // return { + // error: "Error in processing video metadata", + // }; + // } + return { + title: "Test Title", + description: "Test Description", + url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + transcription: "Test Transcription", + }; + }) + .addNode("getRelatedUrls", async (state) => { + console.log("getRelatedUrls", state); + // Fetch related URLs + // Return updated state + return { + relatedUrls: ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], + }; + }) + .addNode("extractHighlights", async (state) => { + console.log("extractHighlights", state); + // Extract highlights from video content + // Return updated state + return { + highlights: ["Highlight 1", "Highlight 2"], + }; + }) + .addNode("generateSummary", async (state) => { + console.log("generateSummary", state); + // Generate summary of the video + // Return updated state + return { + summary: "Test Summary", + }; + }) + .addNode("handleMissingTranscription", async (state) => { + console.log("Error in processing video metadata"); + // @TODO: will use a more brute force method by ripping the audio from the video and transcribing ourselves + // we still want the meta data from the video though and will need to process in some capacity + return { + title: "Test Title", + description: "Test Description", + url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + transcription: "Brute Forced Test Transcription", + }; + }) + .addEdge(START, "getMetadata") + .addEdge("getMetadata", "getRelatedUrls") + .addEdge("getMetadata", "extractHighlights") + .addEdge("getMetadata", "generateSummary") + .addEdge("getRelatedUrls", END) + .addEdge("extractHighlights", END) + .addEdge("generateSummary", END) + .addEdge("handleMissingTranscription", "getRelatedUrls") + .addEdge("handleMissingTranscription", "extractHighlights") + .addEdge("handleMissingTranscription", "generateSummary") + .addConditionalEdges("getMetadata", (state) => { + // Example condition: if title is empty, go to error handling node + // else move to the next nodes + return state.title + ? ["getRelatedUrls", "extractHighlights", "generateSummary"] + : "handleMissingTranscription"; + }); +const youtubeGraph = youtubeGraphBuilder.compile(); + +export const processYouTubeVideo = async ( + videoUrl: string, + config?: { configurable: { thread_id: string } } +): Promise<YouTubeVideoState> => { + const initialState: Partial<YouTubeVideoState> = { + url: videoUrl, + }; + const finalState = await youtubeGraph.invoke(initialState, config); + return finalState; +}; + +// Example of how to use streaming +export const streamYouTubeVideoProcessing = async ( + videoUrl: string, + config?: { configurable: { thread_id: string } } +): Promise<IterableReadableStream<YouTubeVideoState>> => { + const initialState: Partial<YouTubeVideoState> = { + url: videoUrl, + }; + const stream = await youtubeGraph.stream(initialState, { + ...config, + configurable: { ...config?.configurable, stream_events: true }, + }); + return stream; +}; +``` diff --git a/packages/graph/src/youtube-parser/index.ts b/packages/graph/src/youtube-parser/index.ts new file mode 100644 index 00000000..70f87dd1 --- /dev/null +++ b/packages/graph/src/youtube-parser/index.ts @@ -0,0 +1 @@ +export { processYouTubeVideo } from "./youtube-parser.js"; diff --git a/packages/graph/src/youtube-parser/youtube-parser.ts b/packages/graph/src/youtube-parser/youtube-parser.ts new file mode 100644 index 00000000..343f2262 --- /dev/null +++ b/packages/graph/src/youtube-parser/youtube-parser.ts @@ -0,0 +1,173 @@ +import { END, START, StateGraph, StateGraphArgs } from "@langchain/langgraph"; +import { BaseMessage } from "@langchain/core/messages"; +// import { IterableReadableStream } from "@langchain/core/"; +import { fetchYoutube } from "@ai-citizens/tools"; +// Define the YouTube video state interface +interface YouTubeVideoState { + title: string; + description: string; + summary: string; + relatedUrls: string[]; + url: string; + highlights: string[]; + transcription: string; + /* + messages field for potential LLM interactions + */ + messages: BaseMessage[]; + error: string; +} + +const stringReducer = (prev: string = "", next?: string): string => + next ?? prev; +const arrayReducer = <T>(prev: T[] = [], next?: T[]): T[] => { + if (!next) return prev; + return [...prev, ...next]; +}; +// Update the graphState with specific reducers for YouTube video state +const youtubeGraphState: StateGraphArgs<YouTubeVideoState>["channels"] = { + title: { + default: () => "", + value: stringReducer, + }, + description: { + default: () => "", + value: stringReducer, + }, + summary: { + default: () => "", + value: stringReducer, + }, + relatedUrls: { + default: () => [], + value: (prev: string[] = [], next?: string[]): string[] => { + if (!next) return prev; + return [...new Set([...prev, ...next])]; + }, + }, + url: { + default: () => "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + value: stringReducer, + }, + highlights: { + default: () => [], + value: arrayReducer, + }, + transcription: { + default: () => "", + value: (prev: string = "", next?: string): string => next ?? prev, + }, + messages: { + default: () => [], + value: arrayReducer, + }, + error: { + default: () => "", + value: stringReducer, + }, +}; + +// Define the YouTube graph +const youtubeGraphBuilder = new StateGraph<YouTubeVideoState>({ + channels: youtubeGraphState, +}); + +youtubeGraphBuilder + .addNode("getMetadata", async (state) => { + console.log("getMetadata", state); + // Fetch metadata (title, url, etc.) from YouTube API + const metadata = await fetchYoutube(state.url); + console.log("metadata", metadata); + // Return updated state or catch error to send to handleError node + // if error { + // return { + // error: "Error in processing video metadata", + // }; + // } + return { + title: "Test Title", + description: "Test Description", + url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + transcription: "Test Transcription", + }; + }) + .addNode("getRelatedUrls", async (state) => { + console.log("getRelatedUrls", state); + // Fetch related URLs + // Return updated state + return { + relatedUrls: ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], + }; + }) + .addNode("extractHighlights", async (state) => { + console.log("extractHighlights", state); + // Extract highlights from video content + // Return updated state + return { + highlights: ["Highlight 1", "Highlight 2"], + }; + }) + .addNode("generateSummary", async (state) => { + console.log("generateSummary", state); + // Generate summary of the video + // Return updated state + return { + summary: "Test Summary", + }; + }) + .addNode("handleMissingTranscription", async (state) => { + console.log("Error in processing video metadata"); + return { + messages: [ + { + type: "user", + content: `I had this error ${state.messages}`, + }, + ], + }; + }) + .addEdge(START, "getMetadata") + .addEdge("getMetadata", "getRelatedUrls") + .addEdge("getMetadata", "extractHighlights") + .addEdge("getMetadata", "generateSummary") + .addEdge("getRelatedUrls", END) + .addEdge("extractHighlights", END) + .addEdge("generateSummary", END) + .addEdge("handleMissingTranscription", "getRelatedUrls") + .addEdge("handleMissingTranscription", "extractHighlights") + .addEdge("handleMissingTranscription", "generateSummary") + .addConditionalEdges("getMetadata", (state) => { + // @TODO: Need to fire additional logic if the transcription is empty + // Example condition: if title is empty, go to error handling node + // else move to the next nodes + return state.title + ? ["getRelatedUrls", "extractHighlights", "generateSummary"] + : "handleMissingTranscription"; + }); +const youtubeGraph = youtubeGraphBuilder.compile(); + +export const processYouTubeVideo = async ( + videoUrl?: string, + config?: { configurable: { thread_id: string } } +): Promise<YouTubeVideoState> => { + const initialState: Partial<YouTubeVideoState> = { + url: videoUrl || "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + }; + const finalState = await youtubeGraph.invoke(initialState, config); + return finalState; +}; + +// Example of how to use streaming +// export const streamYouTubeVideoProcessing = async ( +// videoUrl: string, +// config?: { configurable: { thread_id: string } } +// ): Promise<IterableReadableStream<YouTubeVideoState>> => { +// const initialState: Partial<YouTubeVideoState> = { +// url: videoUrl, +// }; +// const stream = await youtubeGraph.stream(initialState, { +// ...config, +// configurable: { ...config?.configurable, stream_events: true }, +// }); +// return stream; +// }; diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts new file mode 100644 index 00000000..b07b07c8 --- /dev/null +++ b/packages/prompts/src/index.ts @@ -0,0 +1 @@ +export * from "./templates/index.js"; diff --git a/packages/tools/src/enhance/index.ts b/packages/tools/src/enhance/index.ts new file mode 100644 index 00000000..00686b57 --- /dev/null +++ b/packages/tools/src/enhance/index.ts @@ -0,0 +1 @@ +export * from "./transform-query.js"; diff --git a/packages/tools/src/enhance/transform-query.ts b/packages/tools/src/enhance/transform-query.ts new file mode 100644 index 00000000..e518d433 --- /dev/null +++ b/packages/tools/src/enhance/transform-query.ts @@ -0,0 +1,46 @@ +import { StringOutputParser } from "@langchain/core/output_parsers"; +import { ChatPromptTemplate } from "@langchain/core/prompts"; +// import {ChatOpenAI} from '@langchain/openai' +/** + * Transform the query to produce a better question. + * + * @param {GraphState} state: {question: string} The current state of the graph. + * @returns {Promise} The new state object. + */ +export async function transformQuery({ + state, + model, +}: { + state: { question: string }; + // @ts-expect-error need to fix types + model: Model; +}): Promise<{ question: string; improvedQuestion: string }> { + const { question } = state; + // console.log('---TRANSFORM QUERY---') + // Pull in the prompt + const prompt = ChatPromptTemplate.fromTemplate( + `You are generating a question that is well optimized for semantic search retrieval. + Look at the input and try to reason about the underlying sematic intent / meaning. + Here is the initial question: + \n ------- \n + {question} + \n ------- \n + Formulate an improved question: ` + ); + + // // Grader + // const model = new ChatOpenAI({ + // modelName: "gpt-4-0125-preview", + // streaming: true, + // temperature: 0, + // }); + + // Prompt + const chain = prompt.pipe(model).pipe(new StringOutputParser()); + const betterQuestion = await chain.invoke({ question }); + + return { + question, + improvedQuestion: betterQuestion, + }; +} diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts new file mode 100644 index 00000000..df1966fb --- /dev/null +++ b/packages/tools/src/index.ts @@ -0,0 +1,3 @@ +export * from "./retrieve/index.js"; +export * from "./process/index.js"; +export * from "./enhance/index.js"; diff --git a/packages/tools/src/process/extract-links.ts b/packages/tools/src/process/extract-links.ts index 298126df..10b689f1 100644 --- a/packages/tools/src/process/extract-links.ts +++ b/packages/tools/src/process/extract-links.ts @@ -1,14 +1,20 @@ -import {StringOutputParser} from '@langchain/core/output_parsers' +import { StringOutputParser } from "@langchain/core/output_parsers"; -import modelManager from '../model-manager.js' -import {extractRelevantLinks} from '../prompts/index.js' +import { getModel, isAllModel } from "@ai-citizens/llm"; +import { extractRelevantLinks } from "@ai-citizens/prompts"; -export const run = async (content: string) => { - const llm = modelManager.anthropicModel({ - model: 'claude-3-5-sonnet-20240620', - }) - const prompt = extractRelevantLinks - const chain = prompt.pipe(llm).pipe(new StringOutputParser()) - const response = await chain.invoke({content}) - return response -} +export const extractLinks = async ( + content: string, + model: string = "claude-3-5-sonnet-20240620" +) => { + if (!isAllModel(model)) { + throw new Error(`Invalid model ${model}`); + } + const llm = await getModel({ + model, + }); + const prompt = extractRelevantLinks; + const chain = prompt.pipe(llm).pipe(new StringOutputParser()); + const response = await chain.invoke({ content }); + return response; +}; diff --git a/packages/tools/src/process/index.ts b/packages/tools/src/process/index.ts new file mode 100644 index 00000000..f21dffdc --- /dev/null +++ b/packages/tools/src/process/index.ts @@ -0,0 +1,2 @@ +export * from "./extract-links.js"; +export * from "./parse-transcript.js"; diff --git a/packages/tools/src/process/parse-transcript.ts b/packages/tools/src/process/parse-transcript.ts index 7ec92d53..4eb34be1 100644 --- a/packages/tools/src/process/parse-transcript.ts +++ b/packages/tools/src/process/parse-transcript.ts @@ -1,14 +1,15 @@ import { StringOutputParser } from "@langchain/core/output_parsers"; -import modelManager from "../model-manager.js"; -import { analyzeTranscriptTemplate } from "../prompts/analyze-transcript.js"; +import { getModel } from "@ai-citizens/llm"; +import { analyzeTranscriptTemplate } from "@ai-citizens/prompts"; -export const run = async (transcript: string) => { - const llm = getModel({ +export const parseTranscript = async (transcript: string) => { + const llm = await getModel({ model: "gpt-4o", }); const prompt = analyzeTranscriptTemplate; const chain = prompt.pipe(llm).pipe(new StringOutputParser()); + const response = await chain.invoke({ transcript }); return response; }; diff --git a/packages/tools/src/retrieve/fetch-github.ts b/packages/tools/src/retrieve/fetch-github.ts index 3c21e184..2ab85154 100644 --- a/packages/tools/src/retrieve/fetch-github.ts +++ b/packages/tools/src/retrieve/fetch-github.ts @@ -1,19 +1,22 @@ -import {GithubRepoLoader} from '@langchain/community/document_loaders/web/github' -import {Document} from '@langchain/core/documents' +import { GithubRepoLoader } from "@langchain/community/document_loaders/web/github"; +import { Document } from "@langchain/core/documents"; -export const run = async (dir: string, ignorePaths: string[] = []): Promise<Document[]> => { +export const fetchGithub = async ( + dir: string, + ignorePaths: string[] = [] +): Promise<Document[]> => { const loader = new GithubRepoLoader(dir, { - branch: 'main', + branch: "main", ignorePaths, maxConcurrency: 3, recursive: false, - unknown: 'warn', - }) + unknown: "warn", + }); - const docs = [] + const docs = []; for await (const doc of loader.loadAsStream()) { - docs.push(doc) + docs.push(doc); } - return docs -} + return docs; +}; diff --git a/packages/tools/src/retrieve/fetch-youtube.ts b/packages/tools/src/retrieve/fetch-youtube.ts index babebf61..2983561e 100644 --- a/packages/tools/src/retrieve/fetch-youtube.ts +++ b/packages/tools/src/retrieve/fetch-youtube.ts @@ -1,7 +1,7 @@ import { YoutubeLoader } from "@langchain/community/document_loaders/web/youtube"; import { Document } from "@langchain/core/documents"; -export const run = async ( +export const fetchYoutube = async ( url: string ): Promise<Document<Record<string, unknown>>[]> => { const loader = YoutubeLoader.createFromUrl(url, { diff --git a/packages/tools/src/retrieve/index.ts b/packages/tools/src/retrieve/index.ts new file mode 100644 index 00000000..3bc03ec7 --- /dev/null +++ b/packages/tools/src/retrieve/index.ts @@ -0,0 +1,2 @@ +export * from "./fetch-github.js"; +export * from "./fetch-youtube.js"; diff --git a/packages/tools/src/retrieve/quick-scrape.ts b/packages/tools/src/retrieve/quick-scrape.ts new file mode 100644 index 00000000..68c63d90 --- /dev/null +++ b/packages/tools/src/retrieve/quick-scrape.ts @@ -0,0 +1,25 @@ +// import { WebBrowser } from "langchain/tools/webbrowser"; + +// export async function quickScrape( +// url: string, +// // @ts-expect-error need to fix types +// model: Model, +// // @ts-expect-error need to fix types +// embeddings: Embeddings +// ) { +// const browser = new WebBrowser({ embeddings, model }); +// const result = await browser.invoke(url); + +// return result; + +// /* +// Joseph Campbell was a mythologist and writer who discussed spirituality, psychological archetypes, cultural myths, and the mythology of self. He sat down with Bill Moyers for a lengthy conversation at George Lucas’s Skywalker Ranch in California, which continued the following year at the American Museum of Natural History in New York. The resulting 24 hours of raw footage were edited down to six one-hour episodes and broadcast on PBS in 1988, shortly after Campbell’s death, in what became one of the most popular in the history of public television. + +// Relevant Links: +// - [The Holstee Manifesto](http://holstee.com/manifesto-bp) +// - [The Silent Music of the Mind: Remembering Oliver Sacks](https://www.themarginalian.org/2015/08/31/remembering-oliver-sacks) +// - [Joseph Campbell series](http://billmoyers.com/spotlight/download-joseph-campbell-and-the-power-of-myth-audio/) +// - [Bill Moyers](https://www.themarginalian.org/tag/bill-moyers/) +// - [books](https://www.themarginalian.org/tag/books/) +// */ +// } diff --git a/packages/tools/src/retrieve/scrape-website.ts b/packages/tools/src/retrieve/scrape-website.ts deleted file mode 100644 index d629ca15..00000000 --- a/packages/tools/src/retrieve/scrape-website.ts +++ /dev/null @@ -1,24 +0,0 @@ -import {ChatOpenAI, OpenAIEmbeddings} from '@langchain/openai' -import {WebBrowser} from 'langchain/tools/webbrowser' - -const model = new ChatOpenAI({temperature: 0}) -const embeddings = new OpenAIEmbeddings() - -export const browser = new WebBrowser({embeddings, model}) - -export async function run(url: string) { - const result = await browser.invoke(url) - - return result - - /* - Joseph Campbell was a mythologist and writer who discussed spirituality, psychological archetypes, cultural myths, and the mythology of self. He sat down with Bill Moyers for a lengthy conversation at George Lucas’s Skywalker Ranch in California, which continued the following year at the American Museum of Natural History in New York. The resulting 24 hours of raw footage were edited down to six one-hour episodes and broadcast on PBS in 1988, shortly after Campbell’s death, in what became one of the most popular in the history of public television. - - Relevant Links: - - [The Holstee Manifesto](http://holstee.com/manifesto-bp) - - [The Silent Music of the Mind: Remembering Oliver Sacks](https://www.themarginalian.org/2015/08/31/remembering-oliver-sacks) - - [Joseph Campbell series](http://billmoyers.com/spotlight/download-joseph-campbell-and-the-power-of-myth-audio/) - - [Bill Moyers](https://www.themarginalian.org/tag/bill-moyers/) - - [books](https://www.themarginalian.org/tag/books/) - */ -} diff --git a/packages/tools/transform-query.ts b/packages/tools/transform-query.ts deleted file mode 100644 index f6f1a276..00000000 --- a/packages/tools/transform-query.ts +++ /dev/null @@ -1,38 +0,0 @@ -import {StringOutputParser} from '@langchain/core/output_parsers' -import {ChatPromptTemplate} from '@langchain/core/prompts' -import {ChatOpenAI} from '@langchain/openai' -/** - * Transform the query to produce a better question. - * - * @param {GraphState} state The current state of the graph. - * @param {RunnableConfig | undefined} config The configuration object for tracing. - * @returns {Promise} The new state object. - */ -export async function transformQuery(state: {question: string}) { - // console.log('---TRANSFORM QUERY---') - // Pull in the prompt - const prompt = ChatPromptTemplate.fromTemplate( - `You are generating a question that is well optimized for semantic search retrieval. - Look at the input and try to reason about the underlying sematic intent / meaning. - Here is the initial question: - \n ------- \n - {question} - \n ------- \n - Formulate an improved question: `, - ) - - // Grader - const model = new ChatOpenAI({ - modelName: 'gpt-4-0125-preview', - streaming: true, - temperature: 0, - }) - - // Prompt - const chain = prompt.pipe(model).pipe(new StringOutputParser()) - const betterQuestion = await chain.invoke({question: state.question}) - - return { - question: betterQuestion, - } -} From 3d097bb216b982df69136fbf514e7b1725a55ee6 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Fri, 2 Aug 2024 14:22:41 -0700 Subject: [PATCH 09/18] create getMetadata node logic --- .../src/youtube-parser/youtube-parser.ts | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/graph/src/youtube-parser/youtube-parser.ts b/packages/graph/src/youtube-parser/youtube-parser.ts index 343f2262..094cca1d 100644 --- a/packages/graph/src/youtube-parser/youtube-parser.ts +++ b/packages/graph/src/youtube-parser/youtube-parser.ts @@ -76,20 +76,25 @@ youtubeGraphBuilder .addNode("getMetadata", async (state) => { console.log("getMetadata", state); // Fetch metadata (title, url, etc.) from YouTube API - const metadata = await fetchYoutube(state.url); - console.log("metadata", metadata); - // Return updated state or catch error to send to handleError node - // if error { - // return { - // error: "Error in processing video metadata", - // }; - // } - return { - title: "Test Title", - description: "Test Description", - url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", - transcription: "Test Transcription", - }; + try { + const metadata = await fetchYoutube(state.url); + + if (metadata && metadata.length > 0) { + if (metadata.length > 1) { + console.log(`Multiple data found for the same URL, ${state.url}`); + } + const videoData = metadata[0]; + return { + title: videoData.metadata.title, + description: videoData.metadata.description, + url: state.url, // Keep the original URL + transcription: videoData.pageContent, + }; + } + } catch (error) { + console.error("Error in processing video metadata", error); + throw error; + } }) .addNode("getRelatedUrls", async (state) => { console.log("getRelatedUrls", state); From b6559651afb9a3ae5d6bb53cb6bc2d02c3627ad4 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Fri, 2 Aug 2024 15:06:34 -0700 Subject: [PATCH 10/18] add xml parser as util --- packages/utils/package.json | 8 +++++--- packages/utils/src/process/index.ts | 4 ++-- packages/utils/src/process/parse-xml.ts | 13 +++++++++++++ pnpm-lock.yaml | 3 +++ 4 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 packages/utils/src/process/parse-xml.ts diff --git a/packages/utils/package.json b/packages/utils/package.json index b824ea60..7fa6a14d 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -24,8 +24,10 @@ "author": "", "license": "ISC", "peerDependencies": { - "typescript": "^5.5.4", - "@types/node": "^18" + "@types/node": "^18", + "typescript": "^5.5.4" }, - "devDependencies": {} + "dependencies": { + "fast-xml-parser": "^4.4.0" + } } diff --git a/packages/utils/src/process/index.ts b/packages/utils/src/process/index.ts index 4a4153a2..94c430eb 100644 --- a/packages/utils/src/process/index.ts +++ b/packages/utils/src/process/index.ts @@ -1,3 +1,3 @@ import convertDirToTextFile from "./convert-dir-to-text-file.js"; - -export { convertDirToTextFile }; +import { parseXml } from "./parse-xml.js"; +export { convertDirToTextFile, parseXml }; diff --git a/packages/utils/src/process/parse-xml.ts b/packages/utils/src/process/parse-xml.ts new file mode 100644 index 00000000..2f9cdc78 --- /dev/null +++ b/packages/utils/src/process/parse-xml.ts @@ -0,0 +1,13 @@ +import { XMLParser } from "fast-xml-parser"; +const parser = new XMLParser(); + +/** + * Parse XML from a string + * @param xml - The XML string to parse + * @returns The parsed XML as an object + * @TODO - add dynamic type checking to the parser + */ +export const parseXml = (xml: string) => { + const xmlDoc = parser.parse(`<root>${xml}</root>`); + return xmlDoc.root || {}; +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a2ddfba..333e7535 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -254,6 +254,9 @@ importers: '@types/node': specifier: ^18 version: 18.19.43 + fast-xml-parser: + specifier: ^4.4.0 + version: 4.4.1 typescript: specifier: ^5.5.4 version: 5.5.4 From e6115007453b483f983df0db686a93e818a14992 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Fri, 2 Aug 2024 15:07:09 -0700 Subject: [PATCH 11/18] first draft of youtube parser graph --- packages/cli/src/commands/test/graph.ts | 19 +---- .../src/youtube-parser/youtube-parser.ts | 80 +++++++++++-------- .../tools/src/process/parse-transcript.ts | 17 ++-- 3 files changed, 63 insertions(+), 53 deletions(-) diff --git a/packages/cli/src/commands/test/graph.ts b/packages/cli/src/commands/test/graph.ts index d2d9a573..b8765ef1 100644 --- a/packages/cli/src/commands/test/graph.ts +++ b/packages/cli/src/commands/test/graph.ts @@ -3,7 +3,7 @@ import { processYouTubeVideo } from "@ai-citizens/graph"; export default class TestGraph extends Command { static override args = { - file: Args.string({ description: "file to read" }), + type: Args.string({ description: "type of graph to run" }), }; static override description = "describe the command here"; @@ -13,25 +13,14 @@ export default class TestGraph extends Command { static override flags = { // flag with no value (-f, --force) force: Flags.boolean({ char: "f" }), - // flag with a value (-n, --name=VALUE) - name: Flags.string({ char: "n", description: "name to print" }), }; public async run(): Promise<void> { const { args, flags } = await this.parse(TestGraph); - const name = flags.name ?? "world"; - this.log( - `hello ${name} from /Users/joshua/dev/acai-monorepo/packages/cli/src/commands/test/graph.ts` - ); - if (args.file && flags.force) { - this.log(`you input --force and --file: ${args.file}`); + if (args.type === "youtube" || !args.type) { + const parsedVideo = await processYouTubeVideo(); + console.log(parsedVideo); } - - const transcript = await processYouTubeVideo( - "https://www.youtube.com/watch?v=dQw4w9WgXcQ" - ); - - console.log(transcript); } } diff --git a/packages/graph/src/youtube-parser/youtube-parser.ts b/packages/graph/src/youtube-parser/youtube-parser.ts index 094cca1d..ebe51960 100644 --- a/packages/graph/src/youtube-parser/youtube-parser.ts +++ b/packages/graph/src/youtube-parser/youtube-parser.ts @@ -1,7 +1,12 @@ import { END, START, StateGraph, StateGraphArgs } from "@langchain/langgraph"; import { BaseMessage } from "@langchain/core/messages"; // import { IterableReadableStream } from "@langchain/core/"; -import { fetchYoutube } from "@ai-citizens/tools"; +import { + extractLinks, + fetchYoutube, + parseTranscript, +} from "@ai-citizens/tools"; +import { parseXml } from "@ai-citizens/utils"; // Define the YouTube video state interface interface YouTubeVideoState { title: string; @@ -74,20 +79,16 @@ const youtubeGraphBuilder = new StateGraph<YouTubeVideoState>({ youtubeGraphBuilder .addNode("getMetadata", async (state) => { - console.log("getMetadata", state); + // console.log("getMetadata", state); // Fetch metadata (title, url, etc.) from YouTube API try { const metadata = await fetchYoutube(state.url); - if (metadata && metadata.length > 0) { - if (metadata.length > 1) { - console.log(`Multiple data found for the same URL, ${state.url}`); - } + if (metadata?.length > 0) { const videoData = metadata[0]; return { title: videoData.metadata.title, description: videoData.metadata.description, - url: state.url, // Keep the original URL transcription: videoData.pageContent, }; } @@ -97,56 +98,69 @@ youtubeGraphBuilder } }) .addNode("getRelatedUrls", async (state) => { - console.log("getRelatedUrls", state); + // console.log("getRelatedUrls", state); + const { description } = state; + const relatedUrlResponse = await extractLinks(description); + // console.log("relatedUrlResponse", relatedUrlResponse); + const relatedUrls = parseXml(relatedUrlResponse); + const { scratchPad, extractedLinks } = relatedUrls; + // will give info on how the model came to the conclusion + // console.log("scratchPad", scratchPad); + // @TODO: current prompt seems to be returning a single string instead of an array + // console.log("relatedUrls", relatedUrls); // Fetch related URLs // Return updated state return { - relatedUrls: ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], - }; - }) - .addNode("extractHighlights", async (state) => { - console.log("extractHighlights", state); - // Extract highlights from video content - // Return updated state - return { - highlights: ["Highlight 1", "Highlight 2"], + relatedUrls: extractedLinks?.length ? [extractedLinks] : [], }; }) + // .addNode("extractHighlights", async (state) => { + // // console.log("extractHighlights", state); + // // Extract highlights from video content + // // Return updated state + // return { + // highlights: ["Highlight 1", "Highlight 2"], + // }; + // }) .addNode("generateSummary", async (state) => { - console.log("generateSummary", state); - // Generate summary of the video - // Return updated state + const { transcription } = state; + const summaryResponse = await parseTranscript({ + transcript: transcription, + modelName: "gpt-4o", + }); + // console.log("generateSummary", summaryResponse); + const parsedSummary = parseXml(summaryResponse); + // console.log("parsedSummary", parsedSummary); + const { key_insights, summary, points_of_contention } = parsedSummary; return { - summary: "Test Summary", + summary, + highlights: [key_insights, points_of_contention], }; }) .addNode("handleMissingTranscription", async (state) => { - console.log("Error in processing video metadata"); return { - messages: [ - { - type: "user", - content: `I had this error ${state.messages}`, - }, - ], + title: "Brute Force Title", + description: "Brute Force Description", + transcription: "Brute Force Transcription", }; }) .addEdge(START, "getMetadata") .addEdge("getMetadata", "getRelatedUrls") - .addEdge("getMetadata", "extractHighlights") + // .addEdge("getMetadata", "extractHighlights") .addEdge("getMetadata", "generateSummary") .addEdge("getRelatedUrls", END) - .addEdge("extractHighlights", END) + // .addEdge("extractHighlights", END) .addEdge("generateSummary", END) .addEdge("handleMissingTranscription", "getRelatedUrls") - .addEdge("handleMissingTranscription", "extractHighlights") + // .addEdge("handleMissingTranscription", "extractHighlights") .addEdge("handleMissingTranscription", "generateSummary") .addConditionalEdges("getMetadata", (state) => { // @TODO: Need to fire additional logic if the transcription is empty // Example condition: if title is empty, go to error handling node - // else move to the next nodes + // else move to the next nodes. return state.title - ? ["getRelatedUrls", "extractHighlights", "generateSummary"] + ? // ? ["getRelatedUrls", "extractHighlights", "generateSummary"] + ["getRelatedUrls", "generateSummary"] : "handleMissingTranscription"; }); const youtubeGraph = youtubeGraphBuilder.compile(); diff --git a/packages/tools/src/process/parse-transcript.ts b/packages/tools/src/process/parse-transcript.ts index 4eb34be1..3cda2358 100644 --- a/packages/tools/src/process/parse-transcript.ts +++ b/packages/tools/src/process/parse-transcript.ts @@ -1,12 +1,19 @@ import { StringOutputParser } from "@langchain/core/output_parsers"; -import { getModel } from "@ai-citizens/llm"; +import { getModel, isAllModel } from "@ai-citizens/llm"; import { analyzeTranscriptTemplate } from "@ai-citizens/prompts"; -export const parseTranscript = async (transcript: string) => { - const llm = await getModel({ - model: "gpt-4o", - }); +export const parseTranscript = async ({ + transcript, + modelName = "gpt-4o", +}: { + transcript: string; + modelName?: string; +}) => { + if (!isAllModel(modelName)) { + throw new Error("Model is not supported"); + } + const llm = await getModel({ model: modelName }); const prompt = analyzeTranscriptTemplate; const chain = prompt.pipe(llm).pipe(new StringOutputParser()); From 3e3f71cf52b67ea88fc9736719979cb7fe3b254e Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Sat, 3 Aug 2024 13:14:36 -0700 Subject: [PATCH 12/18] update handling of files and directories --- .gitignore | 3 +- package.json | 2 +- packages/cli/package.json | 18 +- .../src/process/convert-dir-to-text-file.ts | 106 ++- pnpm-lock.yaml | 851 +----------------- 5 files changed, 111 insertions(+), 869 deletions(-) diff --git a/.gitignore b/.gitignore index a2d3d204..59e4360b 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,5 @@ coverage _docpress tsconfig.tsbuildinfo .env -ava.env \ No newline at end of file +ava.env +langgraphjs \ No newline at end of file diff --git a/package.json b/package.json index af065e1e..62304cc8 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,8 @@ }, "dependencies": { "@ai-citizens/llm": "workspace:*", - "@ai-citizens/tools": "workspace:*", "@ai-citizens/prompts": "workspace:*", + "@ai-citizens/tools": "workspace:*", "@ai-citizens/utils": "workspace:*", "dotenv": "^16.4.5" } diff --git a/packages/cli/package.json b/packages/cli/package.json index ef7bb157..a0453906 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -31,30 +31,24 @@ "topicSeparator": " " }, "dependencies": { - "@ai-citizens/llm": "workspace:*", - "@ai-citizens/utils": "workspace:*", "@ai-citizens/graph": "workspace:*", + "@ai-citizens/llm": "workspace:*", "@ai-citizens/prompts": "workspace:*", "@ai-citizens/tools": "workspace:*", - "@langchain/anthropic": "^0.2.10", - "@langchain/google-genai": "^0.0.23", - "@langchain/groq": "^0.0.15", - "@langchain/ollama": "^0.0.2", - "@langchain/openai": "^0.2.5", + "@ai-citizens/utils": "workspace:*", "@oclif/core": "^4.0.17", "@oclif/plugin-help": "^6", "@oclif/plugin-plugins": "^5", "clipboardy": "^4.0.0", "dotenv": "^16.4.5", - "inquirer": "^9.2.23", - "fast-xml-parser": "^4.4.0" + "fast-xml-parser": "^4.4.0", + "inquirer": "^9.2.23" }, "devDependencies": { - "@oclif/dev-cli": "^1.26.10", "@types/inquirer": "^9.0.7", "@types/node": "^18", - "ts-node": "^10.9.2", - "shx": "^0.3.3" + "shx": "^0.3.3", + "ts-node": "^10.9.2" }, "peerDependencies": { "@langchain/core": "^0.2.18" diff --git a/packages/utils/src/process/convert-dir-to-text-file.ts b/packages/utils/src/process/convert-dir-to-text-file.ts index 30aabc38..5e6ff1b7 100644 --- a/packages/utils/src/process/convert-dir-to-text-file.ts +++ b/packages/utils/src/process/convert-dir-to-text-file.ts @@ -1,25 +1,70 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { minimatch } from "minimatch"; interface ConvertOptions { - /** - * An array of paths to ignore. - */ ignore?: string[]; - /** - * If provided, the output will be saved to a file named `converted-dir-output.txt` in the specified directory. - */ + fileExtensions?: string[]; outputPath?: string; + writeToCWD?: boolean; } async function convertDirToTextFile( dirPath: string, options: ConvertOptions ): Promise<string> { - const { ignore = [], outputPath } = options; + const { + ignore = [ + "**/.git/**", + "**/node_modules/**", + "**/.DS_Store", + "**/package-lock.json", + "**/yarn.lock", + "**/pnpm-lock.yaml", + ], + outputPath, + writeToCWD = false, + } = options; + let output = ""; - // Function to generate directory structure + const textExtensions = [ + ".txt", + ".md", + ".js", + ".ts", + ".jsx", + ".tsx", + ".json", + ".yml", + ".yaml", + ".html", + ".css", + ".scss", + ".less", + ".vue", + ".svelte", + ".py", + ".rb", + ".java", + ".c", + ".cpp", + ".h", + ".hpp", + ".cs", + ".go", + ".rs", + ".php", + ...(options.fileExtensions || []), + ]; + + function shouldInclude(filePath: string): boolean { + const relativePath = path.relative(dirPath, filePath); + return !ignore.some((pattern) => + minimatch(relativePath, pattern, { dot: true }) + ); + } + async function generateDirStructure( currentPath: string, prefix = "" @@ -62,40 +107,43 @@ async function convertDirToTextFile( async function processDirectory(currentPath: string): Promise<void> { const entries = await fs.readdir(currentPath, { withFileTypes: true }); - const processTasks = entries.map(async (entry) => { + for (const entry of entries) { const fullPath = path.join(currentPath, entry.name); const relativePath = path.relative(dirPath, fullPath); - if (ignore.some((ignorePath) => relativePath.startsWith(ignorePath))) { - return; - } - if (entry.isDirectory()) { await processDirectory(fullPath); - } else if (entry.isFile()) { - const content = await fs.readFile(fullPath, "utf8"); - output += `-----------------------------\nFile: ${relativePath}\n-----------------------------\n\n${content}\n\n`; + } else if (shouldInclude(fullPath)) { + try { + const content = textExtensions.includes( + path.extname(fullPath).toLowerCase() + ) + ? await fs.readFile(fullPath, "utf8") + : "[Ignored file extension]"; + output += `-----------------------------\nFile: ${relativePath}\n-----------------------------\n\n${content}\n\n`; + } catch (error) { + output += `-----------------------------\nFile: ${relativePath}\n-----------------------------\n\n[Error reading file: ${error.message}]\n\n`; + } } - }); - - await Promise.all(processTasks); + } } - // Generate directory structure - const dirStructure = await generateDirStructure(dirPath); - const dirName = path.basename(dirPath); - output = `${dirName}/\n${dirStructure}\n${output}`; + output += "Directory structure:\n"; + output += await generateDirStructure(dirPath); + output += "\nFile contents:\n"; await processDirectory(dirPath); if (outputPath) { - const outputFileName = `${dirName}-converted-dir-output.txt`; - await fs.writeFile(path.join(outputPath, outputFileName), output); + await fs.writeFile(outputPath, output); + } else if (writeToCWD) { + await fs.writeFile( + `${process.cwd()}/${dirPath.split("/").pop()}.txt`, + output + ); } + return output; } -export default convertDirToTextFile; - -// example usage -// convertDirToTextFile('./src/lib/utils', {outputPath: './src/lib/utils/output.txt'}) +export { convertDirToTextFile }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 333e7535..056797c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,24 +57,9 @@ importers: '@ai-citizens/utils': specifier: workspace:* version: link:../utils - '@langchain/anthropic': - specifier: ^0.2.10 - version: 0.2.12(langchain@0.2.12)(openai@4.54.0) '@langchain/core': specifier: ^0.2.18 - version: 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) - '@langchain/google-genai': - specifier: ^0.0.23 - version: 0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8) - '@langchain/groq': - specifier: ^0.0.15 - version: 0.0.15(langchain@0.2.12)(openai@4.54.0) - '@langchain/ollama': - specifier: ^0.0.2 - version: 0.0.2(langchain@0.2.12)(openai@4.54.0) - '@langchain/openai': - specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0)) + version: 0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) '@oclif/core': specifier: ^4.0.17 version: 4.0.17 @@ -97,9 +82,6 @@ importers: specifier: ^9.2.23 version: 9.3.6 devDependencies: - '@oclif/dev-cli': - specifier: ^1.26.10 - version: 1.26.10 '@types/inquirer': specifier: ^9.0.7 version: 9.0.7 @@ -257,6 +239,9 @@ importers: fast-xml-parser: specifier: ^4.4.0 version: 4.4.1 + minimatch: + specifier: ^10.0.1 + version: 10.0.1 typescript: specifier: ^5.5.4 version: 5.5.4 @@ -266,18 +251,6 @@ packages: '@anthropic-ai/sdk@0.22.0': resolution: {integrity: sha512-dv4BCC6FZJw3w66WNLsHlUFjhu19fS1L/5jMPApwhZLa/Oy1j0A2i3RypmDtHEPp4Wwg3aZkSHksp7VzYWjzmw==} - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.25.0': resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} @@ -960,65 +933,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oclif/command@1.8.36': - resolution: {integrity: sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ==} - engines: {node: '>=12.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - '@oclif/config': ^1 - - '@oclif/config@1.18.16': - resolution: {integrity: sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - '@oclif/config@1.18.17': - resolution: {integrity: sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - '@oclif/config@1.18.2': - resolution: {integrity: sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@oclif/core@4.0.17': resolution: {integrity: sha512-zfdSRip9DVMOklMojWCLZEB4iOzy7LDTABCDzCXqmpZGS+o1e1xts4jGhnte3mi0WV0YthNfYqF16tqk6CWITA==} engines: {node: '>=18.0.0'} - '@oclif/dev-cli@1.26.10': - resolution: {integrity: sha512-dJ+II9rVXckzFvG+82PbfphMTnoqiHvsuAAbcHrLdZWPBnFAiDKhNYE0iHnA/knAC4VGXhogsrAJ3ERT5d5r2g==} - engines: {node: '>=8.10.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - hasBin: true - - '@oclif/errors@1.3.5': - resolution: {integrity: sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - '@oclif/errors@1.3.6': - resolution: {integrity: sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - '@oclif/help@1.0.15': - resolution: {integrity: sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - '@oclif/linewrap@1.0.0': - resolution: {integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==} - - '@oclif/parser@3.8.17': - resolution: {integrity: sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - '@oclif/plugin-help@3.2.18': - resolution: {integrity: sha512-5n5Pkz4L0duknIvFwx2Ko9Xda3miT6RZP8bgaaK3Q/9fzVBrhi4bOM0u05/OThI6V+3NsSdxYS2o1NLcXToWDg==} - engines: {node: '>=8.0.0'} - '@oclif/plugin-help@6.2.7': resolution: {integrity: sha512-gwrCZW0EjbMe6iIXrkXWpIcfoqo+uMvWRudV3nkwa7ARL2U2GWy8RQ3+bqXvqByauRUcbgv3D6+38lSWqmMwtA==} engines: {node: '>=18.0.0'} @@ -1027,11 +945,6 @@ packages: resolution: {integrity: sha512-nps0twvQypi4X3iWDpkft8+fG7xeJFwevF9al2YQIXo2wHgkXqX7ZfR6h4xjItRBwOoaXtJfBehVuWUw6IXWNw==} engines: {node: '>=18.0.0'} - '@oclif/screen@1.0.4': - resolution: {integrity: sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==} - engines: {node: '>=8.0.0'} - deprecated: Deprecated in favor of @oclif/core - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1206,15 +1119,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - '@types/inquirer@9.0.7': resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==} - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} @@ -1368,9 +1275,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - ansis@3.3.2: resolution: {integrity: sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==} engines: {node: '>=15'} @@ -1438,10 +1342,6 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - cardinal@2.1.1: - resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} - hasBin: true - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1456,9 +1356,6 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1471,19 +1368,10 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-progress@3.12.0: - resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} - engines: {node: '>=4'} - cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-ux@5.6.7: - resolution: {integrity: sha512-dsKAurMNyFDnO6X1TiiRNiVbL90XReLKcvIq4H777NMqXGBxBws23ag8ubCJE97vVZEgWG2eSUhsyLf63Jv8+g==} - engines: {node: '>=8.0.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -1520,20 +1408,12 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1604,16 +1484,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -1683,10 +1557,6 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - execa@0.10.0: - resolution: {integrity: sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==} - engines: {node: '>=4'} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -1701,10 +1571,6 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - extract-stack@2.0.0: - resolution: {integrity: sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==} - engines: {node: '>=8'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1747,9 +1613,6 @@ packages: find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - find-yarn-workspace-root@2.0.0: - resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} - flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1776,12 +1639,6 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@6.0.1: - resolution: {integrity: sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1805,21 +1662,10 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1841,10 +1687,6 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1870,18 +1712,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} - http-call@5.3.0: - resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==} - engines: {node: '>=8.0.0'} - human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -1892,10 +1726,6 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - hyperlinker@1.0.0: - resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} - engines: {node: '>=4'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1937,9 +1767,6 @@ packages: is-any-array@2.0.1: resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} @@ -1986,22 +1813,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-retry-allowed@1.2.0: - resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} - engines: {node: '>=0.10.0'} - - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2010,9 +1821,6 @@ packages: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -2069,12 +1877,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2299,13 +2101,6 @@ packages: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-json-file@6.2.0: - resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} - engines: {node: '>=8'} - load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -2345,14 +2140,6 @@ packages: lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -2408,9 +2195,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - ml-array-mean@1.1.6: resolution: {integrity: sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==} @@ -2452,12 +2236,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - natural-orderby@2.0.3: - resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} - - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -2471,18 +2249,10 @@ packages: encoding: optional: true - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - npm-package-arg@11.0.3: resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} engines: {node: ^16.14.0 || >=18.0.0} - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2565,10 +2335,6 @@ packages: resolution: {integrity: sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==} engines: {node: '>=8'} - object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - object-treeify@4.0.1: resolution: {integrity: sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==} engines: {node: '>= 16'} @@ -2660,17 +2426,6 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - password-prompt@1.1.3: - resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2679,10 +2434,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -2741,17 +2492,10 @@ packages: pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qqjs@0.3.11: - resolution: {integrity: sha512-pB2X5AduTl78J+xRSxQiEmga1jQV0j43jOPs/MTgTLApGFEOn6NgdE2dEjp7nvDtjkIOZbvFIojAiYUx6ep3zg==} - engines: {node: '>=8.0.0'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2776,9 +2520,6 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} - redeyed@2.1.1: - resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -2806,11 +2547,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -2845,14 +2581,6 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -2895,10 +2623,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - sort-keys@4.2.0: - resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} - engines: {node: '>=8'} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -2906,18 +2630,6 @@ packages: spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -2944,14 +2656,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -2975,10 +2679,6 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2987,13 +2687,6 @@ packages: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -3005,10 +2698,6 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - tmp@0.1.0: - resolution: {integrity: sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==} - engines: {node: '>=6'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3039,9 +2728,6 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3054,13 +2740,6 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} @@ -3094,9 +2773,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3193,19 +2869,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - - write-json-file@4.3.0: - resolution: {integrity: sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==} - engines: {node: '>=8.3'} - yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.5.0: resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} engines: {node: '>= 14'} @@ -3258,20 +2924,6 @@ snapshots: transitivePeerDependencies: - encoding - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - '@babel/runtime@7.25.0': dependencies: regenerator-runtime: 0.14.1 @@ -3587,6 +3239,7 @@ snapshots: - encoding - langchain - openai + optional: true '@langchain/community@0.2.22(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/langgraph@0.0.31)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(ignore@5.3.1)(lodash@4.17.21)(openai@4.54.0)(youtube-transcript@1.2.1)(youtubei.js@10.3.0)': dependencies: @@ -3661,13 +3314,13 @@ snapshots: - langchain - openai - '@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0)': + '@langchain/core@0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0)': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.40(@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + langsmith: 0.1.40(@langchain/core@0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -3724,6 +3377,7 @@ snapshots: - langchain - openai - zod + optional: true '@langchain/google-genai@0.0.23(zod@3.23.8)': dependencies: @@ -3758,6 +3412,7 @@ snapshots: - encoding - langchain - openai + optional: true '@langchain/langgraph@0.0.31(langchain@0.2.12(openai@4.54.0))(openai@4.54.0)': dependencies: @@ -3795,6 +3450,7 @@ snapshots: transitivePeerDependencies: - langchain - openai + optional: true '@langchain/openai@0.2.5': dependencies: @@ -3818,9 +3474,9 @@ snapshots: - encoding - langchain - '@langchain/openai@0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))': + '@langchain/openai@0.2.5(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))': dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) js-tiktoken: 1.0.12 openai: 4.54.0 zod: 3.23.8 @@ -3828,6 +3484,7 @@ snapshots: transitivePeerDependencies: - encoding - langchain + optional: true '@langchain/openai@0.2.5(langchain@0.2.12(openai@4.54.0))': dependencies: @@ -3849,9 +3506,9 @@ snapshots: - langchain - openai - '@langchain/textsplitters@0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0)': + '@langchain/textsplitters@0.0.3(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0)': dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain @@ -3895,72 +3552,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@oclif/command@1.8.36(@oclif/config@1.18.17)': - dependencies: - '@oclif/config': 1.18.17 - '@oclif/errors': 1.3.6 - '@oclif/help': 1.0.15(supports-color@8.1.1) - '@oclif/parser': 3.8.17 - debug: 4.3.6(supports-color@8.1.1) - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - '@oclif/command@1.8.36(@oclif/config@1.18.17)(supports-color@8.1.1)': - dependencies: - '@oclif/config': 1.18.17 - '@oclif/errors': 1.3.6 - '@oclif/help': 1.0.15(supports-color@8.1.1) - '@oclif/parser': 3.8.17 - debug: 4.3.6(supports-color@8.1.1) - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - '@oclif/command@1.8.36(@oclif/config@1.18.2)': - dependencies: - '@oclif/config': 1.18.2 - '@oclif/errors': 1.3.6 - '@oclif/help': 1.0.15(supports-color@8.1.1) - '@oclif/parser': 3.8.17 - debug: 4.3.6(supports-color@8.1.1) - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - '@oclif/config@1.18.16(supports-color@8.1.1)': - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.17 - debug: 4.3.6(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - - '@oclif/config@1.18.17': - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.17 - debug: 4.3.6(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - - '@oclif/config@1.18.2': - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.17 - debug: 4.3.6(supports-color@8.1.1) - globby: 11.1.0 - is-wsl: 2.2.0 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - '@oclif/core@4.0.17': dependencies: ansi-escapes: 4.3.2 @@ -3981,79 +3572,6 @@ snapshots: wordwrap: 1.0.0 wrap-ansi: 7.0.0 - '@oclif/dev-cli@1.26.10': - dependencies: - '@oclif/command': 1.8.36(@oclif/config@1.18.17) - '@oclif/config': 1.18.17 - '@oclif/errors': 1.3.6 - '@oclif/plugin-help': 3.2.18 - cli-ux: 5.6.7(@oclif/config@1.18.17) - debug: 4.3.6(supports-color@8.1.1) - find-yarn-workspace-root: 2.0.0 - fs-extra: 8.1.0 - github-slugger: 1.5.0 - lodash: 4.17.21 - normalize-package-data: 3.0.3 - qqjs: 0.3.11 - tslib: 2.6.3 - transitivePeerDependencies: - - supports-color - - '@oclif/errors@1.3.5': - dependencies: - clean-stack: 3.0.1 - fs-extra: 8.1.0 - indent-string: 4.0.0 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - '@oclif/errors@1.3.6': - dependencies: - clean-stack: 3.0.1 - fs-extra: 8.1.0 - indent-string: 4.0.0 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - '@oclif/help@1.0.15(supports-color@8.1.1)': - dependencies: - '@oclif/config': 1.18.16(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - chalk: 4.1.2 - indent-string: 4.0.0 - lodash: 4.17.21 - string-width: 4.2.3 - strip-ansi: 6.0.1 - widest-line: 3.1.0 - wrap-ansi: 6.2.0 - transitivePeerDependencies: - - supports-color - - '@oclif/linewrap@1.0.0': {} - - '@oclif/parser@3.8.17': - dependencies: - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - chalk: 4.1.2 - tslib: 2.6.3 - - '@oclif/plugin-help@3.2.18': - dependencies: - '@oclif/command': 1.8.36(@oclif/config@1.18.2) - '@oclif/config': 1.18.2 - '@oclif/errors': 1.3.5 - '@oclif/help': 1.0.15(supports-color@8.1.1) - chalk: 4.1.2 - indent-string: 4.0.0 - lodash: 4.17.21 - string-width: 4.2.3 - strip-ansi: 6.0.1 - widest-line: 3.1.0 - wrap-ansi: 6.2.0 - transitivePeerDependencies: - - supports-color - '@oclif/plugin-help@6.2.7': dependencies: '@oclif/core': 4.0.17 @@ -4074,8 +3592,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@oclif/screen@1.0.4': {} - '@pkgjs/parseargs@0.11.0': optional: true @@ -4189,18 +3705,11 @@ snapshots: '@types/estree@1.0.5': {} - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 18.19.43 - '@types/inquirer@9.0.7': dependencies: '@types/through': 0.0.33 rxjs: 7.8.1 - '@types/minimatch@5.1.2': {} - '@types/node-fetch@2.6.11': dependencies: '@types/node': 18.19.43 @@ -4370,8 +3879,6 @@ snapshots: ansi-styles@6.2.1: {} - ansicolors@0.3.2: {} - ansis@3.3.2: {} arg@4.1.3: {} @@ -4430,11 +3937,6 @@ snapshots: camelcase@6.3.0: {} - cardinal@2.1.1: - dependencies: - ansicolors: 0.3.2 - redeyed: 2.1.1 - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -4450,8 +3952,6 @@ snapshots: charenc@0.0.2: {} - chownr@1.1.4: {} - ci-info@3.9.0: {} clean-stack@3.0.1: @@ -4462,43 +3962,8 @@ snapshots: dependencies: restore-cursor: 3.1.0 - cli-progress@3.12.0: - dependencies: - string-width: 4.2.3 - cli-spinners@2.9.2: {} - cli-ux@5.6.7(@oclif/config@1.18.17): - dependencies: - '@oclif/command': 1.8.36(@oclif/config@1.18.17)(supports-color@8.1.1) - '@oclif/errors': 1.3.6 - '@oclif/linewrap': 1.0.0 - '@oclif/screen': 1.0.4 - ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 - clean-stack: 3.0.1 - cli-progress: 3.12.0 - extract-stack: 2.0.0 - fs-extra: 8.1.0 - hyperlinker: 1.0.0 - indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 - lodash: 4.17.21 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.3 - semver: 7.6.3 - string-width: 4.2.3 - strip-ansi: 6.0.1 - supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 - tslib: 2.6.3 - transitivePeerDependencies: - - '@oclif/config' - cli-width@4.1.0: {} clipboardy@4.0.0: @@ -4529,8 +3994,6 @@ snapshots: concat-map@0.0.1: {} - content-type@1.0.5: {} - create-require@1.1.1: {} cross-spawn@5.1.0: @@ -4539,14 +4002,6 @@ snapshots: shebang-command: 1.2.0 which: 1.3.1 - cross-spawn@6.0.5: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -4602,19 +4057,11 @@ snapshots: emoji-regex@9.2.2: {} - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -4727,16 +4174,6 @@ snapshots: eventemitter3@4.0.7: {} - execa@0.10.0: - dependencies: - cross-spawn: 6.0.5 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -4759,8 +4196,6 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extract-stack@2.0.0: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -4810,10 +4245,6 @@ snapshots: micromatch: 4.0.7 pkg-dir: 4.2.0 - find-yarn-workspace-root@2.0.0: - dependencies: - micromatch: 4.0.7 - flat-cache@3.2.0: dependencies: flatted: 3.3.1 @@ -4842,14 +4273,6 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 - fs-constants@1.0.0: {} - - fs-extra@6.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -4871,16 +4294,8 @@ snapshots: get-package-type@0.1.0: {} - get-stream@3.0.0: {} - - get-stream@5.2.0: - dependencies: - pump: 3.0.0 - get-stream@8.0.1: {} - github-slugger@1.5.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4911,17 +4326,6 @@ snapshots: dependencies: type-fest: 0.20.2 - globby@10.0.2: - dependencies: - '@types/glob': 7.2.0 - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - glob: 7.2.3 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -4957,25 +4361,10 @@ snapshots: dependencies: function-bind: 1.1.2 - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 - http-call@5.3.0: - dependencies: - content-type: 1.0.5 - debug: 4.3.6(supports-color@8.1.1) - is-retry-allowed: 1.2.0 - is-stream: 2.0.1 - parse-json: 4.0.0 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - supports-color - human-id@1.0.2: {} human-signals@5.0.0: {} @@ -4984,8 +4373,6 @@ snapshots: dependencies: ms: 2.1.3 - hyperlinker@1.0.0: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -5029,8 +4416,6 @@ snapshots: is-any-array@2.0.1: {} - is-arrayish@0.2.1: {} - is-buffer@1.1.6: {} is-core-module@2.15.0: @@ -5059,22 +4444,12 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-obj@2.1.0: {} - - is-retry-allowed@1.2.0: {} - - is-stream@1.1.0: {} - - is-stream@2.0.1: {} - is-stream@3.0.0: {} is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: {} is-windows@1.0.2: {} @@ -5129,10 +4504,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-better-errors@1.0.2: {} - - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -5179,17 +4550,17 @@ snapshots: - encoding - openai - langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0): + langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0): dependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) - '@langchain/openai': 0.2.5(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0)) - '@langchain/textsplitters': 0.0.3(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + '@langchain/openai': 0.2.5(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0)) + '@langchain/textsplitters': 0.0.3(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.40(@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + langsmith: 0.1.40(@langchain/core@0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -5198,10 +4569,6 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) optionalDependencies: - '@langchain/anthropic': 0.2.12(langchain@0.2.12)(openai@4.54.0) - '@langchain/google-genai': 0.0.23(langchain@0.2.12)(openai@4.54.0)(zod@3.23.8) - '@langchain/groq': 0.0.15(langchain@0.2.12)(openai@4.54.0) - '@langchain/ollama': 0.0.2(langchain@0.2.12)(openai@4.54.0) fast-xml-parser: 4.4.1 transitivePeerDependencies: - encoding @@ -5233,7 +4600,7 @@ snapshots: langchainhub@0.0.11: {} - langsmith@0.1.40(@langchain/core@0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0): + langsmith@0.1.40(@langchain/core@0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -5242,8 +4609,8 @@ snapshots: semver: 7.6.3 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.19(langchain@0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) - langchain: 0.2.12(@langchain/anthropic@0.2.12)(@langchain/google-genai@0.0.23)(@langchain/groq@0.0.15)(@langchain/ollama@0.0.2)(fast-xml-parser@4.4.1)(openai@4.54.0) + '@langchain/core': 0.2.19(langchain@0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0))(openai@4.54.0) + langchain: 0.2.12(fast-xml-parser@4.4.1)(openai@4.54.0) openai: 4.54.0 langsmith@0.1.40(@langchain/core@0.2.19(langchain@0.2.12(openai@4.54.0))(openai@4.54.0))(langchain@0.2.12(openai@4.54.0))(openai@4.54.0): @@ -5302,15 +4669,6 @@ snapshots: lilconfig@3.1.2: {} - lines-and-columns@1.2.4: {} - - load-json-file@6.2.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 5.2.0 - strip-bom: 4.0.0 - type-fest: 0.6.0 - load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 @@ -5330,7 +4688,8 @@ snapshots: lodash.startcase@4.4.0: {} - lodash@4.17.21: {} + lodash@4.17.21: + optional: true log-symbols@4.1.0: dependencies: @@ -5350,14 +4709,6 @@ snapshots: pseudomap: 1.0.2 yallist: 2.1.2 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - make-error@1.3.6: {} md5@2.3.0: @@ -5405,8 +4756,6 @@ snapshots: minipass@7.1.2: {} - mkdirp-classic@0.5.3: {} - ml-array-mean@1.1.6: dependencies: ml-array-sum: 1.1.6 @@ -5442,23 +4791,12 @@ snapshots: natural-compare@1.4.0: {} - natural-orderby@2.0.3: {} - - nice-try@1.0.5: {} - node-domexception@1.0.0: {} node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.15.0 - semver: 7.6.3 - validate-npm-package-license: 3.0.4 - npm-package-arg@11.0.3: dependencies: hosted-git-info: 7.0.2 @@ -5466,10 +4804,6 @@ snapshots: semver: 7.6.3 validate-npm-package-name: 5.0.1 - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -5478,8 +4812,6 @@ snapshots: num-sort@2.1.0: {} - object-treeify@1.1.33: {} - object-treeify@4.0.1: {} ollama@0.5.6: @@ -5583,29 +4915,10 @@ snapshots: dependencies: callsites: 3.1.0 - parse-json@4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - password-prompt@1.1.3: - dependencies: - ansi-escapes: 4.3.2 - cross-spawn: 7.0.3 - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} - path-key@2.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} @@ -5650,31 +4963,8 @@ snapshots: pseudomap@1.0.2: {} - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - punycode@2.3.1: {} - qqjs@0.3.11: - dependencies: - chalk: 2.4.2 - debug: 4.3.6(supports-color@8.1.1) - execa: 0.10.0 - fs-extra: 6.0.1 - get-stream: 5.2.0 - glob: 7.2.3 - globby: 10.0.2 - http-call: 5.3.0 - load-json-file: 6.2.0 - pkg-dir: 4.2.0 - tar-fs: 2.1.1 - tmp: 0.1.0 - write-json-file: 4.3.0 - transitivePeerDependencies: - - supports-color - queue-microtask@1.2.3: {} react-dom@18.3.1(react@18.3.1): @@ -5704,10 +4994,6 @@ snapshots: dependencies: resolve: 1.22.8 - redeyed@2.1.1: - dependencies: - esprima: 4.0.1 - regenerator-runtime@0.14.1: {} resolve-from@4.0.0: {} @@ -5729,10 +5015,6 @@ snapshots: reusify@1.0.4: {} - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -5782,10 +5064,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - semver@5.7.2: {} - - semver@6.3.1: {} - semver@7.6.3: {} shebang-command@1.2.0: @@ -5817,10 +5095,6 @@ snapshots: slash@3.0.0: {} - sort-keys@4.2.0: - dependencies: - is-plain-obj: 2.1.0 - source-map-js@1.2.0: {} spawndamnit@2.0.0: @@ -5828,20 +5102,6 @@ snapshots: cross-spawn: 5.1.0 signal-exit: 3.0.7 - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 - - spdx-license-ids@3.0.18: {} - sprintf-js@1.0.3: {} string-width@4.2.3: @@ -5870,10 +5130,6 @@ snapshots: strip-bom@3.0.0: {} - strip-bom@4.0.0: {} - - strip-eof@1.0.0: {} - strip-final-newline@3.0.0: {} strip-json-comments@3.1.1: {} @@ -5892,30 +5148,10 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@2.3.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - supports-preserve-symlinks-flag@1.0.0: {} system-architecture@0.1.0: {} - tar-fs@2.1.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - term-size@2.2.1: {} text-table@0.2.0: {} @@ -5924,10 +5160,6 @@ snapshots: dependencies: os-tmpdir: 1.0.2 - tmp@0.1.0: - dependencies: - rimraf: 2.7.1 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -5960,10 +5192,6 @@ snapshots: tslib@2.6.3: {} - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -5972,12 +5200,6 @@ snapshots: type-fest@0.21.3: {} - type-fest@0.6.0: {} - - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - typescript@5.5.4: {} undici-types@5.26.5: {} @@ -6000,11 +5222,6 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - validate-npm-package-name@5.0.1: {} vite@5.3.5(@types/node@18.19.43): @@ -6078,26 +5295,8 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@3.0.3: - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - - write-json-file@4.3.0: - dependencies: - detect-indent: 6.1.0 - graceful-fs: 4.2.11 - is-plain-obj: 2.1.0 - make-dir: 3.1.0 - sort-keys: 4.2.0 - write-file-atomic: 3.0.3 - yallist@2.1.2: {} - yallist@4.0.0: {} - yaml@2.5.0: {} yarn@1.22.22: {} From 1d32a7b5c3e54c1d9a7093e3eb227b19b54c8c8b Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Sat, 3 Aug 2024 13:14:54 -0700 Subject: [PATCH 13/18] add minimatch --- packages/utils/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/utils/package.json b/packages/utils/package.json index 7fa6a14d..29b2c19f 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -28,6 +28,7 @@ "typescript": "^5.5.4" }, "dependencies": { - "fast-xml-parser": "^4.4.0" + "fast-xml-parser": "^4.4.0", + "minimatch": "^10.0.1" } } From 4627bec6ee5fe0c18ead8f9b04848b00dd510a3f Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Sat, 3 Aug 2024 13:16:35 -0700 Subject: [PATCH 14/18] scaffold graph generator graph --- packages/cli/src/commands/test/graph.ts | 16 +- packages/cli/src/commands/util/process/dir.ts | 7 +- packages/graph/src/graph-creator/graph.ts | 147 +++++ packages/graph/src/graph-creator/index.ts | 1 + .../src/graph-creator/prompt/build-prompt.ts | 59 ++ .../src/graph-creator/prompt/examples.txt | 188 ++++++ .../graph-creator/prompt/langgraph-docs.txt | 603 ++++++++++++++++++ packages/graph/src/index.ts | 1 + .../graph/src/utils/generate-graph-img.ts | 18 + .../src/youtube-parser/youtube-parser.ts | 40 +- packages/utils/src/process/index.ts | 2 +- 11 files changed, 1058 insertions(+), 24 deletions(-) create mode 100644 packages/graph/src/graph-creator/graph.ts create mode 100644 packages/graph/src/graph-creator/index.ts create mode 100644 packages/graph/src/graph-creator/prompt/build-prompt.ts create mode 100644 packages/graph/src/graph-creator/prompt/examples.txt create mode 100644 packages/graph/src/graph-creator/prompt/langgraph-docs.txt create mode 100644 packages/graph/src/utils/generate-graph-img.ts diff --git a/packages/cli/src/commands/test/graph.ts b/packages/cli/src/commands/test/graph.ts index b8765ef1..c2fa5b75 100644 --- a/packages/cli/src/commands/test/graph.ts +++ b/packages/cli/src/commands/test/graph.ts @@ -1,5 +1,5 @@ import { Args, Command, Flags } from "@oclif/core"; -import { processYouTubeVideo } from "@ai-citizens/graph"; +import { processYouTubeVideo, runGraphGenerator } from "@ai-citizens/graph"; export default class TestGraph extends Command { static override args = { @@ -18,9 +18,21 @@ export default class TestGraph extends Command { public async run(): Promise<void> { const { args, flags } = await this.parse(TestGraph); - if (args.type === "youtube" || !args.type) { + if (args.type === "youtube") { const parsedVideo = await processYouTubeVideo(); console.log(parsedVideo); } + + if (args.type === "graph" || !args.type) { + const parsedGraph = await runGraphGenerator( + "generate a graph for a chatbot", + { + configurable: { + thread_id: "123", + }, + } + ); + console.log(parsedGraph); + } } } diff --git a/packages/cli/src/commands/util/process/dir.ts b/packages/cli/src/commands/util/process/dir.ts index d2c0ba6c..e8bbfa67 100644 --- a/packages/cli/src/commands/util/process/dir.ts +++ b/packages/cli/src/commands/util/process/dir.ts @@ -39,6 +39,10 @@ export default class Dir extends Command { char: "o", description: "output file to write to", }), + writeToCWD: Flags.boolean({ + char: "w", + description: "write to current working directory", + }), }; public async run(): Promise<void> { @@ -48,7 +52,7 @@ export default class Dir extends Command { this.error("Input directory is required"); } - if (!flags.outputFile) { + if (!flags.outputFile && !flags.writeToCWD) { this.error("Output file is required"); } @@ -61,6 +65,7 @@ export default class Dir extends Command { await convertDirToTextFile(args.inputDir, { ignore, outputPath: flags.outputFile, + writeToCWD: flags.writeToCWD, }); } } diff --git a/packages/graph/src/graph-creator/graph.ts b/packages/graph/src/graph-creator/graph.ts new file mode 100644 index 00000000..38f9124a --- /dev/null +++ b/packages/graph/src/graph-creator/graph.ts @@ -0,0 +1,147 @@ +import { + END, + MemorySaver, + START, + StateGraph, + StateGraphArgs, +} from "@langchain/langgraph"; +import { BaseMessage, HumanMessage, AIMessage } from "@langchain/core/messages"; +import { RunnableConfig } from "@langchain/core/runnables"; +import { generateGraphImg } from "../utils/generate-graph-img.js"; + +// Define the state interface for the graph generator +interface GraphGeneratorState { + scaffoldedGraph: string; + qaResult: { + hasErrors: boolean; + errorMessages: string[]; + }; + userApproval: boolean; + planningResult: string; + messages: BaseMessage[]; +} + +// Define the state channels with reducers +const graphGeneratorState: StateGraphArgs<GraphGeneratorState>["channels"] = { + scaffoldedGraph: { + default: () => "", + value: (prev: string, next?: string) => next ?? prev, + }, + qaResult: { + default: () => ({ hasErrors: false, errorMessages: [] }), + value: (prev, next?) => next ?? prev, + }, + userApproval: { + default: () => false, + value: (prev: boolean, next?: boolean) => next ?? prev, + }, + planningResult: { + default: () => "", + value: (prev: string, next?: string) => next ?? prev, + }, + messages: { + default: () => [], + value: (prev: BaseMessage[] = [], next?: BaseMessage[]): BaseMessage[] => { + if (!next) return prev; + return [...prev, ...next]; + }, + }, +}; + +// Create the graph builder +const graphGeneratorBuilder = new StateGraph<GraphGeneratorState>({ + channels: graphGeneratorState, +}); + +// Add nodes to the graph +graphGeneratorBuilder + .addNode("scaffoldGraph", async (state: GraphGeneratorState) => { + console.log("Scaffolding graph..."); + // Mock implementation: Generate a basic graph structure + const scaffoldedGraph = ` + const exampleGraph = new StateGraph({ + channels: { + // Add channels here + } + }); + + exampleGraph + .addNode("nodeA", (state) => { /* Logic for nodeA */ }) + .addNode("nodeB", (state) => { /* Logic for nodeB */ }) + .addEdge(START, "nodeA") + .addEdge("nodeA", "nodeB") + .addEdge("nodeB", END); + `; + return { scaffoldedGraph }; + }) + .addNode("qaCheck", async (state: GraphGeneratorState) => { + console.log("Performing QA check..."); + // Mock implementation: Perform linting and error checking + const hasErrors = Math.random() < 0.3; // 30% chance of errors for demonstration + const errorMessages = hasErrors + ? ["Linting error on line 5", "Missing type annotation for nodeB"] + : []; + return { + qaResult: { hasErrors, errorMessages }, + messages: [ + new AIMessage( + `QA Check completed. ${ + hasErrors ? "Errors found." : "No errors found." + }` + ), + ], + }; + }) + .addNode("planning", async (state: GraphGeneratorState) => { + console.log("Planning next steps..."); + // Mock implementation: Generate a plan based on the scaffolded graph + const planningResult = + "1. Implement detailed logic for each node\n2. Add error handling\n3. Integrate with external APIs"; + return { + planningResult, + messages: [ + new AIMessage(`Planning completed. Next steps:\n${planningResult}`), + ], + }; + }) + .addEdge(START, "scaffoldGraph") + .addEdge("scaffoldGraph", "qaCheck") + .addEdge("qaCheck", "planning") + .addEdge("planning", END); + +// **Persistence** +// Human-in-the-loop workflows require a checkpointer to ensure +// nothing is lost between interactions +const checkpointer = new MemorySaver(); + +// Compile the graph +const graphGeneratorGraph = graphGeneratorBuilder.compile({ + checkpointer, + // @ts-expect-error stupid typing + interruptBefore: ["planning"], +}); +const graphImg = generateGraphImg({ + app: graphGeneratorGraph, + path: "./graph-generator-graph.png", +}); +// Example usage +export const runGraphGenerator = async ( + userRequest?: string, + config?: { + configurable: { thread_id: string }; + } +): Promise<GraphGeneratorState> => { + let request = userRequest || "Generate a graph for a chatbot"; + const userMessage = new HumanMessage(request); + const initialState: Partial<GraphGeneratorState> = { + messages: [userMessage], + }; + const finalState = await graphGeneratorGraph.invoke(initialState, config); + return finalState; +}; + +export const resumeGraphGenerator = async (config?: { + configurable: { thread_id: string }; +}): Promise<GraphGeneratorState> => { + return await graphGeneratorGraph.invoke(null, config); +}; diff --git a/packages/graph/src/graph-creator/index.ts b/packages/graph/src/graph-creator/index.ts new file mode 100644 index 00000000..34f56514 --- /dev/null +++ b/packages/graph/src/graph-creator/index.ts @@ -0,0 +1 @@ +export * from "./graph.js"; diff --git a/packages/graph/src/graph-creator/prompt/build-prompt.ts b/packages/graph/src/graph-creator/prompt/build-prompt.ts new file mode 100644 index 00000000..334f5cc2 --- /dev/null +++ b/packages/graph/src/graph-creator/prompt/build-prompt.ts @@ -0,0 +1,59 @@ +import { ChatPromptTemplate } from "@langchain/core/prompts"; +import fs from "fs"; + +const scaffoldLangGraph = ChatPromptTemplate.fromTemplate( + ` +You are an AI assistant tasked with creating a LangGraph based on a user's request. You will be provided with LangGraph documentation, examples of graph structures, and a specific user request. Your goal is to create a well-structured graph that meets the user's requirements. + +First, review the LangGraph documentation: + +<langgraph_docs> +{langgraph_docs} +</langgraph_docs> + +Now, consider these examples of graph structures: + +<examples> +{examples} +</examples> + +The user has made the following request for a LangGraph: + +<user_request> +{user_request} +</user_request> + +Your task is to create the graph the user is requesting. Follow these guidelines: + +1. Analyze the user's request carefully to understand the required nodes and edges. +2. Plan out the necessary nodes and edges for the graph, ensuring they are organized chronologically or logically. +3. Add all nodes and edges to the graph builder at once, rather than incrementally. +4. Use strict typing and type checking to ensure the graph works as expected. +5. Annotate logic as needed to explain the graph to the user. +6. Mock out the functions of the nodes in comments and return test data where applicable. + +When creating your graph, follow this structure: + +1. Start with importing necessary modules and defining any required types. +2. Create the graph builder and add all nodes and edges. +3. Include type annotations and guards for each node. +4. Add comments to explain the logic and purpose of each node. +5. Provide mock implementations or test data for node functions where appropriate. + +Present your complete graph implementation inside <graph> tags. Ensure that your implementation is well-commented and follows Python best practices. + +After the graph implementation, provide a brief explanation of how the graph works and how it fulfills the user's request. Include this explanation inside <explanation> tags. + +Remember to adhere to strict typing, use appropriate error handling, and organize your code in a clear and logical manner. +` +); + +export const scaffoldLangGraphPrompt = (userRequest: string) => { + const langgraphDocs = fs.readFileSync("./langgraph-docs.txt", "utf-8"); + const examples = fs.readFileSync("./examples.txt", "utf-8"); + return scaffoldLangGraph.format({ + langgraph_docs: langgraphDocs, + examples: examples, + user_request: userRequest, + }); +}; diff --git a/packages/graph/src/graph-creator/prompt/examples.txt b/packages/graph/src/graph-creator/prompt/examples.txt new file mode 100644 index 00000000..376f48f3 --- /dev/null +++ b/packages/graph/src/graph-creator/prompt/examples.txt @@ -0,0 +1,188 @@ +<example> +<task> +We need to build out a youtube graph that will parse a video and related data to return info to the user. + +I need you to build out the state for me and any related reducers + +{ +title: string +description: string +summary: string +relatedUrls: string [] +url: string +transcription: string +messages: BaseMessages +errors: string[] +} +</task> + +<output> +import { END, START, StateGraph, StateGraphArgs } from "@langchain/langgraph"; +import { BaseMessage } from "@langchain/core/messages"; +import { IterableReadableStream } from "@langchain/core/utils/stream"; + +// Define the YouTube video state interface +interface YouTubeVideoState { + title: string; + description: string; + summary: string; + relatedUrls: string[]; + url: string; + highlights: string[]; + transcription: string; + /* + messages field for potential LLM interactions + */ + messages: BaseMessage[]; + error: string; +} + +const stringReducer = (prev: string = "", next?: string): string => + next ?? prev; +const arrayReducer = <T>(prev: T[] = [], next?: T[]): T[] => { + if (!next) return prev; + return [...prev, ...next]; +}; +// Update the graphState with specific reducers for YouTube video state +const youtubeGraphState: StateGraphArgs<YouTubeVideoState>["channels"] = { + title: { + default: () => "", + value: stringReducer, + }, + description: { + default: () => "", + value: stringReducer, + }, + summary: { + default: () => "", + value: stringReducer, + }, + relatedUrls: { + default: () => [], + value: (prev: string[] = [], next?: string[]): string[] => { + if (!next) return prev; + return [...new Set([...prev, ...next])]; + }, + }, + url: { + default: () => "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + value: stringReducer, + }, + highlights: { + default: () => [], + value: arrayReducer, + }, + transcription: { + default: () => "", + value: (prev: string = "", next?: string): string => next ?? prev, + }, + messages: { + default: () => [], + value: arrayReducer, + }, + error: { + default: () => "", + value: stringReducer, + }, +}; + +// Define the YouTube graph +const youtubeGraphBuilder = new StateGraph<YouTubeVideoState>({ + channels: youtubeGraphState, +}); + +youtubeGraphBuilder + .addNode("getMetadata", async (state) => { + console.log("getMetadata", state); + // Fetch metadata (title, url, etc.) from YouTube API + // Return updated state or catch error to send to handleError node + // if error { + // return { + // error: "Error in processing video metadata", + // }; + // } + return { + title: "Test Title", + description: "Test Description", + url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + transcription: "Test Transcription", + }; + }) + .addNode("getRelatedUrls", async (state) => { + console.log("getRelatedUrls", state); + // Fetch related URLs + // Return updated state + return { + relatedUrls: ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], + }; + }) + .addNode("extractHighlights", async (state) => { + console.log("extractHighlights", state); + // Extract highlights from video content + // Return updated state + return { + highlights: ["Highlight 1", "Highlight 2"], + }; + }) + .addNode("generateSummary", async (state) => { + console.log("generateSummary", state); + // Generate summary of the video + // Return updated state + return { + summary: "Test Summary", + }; + }) + .addNode("handleMissingTranscription", async (state) => { + console.log("Error in processing video metadata"); + // @TODO: will use a more brute force method by ripping the audio from the video and transcribing ourselves + // we still want the meta data from the video though and will need to process in some capacity + return { + title: "Test Title", + description: "Test Description", + url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + transcription: "Brute Forced Test Transcription", + }; + }) + .addEdge(START, "getMetadata") + .addEdge("getRelatedUrls", END) + .addEdge("extractHighlights", END) + .addEdge("generateSummary", END) + .addEdge("handleMissingTranscription", "getRelatedUrls") + .addEdge("handleMissingTranscription", "extractHighlights") + .addEdge("handleMissingTranscription", "generateSummary") + .addConditionalEdges("getMetadata", (state) => { + // Example condition: if title is empty, go to error handling node + // else move to the next nodes + return state.title + ? ["getRelatedUrls", "extractHighlights", "generateSummary"] + : "handleMissingTranscription"; + }); +const youtubeGraph = youtubeGraphBuilder.compile(); + +export const processYouTubeVideo = async ( + videoUrl: string, + config?: { configurable: { thread_id: string } } +): Promise<YouTubeVideoState> => { + const initialState: Partial<YouTubeVideoState> = { + url: videoUrl, + }; + const finalState = await youtubeGraph.invoke(initialState, config); + return finalState; +}; + +// Example of how to use streaming +export const streamYouTubeVideoProcessing = async ( + videoUrl: string, + config?: { configurable: { thread_id: string } } +): Promise<IterableReadableStream<YouTubeVideoState>> => { + const initialState: Partial<YouTubeVideoState> = { + url: videoUrl, + }; + const stream = await youtubeGraph.stream(initialState, { + ...config, + configurable: { ...config?.configurable, stream_events: true }, + }); + return stream; +}; +</output> +</example> \ No newline at end of file diff --git a/packages/graph/src/graph-creator/prompt/langgraph-docs.txt b/packages/graph/src/graph-creator/prompt/langgraph-docs.txt new file mode 100644 index 00000000..a6a6fe4b --- /dev/null +++ b/packages/graph/src/graph-creator/prompt/langgraph-docs.txt @@ -0,0 +1,603 @@ +# Common Agentic Patterns + +## Structured Output + +It's pretty common to want LLMs inside nodes to return structured output when building agents. This is because that structured output can often be used to route to the next step (e.g. choose between two different edges) or update specific keys of the state. + +Since LangGraph nodes can be arbitrary JavaScript/TypeScript functions, you can do this however you want. If you want to use LangChain, [this how-to guide](https://js.langchain.com/v0.2/docs/how_to/structured_output/) is a starting point. + +## Tool calling + +It's extremely common to want agents to do tool calling. Tool calling refers to choosing from several available tools, and specifying which ones to call and what the inputs should be. This is extremely common in agents, as you often want to let the LLM decide which tools to call and then call those tools. + +Since LangGraph nodes can be arbitrary JavaScript/TypeScript functions, you can do this however you want. If you want to use LangChain, [this how-to guide](https://js.langchain.com/v0.2/docs/how_to/tool_calling/) is a starting point. + +## Memory + +Memory is a key concept to agentic applications. Memory is important because end users often expect the application they are interacting with remember previous interactions. The most simple example of this is chatbots - they clearly need to remember previous messages in a conversation. + +LangGraph is perfectly suited to give you full control over the memory of your application. With user defined [`State`](./low_level.md#state) you can specify the exact schema of the memory you want to retain. With [checkpointers](./low_level.md#checkpointer) you can store checkpoints of previous interactions and resume from there in follow up interactions. + +See [this guide](../how-tos/persistence.ipynb) for how to add memory to your graph. + +## Human-in-the-loop + +Agentic systems often require some human-in-the-loop (or "on-the-loop") interaction patterns. This is because agentic systems are still not super reliable, so having a human involved is required for any sensitive tasks/actions. These are all easily enabled in LangGraph, largely due to [checkpointers](./low_level.md#checkpointer). The reason a checkpointer is necessary is that a lot of these interaction patterns involve running a graph up until a certain point, waiting for some sort of human feedback, and then continuing. When you want to "continue" you will need to access the state of the graph previous to getting interrupted, and checkpointers are a built in, highly convenient way to do that. + +There are a few common human-in-the-loop interaction patterns we see emerging. + +### Approval + +A basic one is to have the agent wait for approval before executing certain tools. This may be all tools, or just a subset of tools. This is generally recommend for more sensitive actions (like writing to a database). This can easily be done in LangGraph by setting a [breakpoint](./low_level.md#breakpoints) before specific nodes. + +See [this guide](../how-tos/breakpoints.ipynb) for how do this in LangGraph. + +### Wait for input + +A similar one is to have the agent wait for human input. This can be done by: + +1. Create a node specifically for human input +2. Add a breakpoint before the node +3. Get user input +4. Update the state with that user input, acting as that node +5. Resume execution + +See [this guide](../how-tos/wait-user-input.ipynb) for how do this in LangGraph. + +### Edit agent actions + +This is a more advanced interaction pattern. In this interaction pattern the human can actually edit some of the agent's previous decisions. This can be done either during the flow (after a [breakpoint](./low_level.md#breakpoints), part of the [approval](#approval) flow) or after the fact (as part of [time-travel](#time-travel)) + +See [this guide](../how-tos/edit-graph-state.ipynb) for how do this in LangGraph. + +### Time travel + +This is a pretty advanced interaction pattern. In this interaction pattern, the human can look back at the list of previous checkpoints, find one they like, optionally [edit it](#edit-agent-actions), and then resume execution from there. + +See [this guide](../how-tos/time-travel.ipynb) for how to do this in LangGraph. + +## Multi-agent + +A term you may have heard is "multi-agent" architectures. What exactly does this mean? + +Given that it is hard to even define an "agent", it's almost impossible to exactly define a "multi-agent" architecture. When most people talk about a multi-agent architecture, they typically mean a system where there are multiple different LLM-based systems. These LLM-based systems can be as simple as a prompt and an LLM call, or as complex as a [ReAct agent](#react-agent). + +The big question in multi-agent systems is how they communicate. This involves both the schema of how they communicate, as well as the sequence in which they communicate. LangGraph is perfect for orchestrating these types of systems. It allows you to define multiple agents (each one is a node) an arbitrary state (to encapsulate the schema of how they communicate) as well as the edges (to control the sequence in which they communicate). + +## Planning + +One of the big things that agentic systems struggle with is long term planning. A common technique to overcome this is to have an explicit planning this. This generally involves calling an LLM to come up with a series of steps to execute. From there, the system then tries to execute the series of tasks (this could use a sub-agent to do so). Optionally, you can revisit the plan after each step and update it if needed. + +## Reflection + +Agents often struggle to produce reliable results. Therefore, it can be helpful to check whether the agent has completed a task correctly or not. If it has - then you can finish. If it hasn't - then you can take the feedback on why it's not correct and pass it back into another iteration of the agent. + +This "reflection" step often uses an LLM, but doesn't have to. A good example of where using an LLM may not be necessary is in coding, when you can try to compile the generated code and use any errors as the feedback. + +## ReAct Agent + +One of the most common agent architectures is what is commonly called the ReAct agent architecture. In this architecture, an LLM is called repeatedly in a while-loop. At each step the agent decides which tools to call, and what the inputs to those tools should be. Those tools are then executed, and the outputs are fed back into the LLM as observations. The while-loop terminates when the agent decides it is not worth calling any more tools. + +One of the few high level, pre-built agents we have in LangGraph - you can use it with [`createReactAgent`](https://langchain-ai.github.io/langgraphjs/reference/functions/prebuilt.createReactAgent.html) + +This is named after and based on the [ReAct](https://arxiv.org/abs/2210.03629) paper. However, there are several differences between this paper and our implementation: + +- First, we use [tool-calling](#tool-calling) to have LLMs call tools, whereas the paper used prompting + parsing of raw output. This is because tool calling did not exist when the paper was written, but is generally better and more reliable. +- Second, we use messages to prompt the LLM, whereas the paper used string formatting. This is because at the time of writing, LLMs didn't even expose a message-based interface, whereas now that's the only interface they expose. +- Third, the paper required all inputs to the tools to be a single string. This was largely due to LLMs not being super capable at the time, and only really being able to generate a single input. Our implementation allows for using tools that require multiple inputs. +- Forth, the paper only looks at calling a single tool at the time, largely due to limitations in LLMs performance at the time. Our implementation allows for calling multiple tools at a time. +- Finally, the paper asked the LLM to explicitly generate a "Thought" step before deciding which tools to call. This is the "Reasoning" part of "ReAct". Our implementation does not do this by default, largely because LLMs have gotten much better and that is not as necessary. Of course, if you wish to prompt it do so, you certainly can. + +See [this guide](../how-tos/time-travel.ipynb) for a full walkthrough of how to use the prebuilt ReAct agent. + + +----------------------------- +File: concepts/faq.md +----------------------------- + +# FAQ + +Common questions and their answers! + +## Do I need to use LangChain in order to use LangGraph? + +No! LangGraph is a general-purpose framework - the nodes and edges are nothing more than JavaScript/TypeScript functions. You can use LangChain, raw HTTP requests, or even other frameworks inside these nodes and edges. + +## Does LangGraph work with LLMs that don't support tool calling? + +Yes! You can use LangGraph with any LLMs. The main reason we use LLMs that support tool calling is that this is often the most convenient way to have the LLM make its decision about what to do. If your LLM does not support tool calling, you can still use it - you just need to write a bit of logic to convert the raw LLM string response to a decision about what to do. + +## Does LangGraph work with OSS LLMs? + +Yes! LangGraph is totally ambivalent to what LLMs are used under the hood. The main reason we use closed LLMs in most of the tutorials is that they seamlessly support tool calling, while OSS LLMs often don't. But tool calling is not necessary (see [this section](#does-langgraph-work-with-llms-that-dont-support-tool-calling)) so you can totally use LangGraph with OSS LLMs. + + +----------------------------- +File: concepts/high_level.md +----------------------------- + +# LangGraph for Agentic Applications + +## What does it mean to be agentic? + +Other people may talk about a system being an "agent" - we prefer to talk about systems being "agentic". But what does this actually mean? + +When we talk about systems being "agentic", we are talking about systems that use an LLM to decide the control flow of an application. There are different levels that an LLM can be used to decide the control flow, and this spectrum of "agentic" makes more sense to us than defining an arbitrary cutoff for what is or isn't an agent. + +Examples of using an LLM to decide the control of an application: + +- Using an LLM to route between two potential paths +- Using an LLM to decide which of many tools to call +- Using an LLM to decide whether the generated answer is sufficient or more work is need + +The more times these types of decisions are made inside an application, the more agentic it is. +If these decisions are being made in a loop, then its even more agentic! + +There are other concepts often associated with being agentic, but we would argue these are a by-product of the above definition: + +- [Tool calling](agentic_concepts.md#tool-calling): this is often how LLMs make decisions +- Action taking: often times, the LLMs' outputs are used as the input to an action +- [Memory](agentic_concepts.md#memory): reliable systems need to have knowledge of things that occurred +- [Planning](agentic_concepts.md#planning): planning steps (either explicit or implicit) are useful for ensuring that the LLM, when making decisions, makes them in the highest fidelity way. + +## Why LangGraph? + +LangGraph has several core principles that we believe make it the most suitable framework for building agentic applications: + +- [Controllability](../how-tos/index.md#controllability) +- [Human-in-the-Loop](../how-tos/index.md#human-in-the-loop) +- [Streaming First](../how-tos/index.md#streaming) + +**Controllability** + +LangGraph is extremely low level. This gives you a high degree of control over what the system you are building actually does. We believe this is important because it is still hard to get agentic systems to work reliably, and we've seen that the more control you exercise over them, the more likely it is that they will "work". + +**Human-in-the-Loop** + +LangGraph comes with a built-in persistence layer as a first-class concept. This enables several different human-in-the-loop interaction patterns. We believe that "Human-Agent Interaction" patterns will be the new "Human-Computer Interaction", and have built LangGraph with built in persistence to enable this. + +**Streaming First** + +LangGraph comes with first class support for streaming. Agentic applications often take a while to run, and so giving the user some idea of what is happening is important, and streaming is a great way to do that. LangGraph supports streaming of both events ([like a tool call being taken](../how-tos/stream-updates.ipynb)) as well as of tokens that an LLM may emit. + +## Deployment + +So you've built your LangGraph object - now what? + +Now you need to deploy it. +There are many ways to deploy LangGraph objects, and the right solution depends on your needs and use case. +We're working on adding JavaScript/TypeScript support for LangGraph cloud, but in the meantime, here are some options: + +- Use [Express.js](https://expressjs.com/) to stand up a server. You can then call this graph from inside the Express.js server as you see fit. + +----------------------------- +File: concepts/low_level.md +----------------------------- + +# Low Level Conceptual Guide + +## Graphs + +At its core, LangGraph models agent workflows as graphs. You define the behavior of your agents using three key components: + +1. [`State`](#state): A shared data structure that represents the current snapshot of your application. It is represented by a [`channels`](https://langchain-ai.github.io/langgraphjs/reference/interfaces/index.StateGraphArgs.html#channels-1) object, and an optional TypeScript `interface`. + +2. [`Nodes`](#nodes): JavaScript/TypeScript functions that encode the logic of your agents. They receive the current `State` as input, perform some computation or side-effect, and return an updated `State`. + +3. [`Edges`](#edges): JavaScript/TypeScript functions that determine which `Node` to execute next based on the current `State`. They can be conditional branches or fixed transitions. + +By composing `Nodes` and `Edges`, you can create complex, looping workflows that evolve the `State` over time. The real power, though, comes from how LangGraph manages that `State`. To emphasize: `Nodes` and `Edges` are nothing more than JavaScript/TypeScript functions - they can contain an LLM or just good ol' JavaScript/TypeScript code. + +In short: _nodes do the work. edges tell what to do next_. + +LangGraph's underlying graph algorithm uses [message passing](https://en.wikipedia.org/wiki/Message_passing) to define a general program. When a Node completes its operation, it sends messages along one or more edges to other node(s). These recipient nodes then execute their functions, pass the resulting messages to the next set of nodes, and the process continues. Inspired by Google's [Pregel](https://research.google/pubs/pregel-a-system-for-large-scale-graph-processing/) system, the program proceeds in discrete "super-steps." + +A super-step can be considered a single iteration over the graph nodes. Nodes that run in parallel are part of the same super-step, while nodes that run sequentially belong to separate super-steps. At the start of graph execution, all nodes begin in an `inactive` state. A node becomes `active` when it receives a new message (state) on any of its incoming edges (or "channels"). The active node then runs its function and responds with updates. At the end of each super-step, nodes with no incoming messages vote to `halt` by marking themselves as `inactive`. The graph execution terminates when all nodes are `inactive` and no messages are in transit. + +### StateGraph + +The `StateGraph` class is the main graph class to uses. This is parameterized by a user defined `State` object. (passed via the `channels` argument) + + +### MessageGraph + +The `MessageGraph` class is a special type of graph. The `State` of a `MessageGraph` is ONLY a list of messages. This class is rarely used except for chatbots, as most applications require the `State` to be more complex than a list of messages. + +### Compiling your graph + +To build your graph, you first define the [state](#state), you then add [nodes](#nodes) and [edges](#edges), and then you compile it. What exactly is compiling your graph and why is it needed? + +Compiling is a pretty simple step. It provides a few basic checks on the structure of your graph (no orphaned nodes, etc). It is also where you can specify runtime args like [checkpointers](#checkpointer) and [breakpoints](#breakpoints). You compile your graph by just calling the `.compile` method: + +```typescript +const graph = graphBuilder.compile(...); +``` + +You **MUST** compile your graph before you can use it. + +## State + +The first thing you do when you define a graph is define the `State` of the graph. The `State` consists of the [schema of the graph](#schema) as well as [`reducer` functions](#reducers) which specify how to apply updates to the state. The schema of the `State` will be the input schema to all `Nodes` and `Edges` in the graph, and should be defined using the [`channels`](https://langchain-ai.github.io/langgraphjs/reference/interfaces/index.StateGraphArgs.html#channels-1) schema. All `Nodes` will emit updates to the `State` which are then applied using the specified `reducer` function. + +### Schema + +The way to specify the schema of a graph is by providing a series of (`channels`)[https://langchain-ai.github.io/langgraphjs/reference/interfaces/index.StateGraphArgs.html#channels-1]. + +### Reducers + +Reducers are key to understanding how updates from nodes are applied to the `State`. Each key in the `State` has its own independent reducer function. If no reducer function is explicitly specified then it is assumed that all updates to that key should override it. Let's take a look at a few examples to understand them better. + +**Example A:** + +```typescript +import { StateGraph } from "@langchain/langgraph"; + +interface State { + foo: number; + bar: string[]; +} + +const graphBuilder = new StateGraph<State>({ + channels: { + foo: null, + bar: null, + } +}); +``` + +In this example, no reducer functions are specified for any key. Let's assume the input to the graph is `{ foo: 1, bar: ["hi"] }`. Let's then assume the first `Node` returns `{ foo: 2 }`. This is treated as an update to the state. Notice that the `Node` does not need to return the whole `State` schema - just an update. After applying this update, the `State` would then be `{ foo: 2, bar: ["hi"] }`. If the second node returns `{ bar: ["bye"] }` then the `State` would then be `{ foo: 2, bar: ["bye"] }` + +**Example B:** + +```typescript +import { StateGraph } from "@langchain/langgraph"; + +interface State { + foo: number; + bar: string[]; +} + +const graphBuilder = new StateGraph<State>({ + channels: { + foo: null, + bar: { + reducer: (state: string[], update: string[]) => state.concat(update), + default: () => [], + }, + } +}); +``` + +In this example, we've updated our `bar` field to be an object containing a `reducer` function. This function will always accept two positional arguments: `state` and `update`, with `state` representing the current state value, and `update` representing the update returned from a `Node`. Note that the first key remains unchanged. Let's assume the input to the graph is `{ foo: 1, bar: ["hi"] }`. Let's then assume the first `Node` returns `{ foo: 2 }`. This is treated as an update to the state. Notice that the `Node` does not need to return the whole `State` schema - just an update. After applying this update, the `State` would then be `{ foo: 2, bar: ["hi"] }`. If the second node returns`{ bar: ["bye"] }` then the `State` would then be `{ foo: 2, bar: ["hi", "bye"] }`. Notice here that the `bar` key is updated by concatenating the two arrays together. + +### MessageState + +`MessageState` is one of the few opinionated components in LangGraph. `MessageState` is a special state designed to make it easy to use a list of messages as a key in your state. Specifically, `MessageState` is defined as: + +```typescript +import { BaseMessage } from "@langchain/langgraph"; + +interface MessageState { + messages: BaseMessage[]; +} + +export class MessageGraph extends StateGraph { + constructor() { + super({ + channels: { + __root__: { + reducer: messagesStateReducer, + default: () => [], + }, + }, + }); + } +} +``` + +What this is doing is creating a `State` with a single key `messages`. This is a list of `BaseMessage`s, with [`messagesStateReducer`](https://langchain-ai.github.io/langgraphjs/reference/functions/index.messagesStateReducer.html) as a reducer. `messagesStateReducer` basically adds messages to the existing list (it also does some nice extra things, like convert from OpenAI message format to the standard LangChain message format, handle updates based on message IDs, etc). + +We often see a list of messages being a key component of state, so this prebuilt state is intended to make it easy to use messages. Typically, there is more state to track than just messages, so we see people subclass this state and add more fields, like: + +```typescript +interface State extends MessagesState { + documents: Array<string> +} +``` + +## Nodes + +In LangGraph, nodes are typically JavaScript/TypeScript functions (sync or `async`) where the **first** positional argument is the [state](#state), and (optionally), the **second** positional argument is a "config", containing optional [configurable parameters](#configuration) (such as a `thread_id`). + +Similar to `NetworkX`, you add these nodes to a graph using the [addNode](https://langchain-ai.github.io/langgraphjs/reference/classes/index.StateGraph.html#addNode) method: + +```typescript +import { RunnableConfig } from "@langchain/core/runnables"; +import { StateGraph } from "@langchain/langgraph"; + +interface State { + input: string; + results: string; +} + +const myNode = (state: State, config?: RunnableConfig) => { + console.log("In node: ", config["configurable"]["user_id"]) + return { + results: `Hello, ${state.input}!` + } +} + + +// The second argument is optional +const myOtherNode = (state: State) => { + return state +} + +const builder = new StateGraph<State>({ + channels: { + input: null, + results: null, + }, +}).addNode("myNode", myNode) + .addNode("myOtherNode", myOtherNode) + ... +``` + +Behind the scenes, functions are converted to [RunnableLambda's](https://v02.api.js.langchain.com/classes/langchain_core_runnables.RunnableLambda.html), which adds batch and streaming support to your function, along with native tracing and debugging. + +### `START` Node + +The `START` Node is a special node that represents the node sends user input to the graph. The main purpose for referencing this node is to determine which nodes should be called first. + +```typescript +import { START } from "@langchain/langgraph"; + +graph.addEdge(START, "nodeA"); +``` + +### `END` Node + +The `END` Node is a special node that represents a terminal node. This node is referenced when you want to denote which edges have no actions after they are done. + +```typescript +import { END } from "@langchain/langgraph"; + +graph.addEdge("nodeA", END); +``` + +## Edges + +Edges define how the logic is routed and how the graph decides to stop. This is a big part of how your agents work and how different nodes communicate with each other. There are a few key types of edges: + +- Normal Edges: Go directly from one node to the next. +- Conditional Edges: Call a function to determine which node(s) to go to next. +- Entry Point: Which node to call first when user input arrives. +- Conditional Entry Point: Call a function to determine which node(s) to call first when user input arrives. + +A node can have MULTIPLE outgoing edges. If a node has multiple out-going edges, **all** of those destination nodes will be executed in parallel as a part of the next superstep. + +### Normal Edges + +If you **always** want to go from node A to node B, you can use the [addEdge](https://langchain-ai.github.io/langgraphjs/reference/classes/index.StateGraph.html#addEdge) method directly. + +```typescript +graph.addEdge("nodeA", "nodeB"); +``` + +### Conditional Edges + +If you want to **optionally** route to 1 or more edges (or optionally terminate), you can use the [addConditionalEdges](https://langchain-ai.github.io/langgraphjs/reference/classes/index.StateGraph.html#addConditionalEdges) method. This method accepts the name of a node and a "routing function" to call after that node is executed: + +```typescript +graph.addConditionalEdges("nodeA", routingFunction); +``` + +Similar to nodes, the `routingFunction` accept the current `state` of the graph and return a value. + +By default, the return value `routingFunction` is used as the name of the node (or a list of nodes) to send the state to next. All those nodes will be run in parallel as a part of the next superstep. + +You can optionally provide an object that maps the `routingFunction`'s output to the name of the next node. + +```typescript +graph.addConditionalEdges("nodeA", routingFunction, { + true: "nodeB", + false: "nodeC" +}); +``` + +### Entry Point + +The entry point is the first node(s) that are run when the graph starts. You can use the [`addEdge`](https://langchain-ai.github.io/langgraphjs/reference/classes/index.StateGraph.html#addEdge) method from the virtual [`START`](https://langchain-ai.github.io/langgraphjs/reference/variables/index.START.html) node to the first node to execute to specify where to enter the graph. + +```typescript +import { START } from "@langchain/langgraph" + +graph.addEdge(START, "nodeA") +``` + +### Conditional Entry Point + +A conditional entry point lets you start at different nodes depending on custom logic. You can use [`addConditionalEdges`](https://langchain-ai.github.io/langgraphjs/reference/classes/index.StateGraph.html#addConditionalEdges) from the virtual [`START`](https://langchain-ai.github.io/langgraphjs/reference/variables/index.START.html) node to accomplish this. + +```typescript +import { START } from "@langchain/langgraph" + +graph.addConditionalEdges(START, routingFunction) +``` + +You can optionally provide an object that maps the `routingFunction`'s output to the name of the next node. + +```typescript +graph.addConditionalEdges(START, routingFunction, { + true: "nodeB", + false: "nodeC" +}); +``` + +## Checkpointer + +LangGraph has a built-in persistence layer, implemented through [checkpointers](https://langchain-ai.github.io/langgraphjs/reference/classes/index.BaseCheckpointSaver.html). When you use a checkpointer with a graph, you can interact with the state of that graph. When you use a checkpointer with a graph, you can interact with and manage the graph's state. The checkpointer saves a _checkpoint_ of the graph state at every super-step, enabling several powerful capabilities: + +First, checkpointers facilitate [human-in-the-loop workflows](agentic_concepts.md#human-in-the-loop) workflows by allowing humans to inspect, interrupt, and approve steps. Checkpointers are needed for these workflows as the human has to be able to view the state of a graph at any point in time, and the graph has to be to resume execution after the human has made any updates to the state. + +Second, it allows for ["memory"](agentic_concepts.md#memory) between interactions. You can use checkpointers to create threads and save the state of a thread after a graph executes. In the case of repeated human interactions (like conversations) any follow up messages can be sent to that checkpoint, which will retain its memory of previous ones. + +See [this guide](../how-tos/persistence.ipynb) for how to add a checkpointer to your graph. + +## Threads + +Threads enable the checkpointing of multiple different runs, making them essential for multi-tenant chat applications and other scenarios where maintaining separate states is necessary. A thread is a unique ID assigned to a series of checkpoints saved by a checkpointer. When using a checkpointer, you must specify a `thread_id` when running the graph. + +`thread_id` is simply the ID of a thread. This is always required + +You must pass these when invoking the graph as part of the configurable part of the config. + +```typescript +const config = { configurable: { thread_id: "a" }}; +await graph.invoke(inputs, config); +``` + +See [this guide](../how-tos/persistence.ipynb) for how to use threads. + +## Checkpointer state + +When interacting with the checkpointer state, you must specify a [thread identifier](#threads). Each checkpoint saved by the checkpointer has two properties: + +- **values**: This is the value of the state at this point in time. +- **next**: This is a tuple of the nodes to execute next in the graph. + +### Get state + +You can get the state of a checkpointer by calling `await graph.getState(config)`. The config should contain `thread_id`, and the state will be fetched for that thread. + +### Get state history + +You can also call `await graph.getStateHistory(config)` to get a list of the history of the graph. The config should contain `thread_id`, and the state history will be fetched for that thread. + +### Update state + +You can also interact with the state directly and update it. This takes three different components: + +- `config` +- `values` +- `asNode` + +**config** + +The config should contain `thread_id` specifying which thread to update. + +**values** + +These are the values that will be used to update the state. Note that this update is treated exactly as any update from a node is treated. This means that these values will be passed to the [reducer](#reducers) functions that are part of the state. So this does NOT automatically overwrite the state. Let's walk through an example. + +Let's assume you have defined the state of your graph as: + +```typescript +interface State { + foo: number; + bar: string[]; +} + +const channels = { + foo: null, + bar: { + reducer: (state: string[], update: string[]) => state.concat(update), + default: () => [], + }, +} +``` + +Let's now assume the current state of the graph is + +``` +{ foo: 1, bar: ["a"] } +``` + +If you update the state as below: + +```typescript +await graph.updateState(config, { foo: 2, bar: ["b"] }) +``` + +Then the new state of the graph will be: + +``` +{ foo: 2, bar: ["a", "b] } +``` + +The `foo` key is completely changed (because there is no reducer specified for that key, so it overwrites it). However, there is a reducer specified for the `bar` key, and so it appends `"b"` to the state of `bar`. + +**`asNode`** + +The final thing you specify when calling `updateState` is `asNode`. This update will be applied as if it came from node `asNode`. If `asNode` is not provided, it will be set to the last node that updated the state, if not ambiguous. + +The reason this matters is that the next steps in the graph to execute depend on the last node to have given an update, so this can be used to control which node executes next. + +## Graph Migrations + +LangGraph can easily handle migrations of graph definitions (nodes, edges, and state) even when using a checkpointer to track state. + +- For threads at the end of the graph (i.e. not interrupted) you can change the entire topology of the graph (i.e. all nodes and edges, remove, add, rename, etc) +- For threads currently interrupted, we support all topology changes other than renaming / removing nodes (as that thread could now be about to enter a node that no longer exists) -- if this is a blocker please reach out and we can prioritize a solution. +- For modifying state, we have full backwards and forwards compatibility for adding and removing keys +- State keys that are renamed lose their saved state in existing threads +- State keys whose types change in incompatible ways could currently cause issues in threads with state from before the change -- if this is a blocker please reach out and we can prioritize a solution. + +## Configuration + +When creating a graph, you can also mark that certain parts of the graph are configurable. This is commonly done to enable easily switching between models or system prompts. This allows you to create a single "cognitive architecture" (the graph) but have multiple different instance of it. + +You can then pass this configuration into the graph using the `configurable` config field. + +```typescript +const config = { configurable: { llm: "anthropic" }}; + +await graph.invoke(inputs, config); +``` + +You can then access and use this configuration inside a node: + +```typescript +const nodeA = (state, config) => { + const llmType = config?.configurable?.llm; + let llm: BaseChatModel; + if (llmType) { + const llm = getLlm(llmType); + } + ... +}; + +``` + +See [this guide](../how-tos/configuration.ipynb) for a full breakdown on configuration + +## Breakpoints + +It can often be useful to set breakpoints before or after certain nodes execute. This can be used to wait for human approval before continuing. These can be set when you ["compile" a graph](#compiling-your-graph). You can set breakpoints either _before_ a node executes (using `interruptBefore`) or after a node executes (using `interruptAfter`.) + +You **MUST** use a [checkpoiner](#checkpointer) when using breakpoints. This is because your graph needs to be able to resume execution. + +In order to resume execution, you can just invoke your graph with `null` as the input. + +```typescript +// Initial run of graph +await graph.invoke(inputs, config); + +// Let's assume it hit a breakpoint somewhere, you can then resume by passing in None +await graph.invoke(null, config); +``` + +See [this guide](../how-tos/breakpoints.ipynb) for a full walkthrough of how to add breakpoints. + +## Visualization + +It's often nice to be able to visualize graphs, especially as they get more complex. LangGraph comes with several built-in ways to visualize graphs. + +## Streaming + +LangGraph is built with first class support for streaming. There are several different streaming modes that LangGraph supports: + +- [`"values"`](../how-tos/stream-values.ipynb): This streams the full value of the state after each step of the graph. +- [`"updates`](../how-tos/stream-updates.ipynb): This streams the updates to the state after each step of the graph. If multiple updates are made in the same step (e.g. multiple nodes are run) then those updates are streamed separately. + +In addition, you can use the [`streamEvents`](https://v02.api.js.langchain.com/classes/langchain_core_runnables.Runnable.html#streamEvents) method to stream back events that happen _inside_ nodes. This is useful for [streaming tokens of LLM calls](../how-tos/streaming-tokens-without-langchain.ipynb). \ No newline at end of file diff --git a/packages/graph/src/index.ts b/packages/graph/src/index.ts index 2b22c579..9f3ffb7d 100644 --- a/packages/graph/src/index.ts +++ b/packages/graph/src/index.ts @@ -1 +1,2 @@ export * from "./youtube-parser/index.js"; +export * from "./graph-creator/index.js"; diff --git a/packages/graph/src/utils/generate-graph-img.ts b/packages/graph/src/utils/generate-graph-img.ts new file mode 100644 index 00000000..b8d9cd4b --- /dev/null +++ b/packages/graph/src/utils/generate-graph-img.ts @@ -0,0 +1,18 @@ +import fs from "fs"; +import { CompiledStateGraph } from "@langchain/langgraph"; + +export const generateGraphImg = async ({ + app, + path, +}: { + app: CompiledStateGraph<any, any, any>; + path?: string; +}) => { + const drawableGraph = app.getGraph(); + const image = await drawableGraph.drawMermaidPng(); + const arrayBuffer = await image.arrayBuffer(); + if (!path) { + return arrayBuffer; + } + fs.writeFileSync(path, Buffer.from(arrayBuffer)); +}; diff --git a/packages/graph/src/youtube-parser/youtube-parser.ts b/packages/graph/src/youtube-parser/youtube-parser.ts index ebe51960..625f0b68 100644 --- a/packages/graph/src/youtube-parser/youtube-parser.ts +++ b/packages/graph/src/youtube-parser/youtube-parser.ts @@ -1,12 +1,13 @@ import { END, START, StateGraph, StateGraphArgs } from "@langchain/langgraph"; import { BaseMessage } from "@langchain/core/messages"; -// import { IterableReadableStream } from "@langchain/core/"; import { extractLinks, fetchYoutube, parseTranscript, } from "@ai-citizens/tools"; import { parseXml } from "@ai-citizens/utils"; +import { IterableReadableStream } from "@langchain/core/utils/stream"; +import { generateGraphImg } from "../utils/generate-graph-img.js"; // Define the YouTube video state interface interface YouTubeVideoState { title: string; @@ -93,7 +94,7 @@ youtubeGraphBuilder }; } } catch (error) { - console.error("Error in processing video metadata", error); + // update to catch error and return state with error message to pass to handleMissingTranscription throw error; } }) @@ -145,14 +146,9 @@ youtubeGraphBuilder }; }) .addEdge(START, "getMetadata") - .addEdge("getMetadata", "getRelatedUrls") - // .addEdge("getMetadata", "extractHighlights") - .addEdge("getMetadata", "generateSummary") .addEdge("getRelatedUrls", END) - // .addEdge("extractHighlights", END) .addEdge("generateSummary", END) .addEdge("handleMissingTranscription", "getRelatedUrls") - // .addEdge("handleMissingTranscription", "extractHighlights") .addEdge("handleMissingTranscription", "generateSummary") .addConditionalEdges("getMetadata", (state) => { // @TODO: Need to fire additional logic if the transcription is empty @@ -165,6 +161,10 @@ youtubeGraphBuilder }); const youtubeGraph = youtubeGraphBuilder.compile(); +const graphImg = generateGraphImg({ + app: youtubeGraph, + path: "./youtube-graph.png", +}); export const processYouTubeVideo = async ( videoUrl?: string, config?: { configurable: { thread_id: string } } @@ -177,16 +177,16 @@ export const processYouTubeVideo = async ( }; // Example of how to use streaming -// export const streamYouTubeVideoProcessing = async ( -// videoUrl: string, -// config?: { configurable: { thread_id: string } } -// ): Promise<IterableReadableStream<YouTubeVideoState>> => { -// const initialState: Partial<YouTubeVideoState> = { -// url: videoUrl, -// }; -// const stream = await youtubeGraph.stream(initialState, { -// ...config, -// configurable: { ...config?.configurable, stream_events: true }, -// }); -// return stream; -// }; +export const streamYouTubeVideoProcessing = async ( + videoUrl: string, + config?: { configurable: { thread_id: string } } +): Promise<IterableReadableStream<YouTubeVideoState>> => { + const initialState: Partial<YouTubeVideoState> = { + url: videoUrl, + }; + const stream = await youtubeGraph.stream(initialState, { + ...config, + configurable: { ...config?.configurable, stream_events: true }, + }); + return stream; +}; diff --git a/packages/utils/src/process/index.ts b/packages/utils/src/process/index.ts index 94c430eb..afe3b442 100644 --- a/packages/utils/src/process/index.ts +++ b/packages/utils/src/process/index.ts @@ -1,3 +1,3 @@ -import convertDirToTextFile from "./convert-dir-to-text-file.js"; +import { convertDirToTextFile } from "./convert-dir-to-text-file.js"; import { parseXml } from "./parse-xml.js"; export { convertDirToTextFile, parseXml }; From 28a1b3bdc6c27fc3cd975edd9eb98129016d489a Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Sat, 3 Aug 2024 13:26:04 -0700 Subject: [PATCH 15/18] update to write config with init --- packages/cli/src/commands/chat.ts | 2 +- packages/cli/src/commands/init.ts | 70 ++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/chat.ts b/packages/cli/src/commands/chat.ts index 54ae5f92..daf8c032 100644 --- a/packages/cli/src/commands/chat.ts +++ b/packages/cli/src/commands/chat.ts @@ -9,7 +9,7 @@ import * as llm from "@ai-citizens/llm"; import { config } from "dotenv"; config({ - path: [`${process.env.AVA_CONFIG_PATH}/ava.env`, process.cwd() + "/ava.env"], + path: [`${process.env.AVA_CONFIG_PATH}/.env`, process.cwd() + "/.env"], }); const messageHistories: Record<string, InMemoryChatMessageHistory> = {}; diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 54244b07..80c9b0d4 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -2,6 +2,63 @@ import { Args, Command, Flags } from "@oclif/core"; import * as fs from "fs"; import inquirer from "inquirer"; +const defaultConfig = `{ + "modelConfig": { + "anthropic": { + "defaultModel": "claude-3-5-sonnet-20240620", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "claude-3-5-sonnet-20240620", + "claude-3-haiku-20240307", + "claude-3-opus-20240229", + "claude-3-sonnet-20240229" + ] + }, + "google": { + "defaultModel": "gemini-1.5-pro", + "temperature": 0.5, + "maxTokens": 8192, + "models": ["gemini-1.0-pro", "gemini-1.5-flash", "gemini-1.5-pro"] + }, + "openAI": { + "defaultModel": "gpt-4o", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "gpt-3.5-turbo", + "gpt-4", + "gpt-4-0125-preview", + "gpt-4-turbo", + "gpt-4o", + "gpt-4o-mini" + ] + }, + "groq": { + "defaultModel": "llama-3.1-8b-instant", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "llama-3.1-8b-instant", + "llama-3.1-70b-versatile", + "mixtral-8x7b-32768" + ] + }, + "ollama": { + "defaultModel": "llama3.1", + "temperature": 0.5, + "maxTokens": 8192, + "models": ["llama3.1"] + }, + "local": { + "defaultModel": "hermes-2-pro-llama-3-8b", + "temperature": 0.5, + "maxTokens": 8192, + "models": ["hermes-2-pro-llama-3-8b"] + } + } +}`; + enum ApiKeys { OPENAI_API_KEY = "OPENAI_API_KEY", TAVILY_API_KEY = "TAVILY_API_KEY", @@ -34,6 +91,10 @@ export default class Init extends Command { char: "f", description: "Overwrite existing config file", }), + config: Flags.boolean({ + char: "c", + description: "Create a new config file", + }), }; private readExistingConfig(configPath: string): Record<string, string> { @@ -75,7 +136,14 @@ export default class Init extends Command { const { args, flags } = await this.parse(Init); const currentDir = process.cwd(); const configPath = args.configPath || currentDir; - const envPath = configPath + "/ava.env"; + const envPath = configPath + "/.env"; + + if (flags.config) { + const configObject = JSON.parse(defaultConfig); + const formattedConfig = JSON.stringify(configObject, null, 2); + fs.writeFileSync(configPath + "/ava.config.json", formattedConfig); + } + let env = this.readExistingConfig(envPath); if (Object.keys(env).length > 0 && !flags.force) { From 99006c23bd13a238fc1d8cad69ce606ecc055004 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Sat, 3 Aug 2024 13:28:05 -0700 Subject: [PATCH 16/18] adds graph imgs --- packages/cli/ava.config.json | 64 ++++++++++++++++++ .../graph-creator/graph-generator-graph.png | Bin 0 -> 10060 bytes packages/graph/src/youtube-parser/README.md | 9 +++ .../src/youtube-parser/youtube-graph.png | Bin 0 -> 24977 bytes 4 files changed, 73 insertions(+) create mode 100644 packages/cli/ava.config.json create mode 100644 packages/graph/src/graph-creator/graph-generator-graph.png create mode 100644 packages/graph/src/youtube-parser/youtube-graph.png diff --git a/packages/cli/ava.config.json b/packages/cli/ava.config.json new file mode 100644 index 00000000..d2e8beda --- /dev/null +++ b/packages/cli/ava.config.json @@ -0,0 +1,64 @@ +{ + "modelConfig": { + "anthropic": { + "defaultModel": "claude-3-5-sonnet-20240620", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "claude-3-5-sonnet-20240620", + "claude-3-haiku-20240307", + "claude-3-opus-20240229", + "claude-3-sonnet-20240229" + ] + }, + "google": { + "defaultModel": "gemini-1.5-pro", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "gemini-1.0-pro", + "gemini-1.5-flash", + "gemini-1.5-pro" + ] + }, + "openAI": { + "defaultModel": "gpt-4o", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "gpt-3.5-turbo", + "gpt-4", + "gpt-4-0125-preview", + "gpt-4-turbo", + "gpt-4o", + "gpt-4o-mini" + ] + }, + "groq": { + "defaultModel": "llama-3.1-8b-instant", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "llama-3.1-8b-instant", + "llama-3.1-70b-versatile", + "mixtral-8x7b-32768" + ] + }, + "ollama": { + "defaultModel": "llama3.1", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "llama3.1" + ] + }, + "local": { + "defaultModel": "hermes-2-pro-llama-3-8b", + "temperature": 0.5, + "maxTokens": 8192, + "models": [ + "hermes-2-pro-llama-3-8b" + ] + } + } +} \ No newline at end of file diff --git a/packages/graph/src/graph-creator/graph-generator-graph.png b/packages/graph/src/graph-creator/graph-generator-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..75d700c3328bbc0ec9df14320c654ab744040d00 GIT binary patch literal 10060 zcmch71z1$w*YD6J&46?ZLn@t85;I5*Ff>Z%fHX)Wjnq)mNQZ!Q455TbcMhR|fRr>M zsNeX1U*Gp1_q)$`?{lBK&YW}B-h1u6*53Qf+55NF`ML1(1Aq*o0#*TFU;qFZ=mYR` z9b*Bkr1VG|s-*&csQgF4djOiS?*agD7f*Mnsv?V_kueM2hd*lkDzmWic=GH1-w?Xp zi@9H|0|3+f|BcN5E}OvG#={CNaD+ZN+|kO>#!{hqD!V^;?q9s+AH2*j-pBKaCt61P z7w@hIRYLRDXr9~dpLolE;;o*z|B`=>mXU!wd;QY&i+)*r%f>}t7k$S^p9}yG02H7K zQ2f<@bQ(>rg#duWIRJo_^mm?RCIHY90RY@y`a6%K001Bj2LPJK|IYh+OrBV{Tl}Lr zZ1fe=))oLbDFXnAjQ{}32>^i5<R4||%YS1V3%ZB_ZI>(humd;)Yyd0(Fu(<11rR`U zLV&w~djPSYD1Z_G3lsC#4^7zU9}Yea4mLIpAs!ws{w=~=w}=Rdh=@rj$cRbENr;HZ zsL9AFsenM>EmE4>)Ks@AsDM<z8o|Iq*TKdiz`-G)A|@iH`ah<hZvf=@7-4`oEDSaP zCOHNcImXXE03&+1F|jbv^t-nJTs*XiSQrGD=we+m00tHo1{MwxJ}xdU5n2WV6AK%F zgG-J_!AePePd^o(3dkm=pp()t`H_ZQ4`$)!jSv#`2u*$|47K#C@4c<)?m4y2A)=(B z8}=+Bt?n(lQF^qpUpoKNh#q|`3~U@+JanN1IRFy_69XR)4;vHf4+*qNa#m~#N~(K0 z&}1B-g4@fwBOzgn(6^Hx*>o-4*+rDBdVVeeZegLDCC4HM$N|3VmVo4WslDca4IbTh z?okGtt(wgg`D^Bi$~;v)epOlBoI)bAzeeYxPW)cJWtoa%7c)erSW}A5{GKLsAtfMf z*g<z{RLM_tTR)?Q#XHsi^H`Ojsr&)=<*d)>-XmD=IsT<?_FPwW)Gqm9jh6A|4aHVM znL)51X5as$M%h0qME!r2-`f@PmyUywdxw>j?@(lNbL6XP7?`d$ojc2ECwe)$XY+T- z=4y&!3Ttv+5W*s%_*a{rWIVf!?24U+P#q`9k|uBD?F`ke($l#1)Dlk;3G@hqAlihr z!ao55$F+xhQH@bBMuW_sfDGUHORwG~rOMsw%KSO=hp558Gc6uy+J|v%2jN>&!=Xkr zKHZuR@d=FSJ`qwi@jFUaD3XQfHBopHsBz2&zVK1AT38McvQ{ZwK3D|4eII~?UD-IZ zHuAOBs0qPf)FF8fLuz<f$Rc2u@VR0AdHl`8Ipo1$ddcf+-gis7DeE#3uHvi(`Sg0^ zwSb_FNqy-PkIV&I41~3qQ~%0HFu%LvRGjz0=(Q^+YkILHkU=S5BCMFhsf<y|$t6t! z!UH}1`q)V?C#C*8#>K|pt>?(6P&5E3jp1&^W~o>J)`q81P_#fySYMX2Z;N|Q>`j`t z2`nDnK)x`|yCM0Oi<KT;u=PgXv@lsfKt%F3gllvqW^_roWl?nH-miZsXPMXDvoR62 zF|3ieHV3pA(RvHJ40(~@rN}yfHfIpV^a<tcKK`LnbK{m@zfa~CSklnWIfaX;EOyX4 z)s93rw}H5Ww`n=$?Yn8rRuLky*mUW!gtX)1N2*|Pz8Q@t@HP`+vzMO?vsg#t?~Ds~ z(t2rIpSXrh!J0re1(9daSVg_s+koO-DxQ%_f4m@X&gSKBD^deK_f9~^+i%+I2wW8T zODW;6B#w?vv`rv%yoz4vKhBd`AXLM4zy3s^6s38+P%ZH2Tg*7>-a)cS<<zI2fbyL0 z4NQx`x}@M1)oayJ+KT=A>+2;T^Y<s1sU-mPv%=FceuI41jjUmsVl?z(8a#Soq}K{9 zR?DP*@IVUXqU4_<T|))L>P@7czTsXkqg6nfiH?dqQgqB!7GE%sG#@|C*-@rt3_}Hy z`?QhbD=XckUu2_@Z$8)TdQDI8%8TJN$cKf7T7_bV>3(?U$>H?!J9Fbt0A1sKNWppk zm*yMLi9TM9U|`EfQ{_ny$WTk>oF5!7E(W*%!Xny2I43)CgF2gIfS#}VD;dhhQGq2D zkwidO%y|DT^yy+in!;Y(8vLv7W+kbq`L%0L;Wy5~m08nF&WtHTj!`&IBdX5`d4EvM zfN;{ko%MMf$Z}dnnmwQ*;-z(Xu8eM_DqTy^pLXyvYW)N_ZjPKs@Q+NG^GyiRTgQ1# z(bM2lP_~{K@ki0S$x4B^LV?7L<JZEBw{gYfE}DZsR;m70ozJQLbo~+)1QeZwCJYS* zWYT2lq%WjZcUz!j8pq?Ms7Vw1GHGWz`Xb@goNx&Qp&o*=oFznoDR#}~uX*CT;(0bt z(}g;!ja%feJ9u+G^o6ytns;+0vr-RQ@UncmNSo&yBg1Ed2&369CoQXeAGVVvqiSXN zowE|&@+bWu2nGZi0!=NTD&fWfL9lYKt8N+>xHek5Mu&D{w}W<n0{F!Uz8(rTxVN+Y zE%z^#ekJ}*vTd!sdsrhZNIGtRxhDG0#{a5hxm@Gsd}Nj>dZzMx0>_1K2e(ZA{uCI1 z(T4zR7=c@?Z&m6C^V(lZ#@?B<hFE>BeAIs5kY{7d0R)XId$%HIV|h9*@J%%1RMx;g z3&qi8J2mJe8Zb3f0_!*(?uxg*8Q0D8^O<~=pSf$FL9u10SKV4)p<gR=@}<Z~PIzWJ z&+N>JYwKwiXJ1=9w0Yx%roGJ4)tM45KH|V_5SC*Qw3Ne<`!#_=TT})NCUj1j($)xi zaf!Xpw{K@LQDVxTE+muU{Yi#jiocQk^j03-*K+ATCRR;8SOfg}wzPlO$IFMYoW-&U zBVWQ_7H;h~$KdF!%(y8)p@A%}7^TOeE*`^Z^HWY`H7M3i-&L5n*+8qz{XVU!)CbvB zjLRT*=Cnr6Mbu+F=t|)IX^?8a?TkRW!K=Ko-#wTV;2d#GYoXTXX;tw^t=o`vY8+Pk ztOU)mQ9a}&WFENkoJnCAW3?u|%vySi@*v>3TM|N5oRG#UpIR-Wx`R+D@+J0sB?WDo z)@u7^<M9%j)sf6z0@6z*tSmE4c;sjHwzu0ga(AhvsivI6w<;iUkFp~*Ur0)14c4sj zahrXKOKPlSYr#0V>^uw%)LV~M^6kv!o_?Zar-+;N^;x`Ww}v=p)5pv6RnPj{AdSHb zdWgPBOZK5rB5L2=?TQk9;d1>b@=&bmDc4B!8@Mu&5)mPx=8x=6P6)v|o`x#hRwmQr z$*?AW+}3`7C^KWCUuMdKmioPUoc8r>d3XzEHe61ui8qubDUXiQILd4WytUBjWEM2Y zfBO}d)VXJbT{sn)^>|VwJ)ta?pEa>oVZ~_0rk{SgSw3U^r%OL0b+LZ+6uRNZ(ckhh zObV6y&v6%>%gI~Qa41MVf7D(ScDc43MCRAl*9w^EdbbR{IK#D6^$S;Xk<g7(^CG-2 zVWdjo1C=qO0<%$6IaBm~rlo}^Fizn#U5|FgJwN->7r9wFb(Z?Mrn(>(Cc(tQ6uUGp zZk(MReGmt~3K(vTL;8O2jL~@G&f(Uv_O$hcPCc~qESwlBuC_X_@5&_FRQG9dPLSO; zBj?#2+n)d|;iP3rSfji{s)E<fa9|OmJ^e03-9IXoXNJ)i`c{9n)4YGf5&5<YwU`gj zX4=5{pboW^$}l#>e%4-$ASF{JRc2phQO}fOr!0~cAW%#1b>&n~(97LCiNVv`Mc~hC zsM2laW_`*S4(b<Eh~4m@Ycf0Wqu7Y68o>)!F%s<9MMU^kJ_*Mz=GEy#Na*SEMR~Ps z8m)@^b$5FvJ{>+D)>!>K$i|z{<1GY1)Mz~@(<WO40m!s4DuCJK(~omIjkgU98*Z$) z^KR(HRPB)(k15XVg|qzLy=(U!gv2m+wan^6(xUd~9a<yhNU<Ie7^vjLxOTpIM%zp~ zN#y1X#KFT@v8F6kJ5CuWQ|rRW*gW+PL~LED_<h*3CZMt3FEBCG<rAAeY@V(G#9vZ} z<zhmMBLGPXIvgMJ5M$#GK~rtsi%rXiW6uv)p5*%YJ+wfa@akQkmvTt*OU+eaiwr^` zqELL2Vs5G=1t5RD4Q)DClJn^BJIz;ls23dXQh;A?-7QaiQ5h&8WDEhTl!HL#mssT@ zul05J1(5oy#NU?tuB{g?Z<Ch!Rp>CPS4&8VLJ(@~hqb%T9HaIe)$dFdTb2UTTw13F z6cGV^jzK*H*ko!ou!Z;y{<mT_b$glblkdNMnm3y{Oi>^fE`;i6-iY=M_-F{lkjkAR zm>}kT<p^#?7TrZuFz5*MxN`~d3T1F|EBCNh#_{8SCtH`7?wz1YV}0xw_ND^IAX~yX zC4F<h>>JyNctZZysB}no&@TB+Wp8y>1;}D4Wvj+-X+pbvJuy~I8@;4_P&l1cb`D2k zP4NltGKBaT@=9e`G4G_y`9uddM(B4Mn`Q&!5%ojqP5rsI(^Ou}e{R&w9=vbEYD~PD zhbQj~0<n`jlo2=w*<{MXZyjC;m5v^zZ8<+sG6J45xC_m^K1V=|bVK3^Vbl>NN|WUu zeB*i8YPKJ`Gdv8W=8fN@&bA4MkC-~2^l(TsR0V3Z!y-!Fz#w1C!eZDV4J9V->WZ-( zi)o&UssykW^1{|Dl$!$hI@Dmzu!}7J-2Hqpc<Ytpx%9n5`~A<{<Mf3@ZVP730Xvk* z$(u>rb*|JEy6nq<ryp<gtK$bcDsV*bTl3=((hn#ZNzC=_`@Zg(rZDU8vs6o;Z4+#d zz(j3$zU(0*45KX6Esc^F<&kl;`bh8-U?6CgvY~~q^{wscem<S!xex7FQS;7>{Nh0+ ziE^6RI6r74?UuNdNLZS1`?PXFYMCb^A$T6@b<J}xW*>JT*4+8DgFmq2o|WRHU5lA5 zUXh7nO4}(IpOAxH4|6>oO7aYn@2eO*J3Mdwb-IW0M~yj>>s?l-**lM&t{DTnwrK_x z?$JoucbCM`2Ffed&=)T#*=BZ|X36K<Jzd{Dihliaqsq+J;Q+7gl0l=EFVrW)b8u;J zn6S0xn3dNJ;(&n<r3z;$h@VL=Q^3*?nJUgCnRvO5s3xzu*ek|6JekJCWQ=>6^evRN z@%S?f^GB1~f9mV)v7%1k57F1WHgW8Y=4IB4Dq45OU{xLl!x?-t`usRJV2F0^CztYg zn4a(4lEA>d3o$RR9`i31=_V<NmEepgcs|84Eg9{_#SZOFxvO;Xxa~7lzdM=t$0Xht zncY1k)Puc?P2@ienr0pnxa*pUtC}|a&V^b9=#@1Uo+>jx+W4|HoJ*AgK_#wP$@w65 zX&+@#S66ZS;N;Z1%lr!r`P8Z}-up$=i{=WA5`jo)cxX*XnV+(%Cf#h}|8f>@chax! zWfHeILk8fzulL~<J~#^fWx`Lw*O#5!H{#P$qe!+Q<RrXS2xJ+QwetL0M_Tu))HTEq zCDnEhib*&SPjReR_xcj4#qN2#*%hU!KP(RX<iz~r$G5eGBXA0{i@9Pc5xkrqY3eZ~ zLM27D`<{N&GdzTX^gJ3{gxE@F(f8ymdYroi{P@t;d3EZ{#2J}WIyaJC^!<p=BP`3B zgS9w$ixafQK4PkUs@IkJO4I11?M-UV=H|6B2og&E*Y=IX=dku<`f+~3`n5Q3A@9HL z<o?=w{o3XIOXB}#%V#L$+Pt7irPiu!VHK)gTfz~v?gWy2oFrUf+~sBTbREw@wJT@0 z{=AQ5Dlt$?^**)j$jvCK%x8JIO0@4qoAV-!H-R{X==qDdPWMW`cRnax?90|=sgw=h z6-Hd7YulrCy6qLN$Ypm22_KPzc*qySSpB{sp_$~WSZ1Ns7%&JBf1r8v5jl_`-F2PY zHr(9d%GPT@p*_6nvL<nNhdc4EJ=PeRry|vAc&-ReNqL^=D(Y^-x-|FV_c-!~mB)A1 z9AaPW=p-%Z#(p-5o%n&6(<{0tpGF(XH~5Ly;J1%p!iL(05oZ<Sekdo?H~a0L{>;Xb z;9DKbk-hQ!0%A20EW4y%Y7eXK{({fY)L;1Mm3q^hC<4V6Fd!*0!cuLGSr~}H;s%YG z07xL@88mEW{Tn4!yfti_C~kSvxv%e%ejCPSt?eM*1`dp+=8F@7`oSA@mT0U7F3%c% zl^to^B(Swt$HM3*Z9+l?$QS1;&Sx}FBKfd`VeFct;ua_4iQVKFz9f(JU_gFn=M*+n zHJs?lG=AVyAyz?4D19iB+Uwf{yrg>&!ObCL1|gKxP{W~LN{~vxE!@-d<+5pWmZh@N zMAW~@@(7xref?cAaAxa!ZI#8h@asx`ca$xS-EgF^*!gOU`?Z@7L+p{Y%xgk=K^J!g z2%%;S&&;l@D1F-jk=XEQ)rDNc*Jd$`jUjkk{L&95H<CeP%qv{&N$@d+ZbxAajyy)M zaU>$(VM>lcUxQz_)9ymh%lo^(wayxD`aApBwf&H_7&d)IEiw|gc#;!J_aF)=N>U$& zB2eRjio<prmw6_o5CBoW?B-kd*J4cE?F65<*|w3r&{BoF3P2LNc;T#^j@m1*3W6Dz zT=|J<@clbf8;Ng{f2;Z3IsZzL_y!B7-qj(=w~W*(=3fk$-FP7rKMLGA3-h!k`+T#J z%c_KlTBzsJxdVinch~Q{?RcbbpJUq_7-fXXTWg;xK~`L)#~zDNiQQQz7D-vR7$a(Y zP5bU8YE_6|0VWxh7+~UQpYpx<b8B~-gZ4F#NA#zf<vjhGt<)9|IQ@=S<6#R3u%nk; zF{u=J60j5|id$gVY+*lIASX5`*!{7A^L?bEv9XCse3h4ftTsm9v+^~~3JyksiTP4h zz9m++vv`VwlD8tfi91~1bb7yyrj=dJo^A8g>ur4rpy~A)o|`uB#Mh6Qo7zBc>+^j7 z1b7CtBOWv|%|qHUIm7<RJ&hlzQK9n8jZsvp*LPk$owj+gF60DGV7R63VDS|}=+j0M zB3;R@Q$CSe?kEaL6{XvQO*@F?4TO5p?(BkufTkYaxpH_5>i#kvRy3^{CP7MMlHOl{ zJZm5xq}Z-C0ee5Eg;M{0vEzx@z2-7dTU^VSQ-@1@m;tSw*$26KxG{+i-pI>KvNX)( zxKzvLj<E@NMs(*DcE?EAJa?n-fkcLhRPnR7_TXtVk}O75!a|)V-UwOjqLTRaYnd@~ z6eE&<h<<e46mC>Kb=1F-;e2!em&#Uzk4jBfc=WN7N<q^QX|967o}BC&j((2F6>qNm zt(EiGM_<0KYRHPWQtsac^1oX(QBxX`SvbySX+|JavM4L?jJqndTPKaSxe{yJbWBXz z*P6e?ZMyT((CZo8y@I!A!m(Dz1@vq<)2gux_)2)BkxM(I1+y}9<F)DUUw9pUv>IZl zU#gX)6lPhVxx?Qh?QRQts0Jqnk?_}3_HmW)Vxu3S3iV9S)aGu(zy!P25Bn&~^~HDM zF`snV6$XjN4jenGKhsEp$uk%!pr}KTBUDrY0w$dBB<8hgDxdb=A0uE|a~!IBul9as zrY+HAo?2aJgez=CO`Ef^DmaD6kdFI^k?u^C+v-8J%R2*qBFjCi9^E)|_)wG}o##?E zBKjtU@`WPQC~5AQXM~t;2cBZjKvs!g9B)RvR`^`W=h4eJV`9zgffTJ%!|LL;=O!DH zY`UWZ2@9(xHRYTjCWID-iHs`q(^L2Or&&EOB5tR>wU~fz#IY22H0Fh1u(BMlgQp{$ zCp5tN{xnrjzp%rK?REPvDbI>oS=mFd6dpN1UY%P0;ZH)pJn63I<lyfMqc6GP4;{Gt zSo?Oh13|JNIs1tj_-Lwe(^ckW^!ty6<WJll2e}vB>^eZ2MeT5`kGN=u?hn`DUvY=d zUDlwE$_5{hv~+r}MQD81ot|0S)Y8z6$(e77_7Dq1IM)CRFFloLsiFO)zTPTVx<rbD z1X8|bdI_Q~H>vV_{`2s!`erMSK9#<eW9+|hF?gV>r5l_yt+#H?zFCN8vWj%=>55M^ zdAs4=Nxmbj)m}RD%3;@)&N1iV^CdA4i-utrW6L%nD?7h7$~AWg>VB$wcsTQge1#}T zf5<(%BX=m<-NzZ4T7LTvN6X(!@c)}-`$qb(Vj&xajnX)!g8)C20oR(#2)KgS!&8a1 zD4>ej9A~MNk4k0VN)t)bE_i|r@IO6I<XCCbBGQb5V+ZtdMRxI!9OFgn#!=ycr+#~b z{xb5x>Gk!+1?$p>R^xnkUW`pLs$OoaR8OaE`uA#QpuW5i$0rH?brQ;B5Z=b?;H6tm zrY$U}b);Wwv!`46E`h_d(sqfDA5tdQ<3G9K`6yM}XJp&BxG8syGG7xW?X?Ge@B0Zj zH%zu{B9x-Fp^q;sa0GMYf;o=S7p@qN6!WHBKC5ucF8`p_=G<0m&-HE?-`Q_3PR^e$ z9~d@K2YqG99jb*>Ao;mU5_@}Ex*33C>FhpF2owz7=zHoUkmb|UM(x<>1H6yAxa)lx z*n5~srLN}Bn7Kxvq&&I^rywjsmam5u7k`sq#nM=JT;5Lq!&TJrSws4xX=H_}+vnf@ z8OdKxnc=IvSM)YZ#JhrlCR?ic^nvh`$z1j5RY<H}E>vxXn@sgZ7%$H+wZyQ54Jm=i zL+u&j_4m@t#QJP=C&g69pZTduRDU_%uX$Wu+LVz!j;7+1cZ7@dBo=3wq?lLnSrU>I zaH}eho0k(f{T;3Byit;y!m`z#5WQL;Y3TRI)qUkxQ(jVscS>mJYDIbF<f3Z!=+aIk z%C~j-A<#7N`#+yI{dB`7$;L9W?n&E;LDxr+Ri9uj*xE^zSb@K4OC<x!TR!xZe5$p< zcZXtX2x2B@NtH|bQh+-zwkut7^1x|cHecB34kBJ}vAV{h9!@IP?3~`)*tY0^e2uJR z8>{PdNkF*_n4VI(JHZJI-B?QGccGr^S)X?c#FUmdTYYQ9JcuF=Tv2zBvJ$8Ulv!I@ zUljFpb~%`5g6b8=t76K@t!m*m9dKjO@i!*JRki0@6e!VtgR})xO*_tJ+a}Vk6%zi| z7)2AiACrz8oa|EtS{OPRV&nN6U%hA8Ml&SEp9hIHdo{xkQNS1z1S6Cx!`K31U$!+C zZeLC1H4);tj&!DBLe_GxW_rcW{?MhN$&BabBrk2$)&<2wA&j$)j$SN>3Bc;KWt3HG zT~cX~Lb55xqmOkY8$1u2(>LB`_^G7hakfWr#d<;%J#~(~q-PN=gt__5wIAYb{POG? zkTnjrDJhj-n~!1^sc38EEz){Z-!8A9anY<8WTJqYO64%T%6Ry-b!PFc7My3EL-AAh z?d;M|5ZV5>;+!KF9cHTIDJxS7XT;5T*D>Ztb#IW?bI+%a-P$x#M9a1}PU>288SM$k z^Pzf8WqOoDn8`0W5+NGaH(4e!f>EY^egR$lv^%d;x^m|!Hq;!H$7!HG+W0G=jan_` z$9dMZEq#SY&b|C8(fc*iuHC}UX+d3UEaQ2jHA3pq7K5=w#GC|h0j39xA94v3Dhby~ z;KNQvUJ0Xabr0VgIa)uQeFa~xd8m@IdbE;|F?E6hh%n45R6`U+wK@DMr|Qt~DY1-_ z{L?bcXvJyGJxK$4nIgoMi=Jd5ZUy5}=Y$CRgIz5~D-+#?V}F`K90cd;slazX+dUx$ zljrtBv&5{O<ijGRsUdU<o6Fdg1HSemgSQ6XNe7x7+Bp+(bXgOPW+AN!hYC@ywzr7t zjciKu9rzm6)EroVoQ_aEm4b3cz(nk859|`d+#SA<WP*(jm3I3uukS0OSPP6%LIc&} zhKqNTndX?}8x`{Q4QvMN*|)LcV#7rg45&f~u*@_JGw^xdb1K(~5I+ADJVmIPlWNi5 z&-^-(EU=0R?%5vp6ToM_9i$v<)YwpL+`MfXv_?CivRCE6V|Ye^+mx&s3uEFtWlJr2 z{0j<nXV5E+R<uy0HNS=ympkIivc&$VkT>u#W%_JwoMAz%)v{OK{N5wQEqTXb6d!cP zYV5ED3*m62;n^9-tIO_nVg#vcwB1ZJk#56Qcn&yho^SYc+ikpAi8O!_q9Aeqj+{kZ zrZQ(*Wz<D?vy&fKODjgjLK;<&sG1~Z<nTj$d~bnBrCsdE>4D;q;0TuvR=M3zd-Va1 zpnqBKq%!cL=PO;5mH&dtnm++~!G~zkpMX)=0Vr4fS)bFaINPfj=RrZj<wQHNRPvty z<92>*u0%D5CLr%2Cv%{tTaK}qNG~#0FS8zBFEb&u>oeWX{l0k37zW(3F|c$cjNxcB zw*Gw2ts2&``;jZ81f);5{?}IE4;+Ot_I>t;u`}iI@*~?%p2{BGUcu?v*f%~ji*07) z|A<!p0k{4PUH+B$SHVXa(w>Lc*=e?|DKz}qJpFEO>n+?;$bD+`wIs%_9Utdi(nmo9 zT<MDn=HZvTmrADB#Yd<F4K9+c+`0<0J#t8Eriw8_)J<v2WD>;5Lf%=i${_9=>h<sI zBk(9G2`q)tm-5Jodhc6}-M+yON+ZbOoBsa{A*;t2!V@f;ZE9A?)%EUxp)bH3ha|GV z=B@L8fG+<k^HKxFoMpZv?|qs5c3bk41gqYSuY8*S0jdoGen)&IJO6>Dn09N;UiRGJ zpD)Y7Pj491S1y+i#>|>F{HW<#5h)oRD_u`4CUlq{PvGUS?1Y0l38d_a)OBQ>I-4!* z`n+`-uBqAW+TUn&O#|;u6tTW815UL7Uw-F&RiS#IQ_U=19cV&2!@i>FYW%I4xm>k9 z>wtvjgVZ5&^VJU`%3PRvYv_{BmolkWoo-l-MQi$N|Fa6O$_*rZSQ<!7D8eMTU#}Y= zFLxa4{u&Fb2JYvIL-mmx^(f+#yJH(_1avo-FJS$2GgaH%cd`uLp{BlNXL6|x@KzM* zG}9~@o|W*}J^mBwSgr)?k9?2)3FvX+sdMSB+zRRs{wT_Qtp<cKZ>FVu?@zSNLd_MC zo<IhFtPeD3!1u;JF?|dCGICY&$WP#chbRR;fY<vaVM*X}Ykkzpqf5kMo-VGt^ozhQ znf6%0v(s2DOj2dds?^zM;#NZqd-qKewl5=VTPlPLrQ<cSKU^hSJDj?dltHJcLMwqo z7?n_oWbJUhTK6HUk7B3S;z8<24pa?kj2RcI#;1PfJ-$-?k}dt0OQe$;)YJ&xgx&Iz zNm9C~AjwIbf9Zn#S?PkyWvUnwLG*elb{LW4_ZmZhlb92-42U-<-I*_~Lb?EXrjrgz zIh-E$p{$MgkE;70R)Z1rVSE1Z<%u~gsl_|snd5aw;fAd*(tPjlsUK_uyUi?@pE#l2 zWT@)B6t)%4@HDC3YK*Q09b+(uLkEH+OYfA;ynM<D_d;Mcekxdy;=_V>u%IKoV8iCA z4lM;2k1D<c)EM+2ie3Q&qO+dLktfS>=BamBdAQ|deSN>5kKD!k3RY3!Zn+#KiI^V! zqV5M?1+R+|;vKRi0PSaW>r?8gj5uKsX@P$K{Vzi|MHgh<W3_~ri)(3Ds{5?Lxn=^1 z7nQ+}zCYOWl)Dye`%Z+5{$yd?{!fR?-}9RGsCU0qNkF7~!Wg2N7bfzm%=QHj-vb;= zYHgK*w~x`UsnV>tpMau^k*)%(;2RUUquE?~Yq9rkSr*yVpPG&370K=#LF6Y$5|y9+ zjuFF39>zn8%jnXPu2$%nT-Mc?PI=n(P@4&0F>6Ne6&?dLW+uhi4jRm_Y5Bkw8)l{A za7)#O0A8A{2GLFuApm#+aI;_={}JxheJ|Kt`;1i}x>nG!FklqUYx6sxt%WF;b@M;y zCLA!RT{g`mDXDtbp(dbJzbq}<%I2*Qw<M^my<j86)dT-j0zgnu6=-HvsA@IN6@6#E zuq(}ZGaz#2doTa1<K*w4aM_?9Q)}nNS_Ify4E;UF+jN1LA&UC)4z&dSXI8B;J_`fR z-q-Yk<@|F8$4Nt`+H{zT@-v^Ivbk4}QiFPEu4XfSn`RPVbt@uPR&-~47;)D5W)HFY z30NrJBLA`XEZ%uyaQ4=f<Vq7f@oBJ<58KYSOi??SyB29ocL@lVJNcJ~^50#Lf8q<d HpNszm2}ovp literal 0 HcmV?d00001 diff --git a/packages/graph/src/youtube-parser/README.md b/packages/graph/src/youtube-parser/README.md index 3be6a477..425b7a9f 100644 --- a/packages/graph/src/youtube-parser/README.md +++ b/packages/graph/src/youtube-parser/README.md @@ -1,3 +1,12 @@ +{langgraph_docs} +Using the above context around LangGraph, create the graph the user is requesting. + +Here is an example of how I like to structure my graphs, please make sure to add all the nodes and edges you need to the graph builder at once, trying to organize chronologically or logically is a good idea. + +Follow strict typing and type checking and guards, this is a good way to make sure that your graph is working as expected. + +Annotate logic as needed to help explain the graph to the user, but only mock out the functions of the nodes in comments and return test data where applicable. + ```ts import { END, START, StateGraph, StateGraphArgs } from "@langchain/langgraph"; import { BaseMessage } from "@langchain/core/messages"; diff --git a/packages/graph/src/youtube-parser/youtube-graph.png b/packages/graph/src/youtube-parser/youtube-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f519448f659632219c1713de407bd2d25f532a GIT binary patch literal 24977 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 literal 0 HcmV?d00001 From 1738874ca58a78ef4fb7dbdca2038f8832de7f2b Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Sat, 3 Aug 2024 13:28:54 -0700 Subject: [PATCH 17/18] update default test graph --- packages/cli/src/commands/test/graph.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/test/graph.ts b/packages/cli/src/commands/test/graph.ts index c2fa5b75..0136bc12 100644 --- a/packages/cli/src/commands/test/graph.ts +++ b/packages/cli/src/commands/test/graph.ts @@ -18,12 +18,12 @@ export default class TestGraph extends Command { public async run(): Promise<void> { const { args, flags } = await this.parse(TestGraph); - if (args.type === "youtube") { + if (args.type === "youtube" || !args.type) { const parsedVideo = await processYouTubeVideo(); console.log(parsedVideo); } - if (args.type === "graph" || !args.type) { + if (args.type === "graph") { const parsedGraph = await runGraphGenerator( "generate a graph for a chatbot", { From b230327ac220b133cbbec543fe230741bb783a70 Mon Sep 17 00:00:00 2001 From: Josh Mabry <mabry1985@gmail.com> Date: Sat, 3 Aug 2024 13:31:41 -0700 Subject: [PATCH 18/18] changeset --- .changeset/young-sloths-draw.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .changeset/young-sloths-draw.md diff --git a/.changeset/young-sloths-draw.md b/.changeset/young-sloths-draw.md new file mode 100644 index 00000000..5ba5783e --- /dev/null +++ b/.changeset/young-sloths-draw.md @@ -0,0 +1,10 @@ +--- +"@ai-citizens/prompts": patch +"@ai-citizens/graph": patch +"@ai-citizens/tools": patch +"@ai-citizens/utils": patch +"@ai-citizens/ava": patch +"@ai-citizens/llm": patch +--- + +additional cli improvements, new graphs and functionality