diff --git a/k8s/projects-frontend/values.dev.yaml b/k8s/projects-frontend/values.dev.yaml index 7845c7e5a..62f6d3376 100644 --- a/k8s/projects-frontend/values.dev.yaml +++ b/k8s/projects-frontend/values.dev.yaml @@ -5,6 +5,7 @@ config: NUXT_PUBLIC_APP_ENVIRONMENT: dev NUXT_APP_GOTENBERG_SERVER_URL: 'http://projects-gotenberg' NUXT_PUBLIC_APP_GOTENBERG_ENABLED: 'true' + NUXT_APP_LANGCHAIN_PROMPT: '' domain: k8s.lp-i.dev diff --git a/k8s/projects-frontend/values.yaml b/k8s/projects-frontend/values.yaml index 0a28cb28c..bc74cdd53 100644 --- a/k8s/projects-frontend/values.yaml +++ b/k8s/projects-frontend/values.yaml @@ -44,6 +44,7 @@ config: NUXT_APP_SORBOBOT_API_TRACE: '' NUXT_APP_GOTENBERG_SERVER_URL: '' NUXT_PUBLIC_APP_GOTENBERG_ENABLED: '' + NUXT_APP_LANGCHAIN_PROMPT: '' e2eEnv: nonSensitive: USER_ADMIN_EMAIL: testautomatatiquedministrateur1@outlook.fr diff --git a/nuxt.config.ts b/nuxt.config.ts index 6bb9c31a0..41b1dfd68 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -138,6 +138,7 @@ export default defineNuxtConfig({ appMcpServerTrace: 0, appSorbobotApiTrace: 0, appGotenbergServerUrl: '', + appLangchainPrompt: '', public: { appVersion: '', appApiOrgCode: '', diff --git a/package.json b/package.json index 0afba92e5..7250f1371 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,9 @@ "@ckpack/vue-color": "^1.5.0", "@hocuspocus/provider": "^2.15.0", "@intlify/vue-i18n-loader": "^4.2.0", + "@langchain/core": "^1.1.17", + "@langchain/langgraph": "^1.1.2", + "@langchain/openai": "^1.2.3", "@mdi/font": "^6", "@modelcontextprotocol/sdk": "^1.20.2", "@nuxt/test-utils": "^3.19.2", @@ -81,6 +84,7 @@ "deep-chat": "^2.3.0", "es-toolkit": "^1.40.0", "highlight.js": "^11", + "langchain": "^1.2.14", "leaflet": "^1", "leaflet.markercluster": "^1.5.3", "lowlight": "^3.3.0", @@ -97,6 +101,7 @@ "remixicon": "^2", "sortablejs": "^1.15.2", "sortablejs-vue3": "^1.2.11", + "uuid": "^13.0.0", "vue": "^3.5.13", "vue-chart-3": "^3.1.8", "vue-drag-resize": "^1", diff --git a/src/components/app/ChatBotDrawer.vue b/src/components/app/ChatBotDrawer.vue index 33d35c82e..bd3a0429c 100644 --- a/src/components/app/ChatBotDrawer.vue +++ b/src/components/app/ChatBotDrawer.vue @@ -34,7 +34,8 @@ const emit = defineEmits(['close']) const IS_STREAMED = ref(true) const connectOptions = { - url: IS_STREAMED.value ? '/api/chat-stream' : '/api/chat', + // url: IS_STREAMED.value ? '/api/chat-stream' : '/api/chat', + url: '/api/chat-lg-stream', stream: IS_STREAMED.value, } const usersStore = useUsersStore() @@ -127,6 +128,7 @@ const spinnerMD = `![](data:image/svg+xml;base64,${btoa(spinner)}) ` // to handle 'meta' messages get replaced by next message let replacedByNext = false const responseInterceptor = (response) => { + console.log('ChatBotDrawer responseInterceptor', response) if (response.role === 'meta') { let text = spinnerMD + t(`chatbot.${response.text}`) if (response.is_done) { @@ -145,9 +147,10 @@ const responseInterceptor = (response) => { role: 'assistant', text: IS_STREAMED.value ? response.done_text : response.text, }) - conversationId.value = response.conversationId analytics.chatbot.receive(response) } + // console.log('Updated conversation', response.conversationId) + conversationId.value = response.conversationId const overwrite = replacedByNext // no way to know when a true message begin, so just assume next is not overwrite replacedByNext = false diff --git a/src/server/routes/api/chat-lg-stream.ts b/src/server/routes/api/chat-lg-stream.ts new file mode 100644 index 000000000..cf2f80b5c --- /dev/null +++ b/src/server/routes/api/chat-lg-stream.ts @@ -0,0 +1,206 @@ +// import OpenAI from 'openai' +import { ChatOpenAI } from '@langchain/openai' +import { createAgent } from 'langchain' +import { MemorySaver } from '@langchain/langgraph' +import { SystemMessage, HumanMessage } from '@langchain/core/messages' +import { v4 as uuidv4 } from 'uuid' +const runtimeConfig = useRuntimeConfig() +const { + // appOpenaiApiPromptId, + // appOpenaiApiPromptVersion, + appOpenaiApiKey, + appOpenaiApiVectorStoreId, + appMcpServerUrl, + appMcpServerTrace, + appSorbobotApiTrace, + appLangchainPrompt, +} = runtimeConfig +const { appChatbotEnabled } = runtimeConfig.public + +// Map conversationId to token and date for authed api requests in MCP +export const tokenMap = new Map() +export const checkpointer = new MemorySaver() + +export const traceMcp = (...args) => { + if (appMcpServerTrace) { + console.log('[MCP TRACE]', ...args) + } +} + +export const traceSorbobot = (...args) => { + if (appSorbobotApiTrace) { + console.log('[Sorbobot TRACE]', ...args) + } +} + +export default defineLazyEventHandler(() => { + console.log('appChatbotEnabled:', appChatbotEnabled, 'openaiApiKey:', !!appOpenaiApiKey) + return defineEventHandler(async (event) => { + // return 404 if not configured + if (!appOpenaiApiKey || !appChatbotEnabled) { + setResponseStatus(event, 404) + return + } + + // clean up token map as a bonus + const now = new Date() + for (const [key, value] of tokenMap.entries()) { + const diff = now.getTime() - value.date.getTime() + if (diff > 60 * 60 * 1000) { + tokenMap.delete(key) + } + } + + const tokenHeader = getRequestHeader(event, 'authorization') || '' + if (tokenHeader) { + traceMcp('chat-stream: got Authorization header provided') + } else { + traceMcp('chat-stream: no Authorization header provided') + } + + setResponseHeader(event, 'Content-Type', 'text/event-stream') + setResponseHeader(event, 'Cache-Control', 'no-cache') + setResponseHeader(event, 'Connection', 'keep-alive') + setResponseStatus(event, 200) + + const body = await readBody<{ + messages: Array<{ role: string; text: string }> + conversationId?: string + }>(event) + + const messages = body.messages || [] + + // TODO handle conversation on our side + // const openai = new OpenAI({ + // apiKey: appOpenaiApiKey, + // }) + let conversationId = body.conversationId || null + if (!conversationId) { + // if no conversationId, we start a new conversation + conversationId = uuidv4() + console.log('Starting new conversation with id:', conversationId) + } + + const tools = [] + + if (appMcpServerUrl) { + traceMcp('Adding MCP tool with server URL:', appMcpServerUrl) + tools.push({ + type: 'mcp', + server_label: 'projects-local-mcp', + server_description: + 'A MCP to fetch information about projects, people and groups on this Projects platform.', + server_url: appMcpServerUrl, + require_approval: 'never', + authorization: conversationId, + }) + } + + if (appOpenaiApiVectorStoreId) { + tools.push({ + type: 'file_search', + vector_store_ids: [appOpenaiApiVectorStoreId], + }) + } + const model = appOpenaiApiKey + ? new ChatOpenAI({ + apiKey: appOpenaiApiKey, + model: 'gpt-4o-mini', + temperature: 0, + }) + : null + + const agent = createAgent({ + model, + tools, + checkpointer, + systemPrompt: new SystemMessage({ + content: [ + { + type: 'text', + content: appLangchainPrompt, + }, + ], + }), + }) + + traceMcp( + `Starting chat stream for conversation ${conversationId} with ${messages.length} messages` + ) + + tokenMap.set(conversationId, { + date: new Date(), + token: ('' + tokenHeader).replace('Bearer ', ''), + }) + const config = { + configurable: { thread_id: conversationId }, + } + + /* + EXEMPLE OUTUT PUT TOKENS: + + { + "type": "text", + "index": 0, + "text": " learning" + } + ][ + { + "type": "text", + "index": 0, + "text": " environments" + } + ][ + { + "type": "text", + "index": 0, + "text": "", + "annotations": [ + { + "type": "citation", + "source": "file_citation", + "title": "FAQ - THE PROVEST PROJECT CONTEXT.txt", + "startIndex": 522, + "file_id": "file-R1phfjqpukKyqdBHFNRhm2" + } + ] + } + ] + */ + // TODO: fix typescript mess with agent.stream return type + for await (const [token, metadata] of (await agent.stream( + { messages: messages.map((msg) => new HumanMessage(msg.text)) } as any, + { ...config, streamMode: 'messages' } + // ,{ options: { stream: true }, previous_response_id: conversationId,} + )) as AsyncIterableIterator< + [ + { + contentBlocks?: Array<{ type: string; index: number; text: string }> + }, + { status: string; langgraph_node?: any }, + ] + >) { + // TODO: handle tools and reaoning chunks + // console.log('chunk from lg node', metadata.langgraph_node) + const content = token.contentBlocks || [] + // sort in ascending index order and join texts (is it really necessary ?) + const ordered_content = content.sort((a, b) => a.index - b.index) + const text = ordered_content + .filter((part) => part.type == 'text') + .map((part) => part.text) + .join('') + const is_done = metadata.status === 'completed' + const role = 'ai' + event.node.res.write( + `data: ${JSON.stringify({ + text, + role, + is_done, + conversationId, + })}\n\n` + ) + } + + event.node.res.end() + }) +}) diff --git a/yarn.lock b/yarn.lock index 80a3d03bf..0c4857d25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -286,6 +286,11 @@ dependencies: keyv "^5.5.3" +"@cfworker/json-schema@^4.0.2": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" + integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== + "@ckpack/vue-color@^1.5.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@ckpack/vue-color/-/vue-color-1.6.0.tgz#b1cce631b96a94905a0a46ca6b61454e023c36a4" @@ -1276,6 +1281,57 @@ resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== +"@langchain/core@^1.1.17": + version "1.1.17" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-1.1.17.tgz#b5a9a9fb51e9f1963581d2f7ce1e22867865d8a6" + integrity sha512-g7/kcKbKEwNZSyyT7aT0utxn7wTOtKErqz0cL6VjrV4v/aOb9g+dKcfj17YkSm42YQmJp/rB2IXGc17vQPEBqA== + dependencies: + "@cfworker/json-schema" "^4.0.2" + ansi-styles "^5.0.0" + camelcase "6" + decamelize "1.2.0" + js-tiktoken "^1.0.12" + langsmith ">=0.4.0 <1.0.0" + mustache "^4.2.0" + p-queue "^6.6.2" + uuid "^10.0.0" + zod "^3.25.76 || ^4" + +"@langchain/langgraph-checkpoint@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.0.0.tgz#ece2ede439d0d0b0b532c4be7817fd5029afe4f8" + integrity sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A== + dependencies: + uuid "^10.0.0" + +"@langchain/langgraph-sdk@~1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-1.5.5.tgz#a84fe0f27e2ed6452a83106c3759d7673789a1f0" + integrity sha512-SyiAs6TVXPWlt/8cI9pj/43nbIvclY3ytKqUFbL5MplCUnItetEyqvH87EncxyVF5D7iJKRZRfSVYBMmOZbjbQ== + dependencies: + p-queue "^9.0.1" + p-retry "^7.1.1" + uuid "^13.0.0" + +"@langchain/langgraph@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@langchain/langgraph/-/langgraph-1.1.2.tgz#9360e01a2f23f4d25a27adddc73ea38eb3d3a976" + integrity sha512-kpZCttZ0N+jHSl5Vh/zVNElD5SxGR4sTjjLiBC00aLGf9JK+Sa/XXO6Bsk3WWXFtA1dY+4tUzUqH0mAHfN0WvA== + dependencies: + "@langchain/langgraph-checkpoint" "^1.0.0" + "@langchain/langgraph-sdk" "~1.5.5" + "@standard-schema/spec" "1.1.0" + uuid "^10.0.0" + +"@langchain/openai@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-1.2.3.tgz#39f4b843ea72d71bf653aa21896f151311027e27" + integrity sha512-+bKR4+Obz5a/NHEw0bAm3f/s4k0cXc/g46ZRRXqjcyDYP+9wFarItvGNn6DEEk5S7pGp1QqApAQNt9IZk1Ic1Q== + dependencies: + js-tiktoken "^1.0.12" + openai "^6.16.0" + zod "^3.25.76 || ^4" + "@lifeomic/attempt@^3.0.2": version "3.1.0" resolved "https://registry.yarnpkg.com/@lifeomic/attempt/-/attempt-3.1.0.tgz#7fc703559177b81a008b9d263e3d9a001d11d08a" @@ -2590,6 +2646,11 @@ resolved "https://registry.yarnpkg.com/@speed-highlight/core/-/core-1.2.7.tgz#eeaa7c1e7198559abbb98e4acbc93d108d35f2d3" integrity sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g== +"@standard-schema/spec@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== + "@standard-schema/spec@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c" @@ -2995,6 +3056,11 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== +"@types/uuid@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" + integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== + "@typescript-eslint/eslint-plugin@8.46.0", "@typescript-eslint/eslint-plugin@^8.46.0": version "8.46.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz#fc90b35d8025b5eaa66b2f6c3859cd5381a1e751" @@ -3635,6 +3701,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.3" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" @@ -4290,7 +4361,7 @@ base64-arraybuffer@^1.0.1: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== -base64-js@^1.3.1: +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== @@ -4508,16 +4579,16 @@ camelcase-keys@^7.0.0: quick-lru "^5.1.1" type-fest "^1.2.1" +camelcase@6, camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -4564,7 +4635,7 @@ chalk@^2.0.1, chalk@^2.3.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4855,6 +4926,13 @@ consola@^3.2.3, consola@^3.4.0, consola@^3.4.2: resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== +console-table-printer@^2.12.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.15.0.tgz#5c808204640b8f024d545bde8aabe5d344dfadc1" + integrity sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw== + dependencies: + simple-wcswidth "^1.1.2" + content-disposition@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" @@ -5240,7 +5318,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.2.0: +decamelize@1.2.0, decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -5926,6 +6004,11 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + eventemitter3@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" @@ -7014,6 +7097,11 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== +is-network-error@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.3.0.tgz#2ce62cbca444abd506f8a900f39d20b898d37512" + integrity sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -7216,6 +7304,13 @@ js-cookie@^3.0.5: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== +js-tiktoken@^1.0.12: + version "1.0.21" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.21.tgz#368a9957591a30a62997dd0c4cf30866f00f8221" + integrity sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g== + 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" @@ -7382,6 +7477,29 @@ known-css-properties@^0.37.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.37.0.tgz#10ebe49b9dbb6638860ff8a002fb65a053f4aec5" integrity sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ== +langchain@^1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-1.2.14.tgz#185a39349cc3be4d8b3400f62ea9fe3ae124db7e" + integrity sha512-nLtc7ZQT8VUor6eT7Yg7d43W0HDZ3wIujN2uonnvUrycK2P+i5TRDAhlcqEcGviZdVqk0TZMXcQ3IXrtSHnbvQ== + dependencies: + "@langchain/langgraph" "^1.1.2" + "@langchain/langgraph-checkpoint" "^1.0.0" + langsmith ">=0.4.0 <1.0.0" + uuid "^10.0.0" + zod "^3.25.76 || ^4" + +"langsmith@>=0.4.0 <1.0.0": + version "0.4.9" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.4.9.tgz#91479dc2d2a12d99560d4f89c1d136348e0262f4" + integrity sha512-p2/BbVDAfgiqGx8iZzPoWQ+z/Actl6isbDJcogApYIz9UcMNu0jcDzGbFivJny2vihF0gMT6yhUIOZCsqZnNsg== + dependencies: + "@types/uuid" "^10.0.0" + chalk "^4.1.2" + console-table-printer "^2.12.1" + p-queue "^6.6.2" + semver "^7.6.3" + uuid "^10.0.0" + launch-editor@^2.11.1: version "2.11.1" resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.11.1.tgz#61a0b7314a42fd84a6cbb564573d9e9ffcf3d72b" @@ -8037,6 +8155,11 @@ muggle-string@^0.4.1: resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" @@ -8477,6 +8600,11 @@ openai@^5.23.0: resolved "https://registry.yarnpkg.com/openai/-/openai-5.23.2.tgz#f13e2dc2ef6b88aab6a9b97cdc68d41a1d083c68" integrity sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg== +openai@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/openai/-/openai-6.16.0.tgz#53661d9f6307dc7523e89637ff7c6ccd0be16c67" + integrity sha512-fZ1uBqjFUjXzbGc35fFtYKEOxd20kd9fDpFeqWtsOZWiubY8CZ1NAlXHW3iathaFvqmNtCWMIsosCuyeI7Joxg== + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -8640,6 +8768,11 @@ oxc-walker@^0.5.2: dependencies: magic-regexp "^0.10.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-finally@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" @@ -8680,6 +8813,41 @@ p-map@^5.1.0: dependencies: aggregate-error "^4.0.0" +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-queue@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-9.1.0.tgz#846e517c461fb6e3cf8fc09904e57d342ac448b2" + integrity sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw== + dependencies: + eventemitter3 "^5.0.1" + p-timeout "^7.0.0" + +p-retry@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-7.1.1.tgz#7470fdecb1152ba50f1334e48378c9e401330e24" + integrity sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w== + dependencies: + is-network-error "^1.1.0" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-timeout@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-7.0.1.tgz#95680a6aa693c530f14ac337b8bd32d4ec6ae4f0" + integrity sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg== + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -10080,6 +10248,11 @@ simple-git@^3.28.0: "@kwsites/promise-deferred" "^1.1.1" debug "^4.4.0" +simple-wcswidth@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz#66722f37629d5203f9b47c5477b1225b85d6525b" + integrity sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw== + sirv@^3.0.1, sirv@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.2.tgz#f775fccf10e22a40832684848d636346f41cd970" @@ -11170,6 +11343,16 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + +uuid@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-13.0.0.tgz#263dc341b19b4d755eb8fe36b78d95a6b65707e8" + integrity sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -11877,3 +12060,8 @@ zod@^3.23.8: version "3.25.76" resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== + +"zod@^3.25.76 || ^4": + version "4.3.6" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a" + integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==