diff --git a/targets/export-elasticsearch/package.json b/targets/export-elasticsearch/package.json index ff0deccbe..fe317aa09 100644 --- a/targets/export-elasticsearch/package.json +++ b/targets/export-elasticsearch/package.json @@ -29,16 +29,20 @@ "@socialgouv/cdtn-logger": "^2.11.0", "axios": "^0.26.1", "body-parser": "^1.19.2", + "chromadb": "^1.5.3", "cors": "^2.8.5", "express": "^4.17.3", "inversify": "^6.0.1", "inversify-express-utils": "^6.4.3", + "langchain": "^0.0.105", + "openai": "^3.3.0", "reflect-metadata": "^0.1.13", "zod": "^3.14.2" }, "devDependencies": { "@shared/eslint-config": "^2.11.0", "@shared/types": "^2.11.0", + "@socialgouv/cdtn-utils": "^4.104.2", "@swc/cli": "0.1.55", "@swc/core": "1.2.150", "@swc/jest": "0.2.20", diff --git a/targets/export-elasticsearch/request.http b/targets/export-elasticsearch/request.http index a9f81213e..39fcea77c 100644 --- a/targets/export-elasticsearch/request.http +++ b/targets/export-elasticsearch/request.http @@ -26,3 +26,25 @@ POST http://localhost:8787/sitemap ### POST http://localhost:8787/copy + + +### +POST http://localhost:8787/embedding/service-public + +### +GET http://localhost:8787/embedding/service-public/infos + +### +GET http://localhost:8787/embedding/service-public?q=service + +### +GET http://localhost:8787/embedding/list + +### +POST http://localhost:8787/chat +content-type: application/json + +{ + "question": "Peux-tu m'aider à comprendre ce qu'est la période d'essai ?", + "history": "" +} \ No newline at end of file diff --git a/targets/export-elasticsearch/src/controllers/chat.ts b/targets/export-elasticsearch/src/controllers/chat.ts new file mode 100644 index 000000000..b855e835d --- /dev/null +++ b/targets/export-elasticsearch/src/controllers/chat.ts @@ -0,0 +1,20 @@ +import type { interfaces } from "inversify-express-utils"; +import { controller, httpPost, request } from "inversify-express-utils"; +import { getName } from "../utils"; +import { inject } from "inversify"; +import { ChatService } from "../services"; +import { ValidatorChatMiddleware, ValidatorChatType } from "./middlewares"; + +@controller("/chat") +export class ChatController implements interfaces.Controller { + constructor( + @inject(getName(ChatService)) + private readonly service: ChatService + ) {} + + @httpPost("/", getName(ValidatorChatMiddleware)) + async sendMessage(@request() req: Request): Promise> { + const bdy: ValidatorChatType = req.body as any; + return await this.service.ask(bdy.question, bdy.history); + } +} diff --git a/targets/export-elasticsearch/src/controllers/embedding.ts b/targets/export-elasticsearch/src/controllers/embedding.ts new file mode 100644 index 000000000..8a678a4d0 --- /dev/null +++ b/targets/export-elasticsearch/src/controllers/embedding.ts @@ -0,0 +1,43 @@ +import type { interfaces } from "inversify-express-utils"; +import { + controller, + httpGet, + httpPost, + queryParam, +} from "inversify-express-utils"; +import { getName } from "../utils"; +import { inject } from "inversify"; +import { EmbeddingService } from "../services"; + +@controller("/embedding") +export class EmbeddingController implements interfaces.Controller { + constructor( + @inject(getName(EmbeddingService)) + private readonly service: EmbeddingService + ) {} + + @httpGet("/service-public") + async getServicePublic( + @queryParam("q") query: string + ): Promise> { + if (!query) { + return { error: "Missing query parameter" }; + } + return await this.service.getServicePublicDocuments(query); + } + + @httpPost("/service-public") + async ingestServicePublic(): Promise> { + return await this.service.ingestServicePublicDocuments(); + } + + @httpGet("/service-public/infos") + async infosServicePublic(): Promise> { + return await this.service.countAndPeekServicePublicDocuments(); + } + + @httpGet("/list") + async listDocuments(): Promise> { + return await this.service.listAllDocumentsMetadata(); + } +} diff --git a/targets/export-elasticsearch/src/controllers/index.ts b/targets/export-elasticsearch/src/controllers/index.ts index 7a3979305..12faada1b 100644 --- a/targets/export-elasticsearch/src/controllers/index.ts +++ b/targets/export-elasticsearch/src/controllers/index.ts @@ -1,2 +1,4 @@ export * from "./export"; export * from "./monitoring"; +export * from "./embedding"; +export * from "./chat"; diff --git a/targets/export-elasticsearch/src/controllers/middlewares/chat.ts b/targets/export-elasticsearch/src/controllers/middlewares/chat.ts new file mode 100644 index 000000000..e1a47bb82 --- /dev/null +++ b/targets/export-elasticsearch/src/controllers/middlewares/chat.ts @@ -0,0 +1,26 @@ +import type { NextFunction, Request, Response } from "express"; +import { injectable } from "inversify"; +import { BaseMiddleware } from "inversify-express-utils"; +import { z } from "zod"; + +import { name } from "../../utils"; + +const ValidatorChat = z.object({ + question: z.string(), + history: z.string(), +}); + +export type ValidatorChatType = z.infer; + +@injectable() +@name("ValidatorChatMiddleware") +export class ValidatorChatMiddleware extends BaseMiddleware { + public handler(req: Request, res: Response, next: NextFunction): void { + const parse = ValidatorChat.safeParse(req.body); + if (parse.success) { + next(); + } else { + res.status(400).json({ errors: parse.error.issues }); + } + } +} diff --git a/targets/export-elasticsearch/src/controllers/middlewares/index.ts b/targets/export-elasticsearch/src/controllers/middlewares/index.ts index ffea9c3cf..fbb4087f7 100644 --- a/targets/export-elasticsearch/src/controllers/middlewares/index.ts +++ b/targets/export-elasticsearch/src/controllers/middlewares/index.ts @@ -1 +1,2 @@ export * from "./export"; +export * from "./chat"; diff --git a/targets/export-elasticsearch/src/repositories/documents.ts b/targets/export-elasticsearch/src/repositories/documents.ts new file mode 100644 index 000000000..ab18c0a0e --- /dev/null +++ b/targets/export-elasticsearch/src/repositories/documents.ts @@ -0,0 +1,56 @@ +import { client } from "@shared/graphql-client"; +import { logger } from "@socialgouv/cdtn-logger"; +import { injectable } from "inversify"; + +import { name } from "../utils"; +import { getDocumentBySource } from "./graphql"; + +interface Document { + id: string; + cdtnId: string; + title: string; + slug: string; + source: string; + text: string; + isPublished: boolean; + isSearchable: boolean; + metaDescription: string; + document: { + raw: string; + url: string; + date: string; + description: string; + referencedTexts?: + | { + slug: string; + type: string; + title: string; + }[] + | null; + }; + __typename: string; +} + +@injectable() +@name("DocumentsRepository") +export class DocumentsRepository { + public async getBySource(source: string): Promise { + try { + const res = await client + .query<{ documents: Document[] }>(getDocumentBySource, { + source, + }) + .toPromise(); + if (res.error) { + throw res.error; + } + if (!res.data?.documents) { + throw new Error("Failed to get, undefined object"); + } + return res.data.documents; + } catch (e) { + logger.error(e); + throw e; + } + } +} diff --git a/targets/export-elasticsearch/src/repositories/graphql/queries.ts b/targets/export-elasticsearch/src/repositories/graphql/queries.ts index 342725bbd..91d217f5d 100644 --- a/targets/export-elasticsearch/src/repositories/graphql/queries.ts +++ b/targets/export-elasticsearch/src/repositories/graphql/queries.ts @@ -83,3 +83,19 @@ query getExportEsStatusByStatus($status: String!) { updated_at } }`; + +export const getDocumentBySource = ` +query getDocumentBySource($source: String!) { + documents(where: {source: {_eq: $source}, is_available: {_eq: true} }) { + id: initial_id + cdtnId: cdtn_id + title + slug + source + text + isPublished: is_published + isSearchable: is_searchable + metaDescription: meta_description + document + } +}`; diff --git a/targets/export-elasticsearch/src/repositories/index.ts b/targets/export-elasticsearch/src/repositories/index.ts index 8d76d51da..665bba91c 100644 --- a/targets/export-elasticsearch/src/repositories/index.ts +++ b/targets/export-elasticsearch/src/repositories/index.ts @@ -1,2 +1,3 @@ export * from "./azure"; export * from "./status"; +export * from "./documents"; diff --git a/targets/export-elasticsearch/src/server.ts b/targets/export-elasticsearch/src/server.ts index 5da20eae4..a063091bf 100644 --- a/targets/export-elasticsearch/src/server.ts +++ b/targets/export-elasticsearch/src/server.ts @@ -7,14 +7,20 @@ import type { NextFunction, Request, Response } from "express"; import { Container } from "inversify"; import { InversifyExpressServer } from "inversify-express-utils"; -import { ExportEsRunMiddleware } from "./controllers/middlewares"; +import { + ExportEsRunMiddleware, + ValidatorChatMiddleware, +} from "./controllers/middlewares"; import { AzureParameters, AzureRepository, + DocumentsRepository, ExportRepository, } from "./repositories"; import { + ChatService, CopyContainerService, + EmbeddingService, ExportService, SitemapService, } from "./services"; @@ -51,19 +57,31 @@ rootContainer process.env.AZ_URL_TO ?? `https://${process.env.AZ_ACCOUNT_NAME_TO}.blob.core.windows.net` ); + rootContainer .bind(getName(ExportRepository)) .to(ExportRepository); +rootContainer + .bind(getName(DocumentsRepository)) + .to(DocumentsRepository); + /* MIDDLEWARE */ rootContainer .bind(getName(ExportEsRunMiddleware)) .to(ExportEsRunMiddleware); +rootContainer + .bind(getName(ValidatorChatMiddleware)) + .to(ValidatorChatMiddleware); /* SERVICES */ rootContainer.bind(getName(ExportService)).to(ExportService); rootContainer.bind(getName(SitemapService)).to(SitemapService); rootContainer .bind(getName(CopyContainerService)) .to(CopyContainerService); +rootContainer + .bind(getName(EmbeddingService)) + .to(EmbeddingService); +rootContainer.bind(getName(ChatService)).to(ChatService); // create server const server = new InversifyExpressServer(rootContainer); diff --git a/targets/export-elasticsearch/src/services/chat.ts b/targets/export-elasticsearch/src/services/chat.ts new file mode 100644 index 000000000..1735ac407 --- /dev/null +++ b/targets/export-elasticsearch/src/services/chat.ts @@ -0,0 +1,63 @@ +import { injectable } from "inversify"; +import { name } from "../utils"; +import { ConversationalRetrievalQAChain } from "langchain/chains"; +import { OpenAIEmbeddings } from "langchain/embeddings/openai"; +import { ChatOpenAI } from "langchain/chat_models/openai"; +import { BaseLanguageModel } from "langchain/base_language"; +import { Chroma } from "langchain/vectorstores/chroma"; + +@injectable() +@name("ChatService") +export class ChatService { + model: BaseLanguageModel; + private QA_PROMPT = `Vous êtes un assistant juridique. Utilisez uniquement les éléments de contexte pour répondre à la question. + Votre réponse doit uniquement être en français. + Si vous ne connaissez pas la réponse, dites simplement que vous ne savez pas. N'essayez PAS d'inventer une réponse. + Si la question n'est pas liée au contexte, répondez poliment que vous êtes réglé pour répondre uniquement aux questions liées au contexte. + S'il vous manque des éléments de contexte, demandez à l'utilisateur de vous les fournir dans le cas où il y a plusieurs réponses possibles. + N'hésitez pas à donner des examples pour agrémenter votre réponse. De plus, n'hésite pas à reformuler la réponse pour la rendre plus claire. + {context} + Question: {question} + `; + private CONDENSE_PROMPT = `Compte tenu de la conversation suivante et d'une question de suivi, reformulez la question de suivi pour en faire une question autonome. + Historique du chat: + {chat_history} + Entrée de suivi: {question} + Question autonome: + `; + + constructor() { + this.model = new ChatOpenAI({ + openAIApiKey: process.env.OPENAI_API_KEY, + streaming: true, + modelName: "gpt-3.5-turbo-16k-0613", + temperature: 0, + }); + } + + async ask(question: string, historyMessage: string) { + const vectorStore = await Chroma.fromExistingCollection( + new OpenAIEmbeddings({ + openAIApiKey: process.env.OPENAI_API_KEY, + }), + { collectionName: "service-public" } + ); + + const chain = ConversationalRetrievalQAChain.fromLLM( + this.model, + vectorStore.asRetriever(), + { + returnSourceDocuments: true, + qaTemplate: this.QA_PROMPT, + questionGeneratorTemplate: this.CONDENSE_PROMPT, + } + ); + + const result = await chain.call({ + question, + chat_history: historyMessage, + }); + + return result; + } +} diff --git a/targets/export-elasticsearch/src/services/embedding.ts b/targets/export-elasticsearch/src/services/embedding.ts new file mode 100644 index 000000000..089bf82fc --- /dev/null +++ b/targets/export-elasticsearch/src/services/embedding.ts @@ -0,0 +1,87 @@ +import { inject, injectable } from "inversify"; + +import { getName, name, wait } from "../utils"; +import { DocumentsRepository } from "../repositories"; +import { SOURCES } from "@socialgouv/cdtn-utils"; +import { + ChromaClient, + IEmbeddingFunction, + OpenAIEmbeddingFunction, +} from "chromadb"; + +@injectable() +@name("EmbeddingService") +export class EmbeddingService { + client: ChromaClient; + embedder: IEmbeddingFunction; + private SERVICE_PUBLIC_COLLECTION = "service-public"; + + constructor( + @inject(getName(DocumentsRepository)) + private readonly documentsRepository: DocumentsRepository + ) { + this.client = new ChromaClient(); + this.embedder = new OpenAIEmbeddingFunction({ + openai_api_key: process.env.OPENAI_API_KEY!, + }); + } + + // TODO: this code is working only for the first 75 documents because there is a limit in EmbeddingFunction + async ingestServicePublicDocuments() { + const BATCH_SIZE = 5; + const results = await this.documentsRepository.getBySource( + SOURCES.SHEET_SP + ); + const collection = await this.client.getOrCreateCollection({ + name: this.SERVICE_PUBLIC_COLLECTION, + embeddingFunction: this.embedder, + }); + for (let i = 0; i < results.length; i += BATCH_SIZE) { + const batch = results.slice(i, i + BATCH_SIZE); + const ids = batch.map((r) => r.cdtnId); + const documents = batch.map((r) => r.text); + const metadatas = batch.map((r) => ({ + title: r.title, + metaDescription: r.metaDescription, + })); + await collection.upsert({ + ids, + metadatas, + documents, + }); + await wait(1000); + } + + return { result: "Service public ingested" }; + } + + async getServicePublicDocuments(query: string) { + const collection = await this.client.getOrCreateCollection({ + name: this.SERVICE_PUBLIC_COLLECTION, + embeddingFunction: this.embedder, + }); + const result = await collection.query({ + queryTexts: [query], + }); + return result; + } + + async countAndPeekServicePublicDocuments() { + const collection = await this.client.getOrCreateCollection({ + name: this.SERVICE_PUBLIC_COLLECTION, + embeddingFunction: this.embedder, + }); + const numDocs = await collection.count(); + const peek = await collection.peek(); + return { numDocs, peek }; + } + + async listAllDocumentsMetadata() { + const collection = await this.client.getOrCreateCollection({ + name: this.SERVICE_PUBLIC_COLLECTION, + embeddingFunction: this.embedder, + }); + const documents = await collection.get(); + return documents.metadatas; + } +} diff --git a/targets/export-elasticsearch/src/services/index.ts b/targets/export-elasticsearch/src/services/index.ts index f89e3e3e2..cc9017e75 100644 --- a/targets/export-elasticsearch/src/services/index.ts +++ b/targets/export-elasticsearch/src/services/index.ts @@ -1,3 +1,5 @@ export * from "./copy"; export * from "./export"; export * from "./sitemap"; +export * from "./embedding"; +export * from "./chat"; diff --git a/targets/frontend/src/pages/chat.tsx b/targets/frontend/src/pages/chat.tsx new file mode 100644 index 000000000..2e8dd53fe --- /dev/null +++ b/targets/frontend/src/pages/chat.tsx @@ -0,0 +1,218 @@ +import React from "react"; +import { Paper, Typography, TextField } from "@mui/material"; +import { Button } from "theme-ui"; +import type { InferGetServerSidePropsType, GetServerSideProps } from "next"; + +const classes = { + root: { + display: "flex", + flexDirection: "column", + height: "100vh", + }, + chatContainer: { + flexGrow: 1, + overflow: "auto", + padding: "1rem", + }, + message: { + marginBottom: "1rem", + }, + inputContainer: { + display: "flex", + padding: "1rem", + }, + input: { + flexGrow: 1, + marginRight: "1rem", + }, + refContainer: { + maxHeight: "20vh", + overflow: "auto", + padding: "1rem", + }, +} as const; + +type Answer = { + text: string; + sourceDocuments: SourceDocument[]; +}; + +type SourceDocument = { + pageContent: string; + metadata: Metadata; +}; + +type Metadata = { + title: string; + metaDescription: string; +}; + +type ChatMessage = ChatbotResponse | HumanResponse; + +type ChatbotResponse = { + type: "chatbot"; + message: string; + sourceDocuments: SourceDocument[]; +}; + +type HumanResponse = { + type: "human"; + message: string; +}; + +type PageProps = { + references: Metadata[]; +}; + +const ChatPage = ({ + references, +}: InferGetServerSidePropsType) => { + const [messages, setMessages] = React.useState([ + { + type: "chatbot", + message: + "Bonjour, je suis le chatbot du CDTN. Comment puis-je vous aider ?", + sourceDocuments: [], + }, + ]); + const [message, setMessage] = React.useState(""); + const [isLoading, setIsLoading] = React.useState(false); + + const onSendMessage = async () => { + if (isLoading || message === "") return; + setIsLoading(true); + const msg: ChatMessage[] = [ + ...messages, + { + type: "human", + message: message, + }, + ]; + setMessage(""); + setMessages(msg); + const historyMessages = msg.reduce((acc, curr) => acc + curr.message, ""); + + const response = await fetch("http://localhost:8787/chat", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ question: message, history: historyMessages }), + }); + const data: Answer = await response.json(); + setMessages([ + ...msg, + { + type: "chatbot", + message: data.text, + sourceDocuments: data.sourceDocuments, + }, + ]); + setIsLoading(false); + }; + + return ( +
+ {references.length > 0 && ( + + Références +
    + {references.map((reference, index) => { + return ( +
  • + {reference.title} + + {reference.metaDescription} + +
  • + ); + })} +
+
+ )} + + Chat + {messages.map((msg, index) => { + return ( +
+ + {msg.type === "chatbot" ? "CDTN Bot" : "Moi"} + + {msg.message} + {msg.type === "chatbot" && msg.sourceDocuments.length > 0 && ( +
+ + Ci-dessous vous trouverez les infos qui m'ont permis de + répondre à la question : + +
    + {msg.sourceDocuments.map((sourceDocument, index) => { + return ( +
  • + + {sourceDocument.metadata.title} + + + {sourceDocument.metadata.metaDescription} + +
  • + ); + })} +
+
+ )} +
+ ); + })} + {isLoading && ( + <> + + CDTN Bot + + Je réfléchis... + + )} +
+
+ setMessage(e.target.value)} + onKeyPress={(e) => { + if (e.key === "Enter") { + onSendMessage(); + } + }} + /> + +
+
+ ); +}; + +export const getServerSideProps: GetServerSideProps = async () => { + const response = await fetch("http://localhost:8787/embedding/list"); + const data: Metadata[] = await response.json(); + return { props: { references: data } }; +}; + +export default ChatPage; diff --git a/yarn.lock b/yarn.lock index ade5a565e..1436a1f7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,6 +20,14 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@anthropic-ai/sdk@^0.4.3": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.4.4.tgz#7da97a30f8a69a44e2e18ec1f8a0dea8a656f0b9" + integrity sha512-Z/39nQi1sSUCeLII3lsAbL1u+0JF6cR2XmUEX9sLH0VtxmIjY6cjOUYjCkYh4oapTxOkhAFnVSAFJ6cxml2qXg== + dependencies: + "@fortaine/fetch-event-source" "^3.0.6" + cross-fetch "^3.1.5" + "@azure/abort-controller@^1.0.0", "@azure/abort-controller@^1.0.4": version "1.1.0" resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249" @@ -1528,6 +1536,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== +"@fortaine/fetch-event-source@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@fortaine/fetch-event-source/-/fetch-event-source-3.0.6.tgz#b8552a2ca2c5202f5699b93a92be0188d422b06e" + integrity sha512-621GAuLMvKtyZQ3IA6nlDWhV1V/7PGOTNIGLUifxt0KzM+dZIweJ6F3XvQF3QnqeNfS1N7WQ0Kil1Di/lhChEw== + "@fortawesome/fontawesome-common-types@^0.2.32": version "0.2.36" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903" @@ -3944,6 +3957,11 @@ styled-components "^5.3.0" use-onclickoutside "^0.4.0" +"@socialgouv/cdtn-utils@^4.104.2": + version "4.104.2" + resolved "https://registry.yarnpkg.com/@socialgouv/cdtn-utils/-/cdtn-utils-4.104.2.tgz#2d4cf13e9545e681d36fea494dead220472c2300" + integrity sha512-HzwXF27odkBPFmqR6ESsNLmPl9y3mI9U+Xu2+IUs4fxQz1MUOcelpaWNpLJrhy2lDOHrRGwA+LI1l4ilqg3CJA== + "@socialgouv/contributions-data-types@3.27.0": version "3.27.0" resolved "https://registry.yarnpkg.com/@socialgouv/contributions-data-types/-/contributions-data-types-3.27.0.tgz#5b1ed3553d0b9f47c28d7204e1e85ee07cd8b359" @@ -5033,6 +5051,11 @@ dependencies: "@types/node" "*" +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + "@types/retry@0.12.1": version "0.12.1" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" @@ -5165,6 +5188,11 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== +"@types/uuid@^9.0.1": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.2.tgz#ede1d1b1e451548d44919dc226253e32a6952c4b" + integrity sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ== + "@types/xxhashjs@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@types/xxhashjs/-/xxhashjs-0.2.2.tgz#f72d9398e94b3cb59f53b784186a70b472e61376" @@ -5840,7 +5868,7 @@ axios@^0.24.0: dependencies: follow-redirects "^1.14.4" -axios@^0.26.1: +axios@^0.26.0, axios@^0.26.1: version "0.26.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== @@ -6067,7 +6095,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -6099,11 +6127,16 @@ bin-links@^3.0.0: rimraf "^3.0.0" write-file-atomic "^4.0.0" -binary-extensions@^2.0.0: +binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +binary-search@^1.3.5: + version "1.3.6" + resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" + integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== + bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -6534,6 +6567,11 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" +camelcase@6, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -6544,11 +6582,6 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - camelize@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" @@ -6690,6 +6723,11 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chromadb@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/chromadb/-/chromadb-1.5.3.tgz#554b427b090b48b445b73ac40ee06fb84c6c0b1f" + integrity sha512-oQYs3cbSJJiSMYipL/5btX8U3bnW5X1CEMpJnl83XEGWR0uvRp8GtoznKPKPTcuVBMMtKkE1MdeMckWA72M4lw== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -6971,6 +7009,11 @@ commander@2.6.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" integrity sha512-PhbTMT+ilDXZKqH8xbvuUY2ZEQNef0Q7DKxgoEKb4ccytsdvVVJmYqR0sGbi96nxU6oGrwEIQnclpK2NBZuQlg== +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -7362,6 +7405,13 @@ cross-env@^3.1.4: cross-spawn "^5.1.0" is-windows "^1.0.0" +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -8934,6 +8984,11 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== +expr-eval@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" + integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== + express@^4.17.1, express@^4.17.3: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" @@ -10535,6 +10590,11 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" +is-any-array@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" + integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== + is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -11860,6 +11920,13 @@ js-cookie@3.0.1: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414" integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw== +js-tiktoken@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.7.tgz#56933fcd2093e8304060dfde3071bda91812e6f5" + integrity sha512-biba8u/clw7iesNEWLOLwrNGoBP2lA+hTaBLs/D45pJdUPFXyxD6nhcDVtADChghv4GgyAiMKYMiRx7x6h7Biw== + dependencies: + base64-js "^1.5.1" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -12038,6 +12105,11 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsonpointer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + jsonwebtoken@8.5.1, jsonwebtoken@^8.5.1: version "8.5.1" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" @@ -12192,6 +12264,44 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== +langchain@^0.0.105: + version "0.0.105" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.0.105.tgz#874ab2f6732e8189b4fe7ebbb4229e1049eb1d36" + integrity sha512-iytaHWDQw6U1KG47MTeZOlzQeWGjadBWXxkf1LkmZSPnbGsgFHea/fufKcaIrhsHJn7whf7UIhuBjqu+6TjDmg== + dependencies: + "@anthropic-ai/sdk" "^0.4.3" + ansi-styles "^5.0.0" + binary-extensions "^2.2.0" + camelcase "6" + decamelize "^1.2.0" + expr-eval "^2.0.2" + flat "^5.0.2" + js-tiktoken "^1.0.7" + js-yaml "^4.1.0" + jsonpointer "^5.0.1" + langchainplus-sdk "^0.0.19" + ml-distance "^4.0.0" + object-hash "^3.0.0" + openai "^3.3.0" + openapi-types "^12.1.3" + p-queue "^6.6.2" + p-retry "4" + uuid "^9.0.0" + yaml "^2.2.1" + zod "^3.21.4" + zod-to-json-schema "^3.20.4" + +langchainplus-sdk@^0.0.19: + version "0.0.19" + resolved "https://registry.yarnpkg.com/langchainplus-sdk/-/langchainplus-sdk-0.0.19.tgz#356774670fbbe75dd17932c46492544959660aa2" + integrity sha512-WKMN90E8M/JWO9lajbw8sv32xVHUZM+fN9I4LUveffBoX4qoJFi6uzYeDH0loW2SjnOSh3Tnzlz+Qp6ZenCu6g== + dependencies: + "@types/uuid" "^9.0.1" + commander "^10.0.1" + p-queue "^6.6.2" + p-retry "4" + uuid "^9.0.0" + language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -13155,6 +13265,42 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +ml-array-mean@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" + integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== + dependencies: + ml-array-sum "^1.1.6" + +ml-array-sum@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" + integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== + dependencies: + is-any-array "^2.0.0" + +ml-distance-euclidean@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" + integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== + +ml-distance@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" + integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw== + dependencies: + ml-array-mean "^1.1.6" + ml-distance-euclidean "^2.0.0" + ml-tree-similarity "^1.0.0" + +ml-tree-similarity@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" + integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== + dependencies: + binary-search "^1.3.5" + num-sort "^2.0.0" + modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -13420,6 +13566,13 @@ node-fetch@^2.6.1, node-fetch@^2.6.5, node-fetch@^2.6.6, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.12: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + node-gyp-build@^4.3.0: version "4.6.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" @@ -13754,6 +13907,11 @@ nth-check@^2.0.0: dependencies: boolbase "^1.0.0" +num-sort@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" + integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== + numeral@2.0.6, numeral@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" @@ -13825,6 +13983,11 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" @@ -13966,6 +14129,19 @@ open@^9.1.0: is-inside-container "^1.0.0" is-wsl "^2.2.0" +openai@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/openai/-/openai-3.3.0.tgz#a6408016ad0945738e1febf43f2fccca83a3f532" + integrity sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ== + dependencies: + axios "^0.26.0" + form-data "^4.0.0" + +openapi-types@^12.1.3: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + opn-cli@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/opn-cli/-/opn-cli-3.1.0.tgz#f819ae6cae0b411bd0149b8560fe6c88adad20f8" @@ -14161,6 +14337,14 @@ p-reduce@^2.0.0, p-reduce@^2.1.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== +p-retry@4: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + p-retry@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-5.1.1.tgz#1950b9be441474a67f852811c1d4ec955885d2c8" @@ -18321,6 +18505,11 @@ uuid@^8.3.0, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -18878,6 +19067,11 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -18977,7 +19171,12 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -zod@^3.14.2: +zod-to-json-schema@^3.20.4: + version "3.21.3" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.21.3.tgz#2ce40860570217979ad5c9734e2e2df717784859" + integrity sha512-09W/9oyxeF1/wWnzCb6MursW+lOzgKi91QwE7eTBbC+t/qgfuLsUVDai3lHemSQnQu/UONAcT/fv3ZnDvbTeKg== + +zod@^3.14.2, zod@^3.21.4: version "3.21.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==