diff --git a/CHANGELOG.md b/CHANGELOG.md index 006a85a..413d6f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v0.1.6 - 2024-04-22 + +### Changed + +- Introduce langchain as backend engine provider + ## v0.1.5 - 2024-01-07 ### Fixed diff --git a/package.json b/package.json index 710502e..4122413 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "notionai-plus", "displayName": "NotionAI Plus", - "version": "0.1.5", + "version": "0.1.6", "description": "NotionAI Plus is a browser extension that brings the power of NotionAI to any website you visit.", "scripts": { "dev": "plasmo dev", @@ -13,6 +13,11 @@ "@headlessui/react": "^1.7.17", "@headlessui/tailwindcss": "^0.1.3", "@heroicons/react": "^2.0.18", + "@langchain/community": "^0.0.50", + "@langchain/core": "^0.1.58", + "@langchain/google-genai": "^0.0.11", + "@langchain/groq": "^0.0.8", + "@langchain/openai": "^0.0.28", "@plasmohq/messaging": "^0.1.8", "@plasmohq/storage": "^1.9.0", "@radix-ui/themes": "^2.0.1", @@ -21,6 +26,7 @@ "claude-ai": "^1.2.2", "eventsource-parser": "^1.1.1", "jotai": "^2.6.0", + "langchain": "^0.1.34", "lodash-es": "^4.17.21", "lucide-react": "^0.121.0", "ofetch": "^1.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a642a55..6fbfed7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,21 @@ dependencies: '@heroicons/react': specifier: ^2.0.18 version: 2.0.18(react@18.2.0) + '@langchain/community': + specifier: ^0.0.50 + version: 0.0.50 + '@langchain/core': + specifier: ^0.1.58 + version: 0.1.58 + '@langchain/google-genai': + specifier: ^0.0.11 + version: 0.0.11 + '@langchain/groq': + specifier: ^0.0.8 + version: 0.0.8 + '@langchain/openai': + specifier: ^0.0.28 + version: 0.0.28 '@plasmohq/messaging': specifier: ^0.1.8 version: 0.1.8(react@18.2.0) @@ -38,6 +53,9 @@ dependencies: jotai: specifier: ^2.6.0 version: 2.6.0(@types/react@18.0.27)(react@18.2.0) + langchain: + specifier: ^0.1.34 + version: 0.1.34 lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -163,6 +181,22 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 + /@anthropic-ai/sdk@0.9.1: + resolution: {integrity: sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA==} + dependencies: + '@types/node': 18.11.18 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + digest-fetch: 1.3.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + dev: false + /@babel/code-frame@7.23.4: resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} engines: {node: '>=6.9.0'} @@ -694,6 +728,11 @@ packages: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} dev: false + /@google/generative-ai@0.1.3: + resolution: {integrity: sha512-Cm4uJX1sKarpm1mje/MiOIinM7zdUUrQp/5/qGPAgznbdd/B9zup5ehT6c1qGqycFcSopTA1J1HpqHS5kJR8hQ==} + engines: {node: '>=18.0.0'} + dev: false + /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} engines: {node: '>=10'} @@ -768,6 +807,349 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@langchain/community@0.0.50: + resolution: {integrity: sha512-ZxS0qmvEKlRYPtIPnzSa+un82mqi+DpxEsME6aLJSxEmQpk4vwoArcL/KzHEtM8vsi3ZKB15f7BNS6Qp00rizg==} + engines: {node: '>=18'} + peerDependencies: + '@aws-crypto/sha256-js': ^5.0.0 + '@aws-sdk/client-bedrock-agent-runtime': ^3.485.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-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 + '@clickhouse/client': ^0.2.5 + '@cloudflare/ai': '*' + '@datastax/astra-db-ts': ^1.0.0 + '@elastic/elasticsearch': ^8.4.0 + '@getmetal/metal-sdk': '*' + '@getzep/zep-js': ^0.9.0 + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@google-ai/generativelanguage': ^0.2.1 + '@gradientai/nodejs-sdk': ^1.2.0 + '@huggingface/inference': ^2.6.4 + '@mozilla/readability': '*' + '@opensearch-project/opensearch': '*' + '@pinecone-database/pinecone': '*' + '@planetscale/database': ^1.8.0 + '@premai/prem-sdk': ^0.3.25 + '@qdrant/js-client-rest': ^1.2.0 + '@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 + '@supabase/postgrest-js': ^1.1.1 + '@supabase/supabase-js': ^2.10.0 + '@tensorflow-models/universal-sentence-encoder': '*' + '@tensorflow/tfjs-converter': '*' + '@tensorflow/tfjs-core': '*' + '@upstash/redis': ^1.20.6 + '@upstash/vector': ^1.0.7 + '@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.5.4 + '@zilliz/milvus2-sdk-node': '>=2.2.7' + better-sqlite3: ^9.4.0 + cassandra-driver: ^4.7.2 + cborg: ^4.1.1 + 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 + discord.js: ^14.14.1 + dria: ^0.0.3 + duck-duck-scrape: ^2.2.5 + faiss-node: ^0.5.1 + firebase-admin: ^11.9.0 || ^12.0.0 + google-auth-library: ^8.9.0 + googleapis: ^126.0.1 + hnswlib-node: ^1.4.2 + html-to-text: ^9.0.5 + 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 + mongodb: '>=5.2.0' + mysql2: ^3.3.3 + neo4j-driver: '*' + node-llama-cpp: '*' + pg: ^8.11.0 + pg-copy-streams: ^6.0.5 + pickleparser: ^0.2.1 + portkey-ai: ^0.1.11 + redis: '*' + replicate: ^0.18.0 + typeorm: ^0.3.12 + 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 + 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-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@azure/search-documents': + 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-js': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@google-ai/generativelanguage': + optional: true + '@gradientai/nodejs-sdk': + optional: true + '@huggingface/inference': + optional: true + '@mozilla/readability': + 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 + '@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/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 + better-sqlite3: + optional: true + cassandra-driver: + optional: true + cborg: + 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 + discord.js: + optional: true + dria: + optional: true + duck-duck-scrape: + 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 + 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 + mongodb: + optional: true + mysql2: + optional: true + neo4j-driver: + optional: true + node-llama-cpp: + optional: true + pg: + optional: true + pg-copy-streams: + optional: true + pickleparser: + optional: true + portkey-ai: + optional: true + redis: + optional: true + replicate: + 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 + dependencies: + '@langchain/core': 0.1.58 + '@langchain/openai': 0.0.28 + expr-eval: 2.0.2 + flat: 5.0.2 + langsmith: 0.1.18 + uuid: 9.0.1 + zod: 3.23.0 + zod-to-json-schema: 3.22.5(zod@3.23.0) + transitivePeerDependencies: + - encoding + dev: false + + /@langchain/core@0.1.58: + resolution: {integrity: sha512-a3b2wQbseLLnoRfQY3W6cnbSreHlPfrCoi41kznzzXTgToPK7cSeCn1wOK4CmLdWu9HCk8cm3x5yM5FXPNEP+Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.11 + langsmith: 0.1.18 + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + zod: 3.23.0 + zod-to-json-schema: 3.22.5(zod@3.23.0) + dev: false + + /@langchain/google-genai@0.0.11: + resolution: {integrity: sha512-o4+r+ETmcPqcrRTJeJQQ0c796IAx1dvVkZvFsUqLhTIteIQuAc2KenY/UDGQxZVghw6fZf4irN/PvkNHJjfgWw==} + engines: {node: '>=18'} + dependencies: + '@google/generative-ai': 0.1.3 + '@langchain/core': 0.1.58 + dev: false + + /@langchain/groq@0.0.8: + resolution: {integrity: sha512-xqbe35K+12fiYtC/uqkaTT4AXxqL5uvhCrHzc+nBoFkTwM6YfTFE1ch95RZ5G2JnK1U9pKAre/trUSzlU1/6Kg==} + engines: {node: '>=18'} + dependencies: + '@langchain/core': 0.1.58 + '@langchain/openai': 0.0.28 + groq-sdk: 0.3.2 + zod: 3.23.0 + zod-to-json-schema: 3.22.5(zod@3.23.0) + transitivePeerDependencies: + - encoding + dev: false + + /@langchain/openai@0.0.28: + resolution: {integrity: sha512-2s1RA3/eAnz4ahdzsMPBna9hfAqpFNlWdHiPxVGZ5yrhXsbLWWoPcF+22LCk9t0HJKtazi2GCIWc0HVXH9Abig==} + engines: {node: '>=18'} + dependencies: + '@langchain/core': 0.1.58 + js-tiktoken: 1.0.11 + openai: 4.38.2 + zod: 3.23.0 + zod-to-json-schema: 3.22.5(zod@3.23.0) + transitivePeerDependencies: + - encoding + dev: false + /@lezer/common@0.15.12: resolution: {integrity: sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==} dev: false @@ -4099,9 +4481,15 @@ packages: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: false + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + dependencies: + '@types/node': 18.11.18 + form-data: 4.0.0 + dev: false + /@types/node@18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} - dev: true /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4122,6 +4510,10 @@ packages: '@types/scheduler': 0.16.8 csstype: 3.1.2 + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: false + /@types/scheduler@0.16.8: resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} @@ -4133,6 +4525,10 @@ packages: resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} dev: false + /@types/uuid@9.0.8: + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + dev: false + /@types/webextension-polyfill@0.10.7: resolution: {integrity: sha512-10ql7A0qzBmFB+F+qAke/nP1PIonS0TXZAOMVOxEUsm+lGSW6uwVcISFNa0I4Oyj0884TZVWGGMIWeXOVSNFHw==} dev: true @@ -4360,6 +4756,13 @@ packages: deprecated: Use your platform's native atob() and btoa() methods instead dev: false + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /abortcontroller-polyfill@1.7.5: resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} dev: false @@ -4414,6 +4817,13 @@ packages: - supports-color dev: false + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -4446,6 +4856,11 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: false @@ -4542,6 +4957,10 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base-64@0.1.0: + resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} + dev: false + /base-x@3.0.9: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} dependencies: @@ -4556,6 +4975,10 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /binary-search@1.3.6: + resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} + dev: false + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -4732,6 +5155,10 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: false + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + /chnl@1.2.0: resolution: {integrity: sha512-g5gJb59edwCliFbX2j7G6sBfY4sX9YLy211yctONI2GRaiX0f2zIbKWmBm+sPqFNEpM7Ljzm7IJX/xrjiEbPrw==} dev: false @@ -4864,6 +5291,11 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -4948,6 +5380,10 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + /crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} @@ -5049,6 +5485,11 @@ packages: dependencies: ms: 2.1.2 + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: false @@ -5158,6 +5599,13 @@ packages: engines: {node: '>=0.3.1'} dev: false + /digest-fetch@1.3.0: + resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} + dependencies: + base-64: 0.1.0 + md5: 2.3.0 + dev: false + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -5514,6 +5962,15 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -5544,6 +6001,10 @@ packages: engines: {node: '>=6'} dev: false + /expr-eval@2.0.2: + resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} + dev: false + /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false @@ -5647,6 +6108,11 @@ packages: rimraf: 3.0.2 dev: true + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: false + /flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true @@ -5657,6 +6123,10 @@ packages: is-callable: 1.2.7 dev: false + /form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + dev: false + /form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -5676,6 +6146,14 @@ packages: engines: {node: '>=0.4.x'} dev: false + /formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: false + /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true @@ -5885,6 +6363,22 @@ packages: engines: {node: '>= 10.x'} dev: false + /groq-sdk@0.3.2: + resolution: {integrity: sha512-Xp1xOea7nqUcTMndpiA8VkjZ05jM/eUUeCILxhRF+c2etBz/myQwRcUrr5lpWc0euIt96AiBMa9aYa0Iqrh13g==} + dependencies: + '@types/node': 18.11.18 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + digest-fetch: 1.3.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + dev: false + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: false @@ -6079,6 +6573,12 @@ packages: engines: {node: '>=10.17.0'} dev: false + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -6194,6 +6694,10 @@ packages: is-decimal: 1.0.4 dev: false + /is-any-array@2.0.1: + resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} + dev: false + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -6230,6 +6734,10 @@ packages: has-tostringtag: 1.0.0 dev: false + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false + /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} @@ -6436,6 +6944,12 @@ packages: engines: {node: '>=10'} dev: false + /js-tiktoken@1.0.11: + resolution: {integrity: sha512-PajXFLq2vx7/8jllQZ43vzNpAai/0MOVdJjW/UrNyJorNQRTjHrqdGJG/mjHVy7h9M6dW6CaG43eNLMYFkTh6w==} + dependencies: + base64-js: 1.5.1 + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -6528,6 +7042,11 @@ packages: graceful-fs: 4.2.11 dev: false + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false + /katex@0.16.10: resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} hasBin: true @@ -6545,6 +7064,266 @@ packages: engines: {node: '>=6'} dev: false + /langchain@0.1.34: + resolution: {integrity: sha512-4TVH2mzhITrLPOeyfGucfqo1+360DJMl4+ItG56ApxVY1krO4hV0EkqcRLAxW06W6sIue8mIU70WbyhBYH68Ug==} + engines: {node: '>=18'} + peerDependencies: + '@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/storage-blob': ^12.15.0 + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@gomomento/sdk-web': ^1.51.1 + '@google-ai/generativelanguage': ^0.2.1 + '@google-cloud/storage': ^6.10.1 || ^7.7.0 + '@notionhq/client': ^2.2.10 + '@pinecone-database/pinecone': '*' + '@supabase/supabase-js': ^2.10.0 + '@vercel/kv': ^0.2.3 + '@xata.io/client': ^0.28.0 + apify-client: ^2.7.1 + assemblyai: ^4.0.0 + axios: '*' + cheerio: ^1.0.0-rc.12 + chromadb: '*' + convex: ^1.3.1 + couchbase: ^4.3.0 + d3-dsv: ^2.0.0 + epub2: ^3.0.1 + faiss-node: '*' + fast-xml-parser: '*' + google-auth-library: ^8.9.0 + handlebars: ^4.7.8 + html-to-text: ^9.0.5 + ignore: ^5.2.0 + ioredis: ^5.3.2 + jsdom: '*' + mammoth: ^1.6.0 + mongodb: '>=5.2.0' + node-llama-cpp: '*' + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + pdf-parse: 1.1.1 + peggy: ^3.0.2 + playwright: ^1.32.1 + puppeteer: ^19.7.2 + pyodide: ^0.24.1 + redis: ^4.6.4 + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.12 + 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-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 + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@gomomento/sdk-web': + optional: true + '@google-ai/generativelanguage': + optional: true + '@google-cloud/storage': + 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 + google-auth-library: + 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 + dependencies: + '@anthropic-ai/sdk': 0.9.1 + '@langchain/community': 0.0.50 + '@langchain/core': 0.1.58 + '@langchain/openai': 0.0.28 + binary-extensions: 2.2.0 + js-tiktoken: 1.0.11 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langchainhub: 0.0.8 + langsmith: 0.1.18 + ml-distance: 4.0.1 + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 9.0.1 + yaml: 2.3.4 + zod: 3.23.0 + zod-to-json-schema: 3.22.5(zod@3.23.0) + transitivePeerDependencies: + - '@aws-crypto/sha256-js' + - '@aws-sdk/client-bedrock-agent-runtime' + - '@aws-sdk/client-bedrock-runtime' + - '@aws-sdk/client-dynamodb' + - '@aws-sdk/client-kendra' + - '@aws-sdk/client-lambda' + - '@azure/search-documents' + - '@clickhouse/client' + - '@cloudflare/ai' + - '@datastax/astra-db-ts' + - '@elastic/elasticsearch' + - '@getmetal/metal-sdk' + - '@getzep/zep-js' + - '@gradientai/nodejs-sdk' + - '@huggingface/inference' + - '@mozilla/readability' + - '@opensearch-project/opensearch' + - '@planetscale/database' + - '@premai/prem-sdk' + - '@qdrant/js-client-rest' + - '@raycast/api' + - '@rockset/client' + - '@smithy/eventstream-codec' + - '@smithy/protocol-http' + - '@smithy/signature-v4' + - '@smithy/util-utf8' + - '@supabase/postgrest-js' + - '@tensorflow-models/universal-sentence-encoder' + - '@tensorflow/tfjs-converter' + - '@tensorflow/tfjs-core' + - '@upstash/redis' + - '@upstash/vector' + - '@vercel/postgres' + - '@writerai/writer-sdk' + - '@xenova/transformers' + - '@zilliz/milvus2-sdk-node' + - better-sqlite3 + - cassandra-driver + - cborg + - closevector-common + - closevector-node + - closevector-web + - cohere-ai + - discord.js + - dria + - duck-duck-scrape + - encoding + - firebase-admin + - googleapis + - hnswlib-node + - interface-datastore + - it-all + - jsonwebtoken + - llmonitor + - lodash + - lunary + - mysql2 + - neo4j-driver + - pg + - pg-copy-streams + - pickleparser + - portkey-ai + - replicate + - typesense + - usearch + - vectordb + - voy-search + dev: false + + /langchainhub@0.0.8: + resolution: {integrity: sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ==} + dev: false + + /langsmith@0.1.18: + resolution: {integrity: sha512-LHk0aIFAl3/iiKvUzAiM8Xdm13bRO70XERQeHCF99fL2X815Jc47nxu6m7usSuQC8sw6rirCKZbGm18cqdUEzA==} + dependencies: + '@types/uuid': 9.0.8 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + dev: false + /less@4.2.0: resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} engines: {node: '>=6'} @@ -6956,6 +7735,14 @@ packages: speech-rule-engine: 4.0.7 dev: false + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: @@ -7443,6 +8230,37 @@ packages: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: false + /ml-array-mean@1.1.6: + resolution: {integrity: sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==} + dependencies: + ml-array-sum: 1.1.6 + dev: false + + /ml-array-sum@1.1.6: + resolution: {integrity: sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==} + dependencies: + is-any-array: 2.0.1 + dev: false + + /ml-distance-euclidean@2.0.0: + resolution: {integrity: sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==} + dev: false + + /ml-distance@4.0.1: + resolution: {integrity: sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw==} + dependencies: + ml-array-mean: 1.1.6 + ml-distance-euclidean: 2.0.0 + ml-tree-similarity: 1.0.0 + dev: false + + /ml-tree-similarity@1.0.0: + resolution: {integrity: sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==} + dependencies: + binary-search: 1.3.6 + num-sort: 2.1.0 + dev: false + /mnemonic-id@3.2.7: resolution: {integrity: sha512-kysx9gAGbvrzuFYxKkcRjnsg/NK61ovJOV4F1cHTRl9T5leg+bo6WI0pWIvOFh1Z/yDL0cjA5R3EEGPPLDv/XA==} dev: false @@ -7459,7 +8277,6 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} requiresBuild: true dev: false - optional: true /msgpackr-extract@3.0.2: resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} @@ -7489,6 +8306,11 @@ packages: msgpackr-extract: 3.0.2 dev: false + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + /mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7548,6 +8370,11 @@ packages: resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} dev: false + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + /node-fetch-native@1.4.1: resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} dev: false @@ -7620,6 +8447,11 @@ packages: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} dev: false + /num-sort@2.1.0: + resolution: {integrity: sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==} + engines: {node: '>=8'} + dev: false + /nwsapi@2.2.7: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} dev: false @@ -7672,6 +8504,26 @@ packages: mimic-fn: 2.1.0 dev: false + /openai@4.38.2: + resolution: {integrity: sha512-M16ehj0D84Gjq5cjvBzXRb5X+UvtWlxPDRAWAWMC0EN+6nHqnULIn5fWWeiexDPup25FeSZYv/ldp8KefcZVJQ==} + hasBin: true + dependencies: + '@types/node': 18.11.18 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + dev: false + + /openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -7713,6 +8565,11 @@ packages: engines: {node: '>=12.20'} dev: false + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -7727,6 +8584,29 @@ packages: p-limit: 3.1.0 dev: true + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: false + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: false + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: false + /package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} @@ -8539,6 +9419,11 @@ packages: signal-exit: 3.0.7 dev: false + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -9458,6 +10343,16 @@ packages: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + dev: false + + /web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + dev: false + /webextension-polyfill@0.10.0: resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} dev: true @@ -9623,6 +10518,18 @@ packages: engines: {node: '>=10'} dev: true + /zod-to-json-schema@3.22.5(zod@3.23.0): + resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} + peerDependencies: + zod: ^3.22.4 + dependencies: + zod: 3.23.0 + dev: false + + /zod@3.23.0: + resolution: {integrity: sha512-OFLT+LTocvabn6q76BTwVB0hExEBS0IduTr3cqZyMqEDbOnYmcU+y0tUAYbND4uwclpBGi4I4UUBGzylWpjLGA==} + dev: false + /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false diff --git a/src/components/combobox.tsx b/src/components/combobox.tsx index 6de2aa1..5ef112b 100644 --- a/src/components/combobox.tsx +++ b/src/components/combobox.tsx @@ -8,6 +8,7 @@ import { X, } from "lucide-react" import { useEffect } from "react" +import browser from "webextension-polyfill" import { chatGPTModelAtom, contextAtom, @@ -15,6 +16,8 @@ import { googleAIHostAtom, googleAIKeyAtom, googleAIModelAtom, + groqApiKeyAtom, + groqApiModelAtom, isLoadingAtom, isShowContextAtom, isShowElementAtom, @@ -31,9 +34,8 @@ import { selectedPromptAtom, } from "~lib/atoms" import { EngineEnum, PromptTypeEnum } from "~lib/enums" -import ContextMenuComponent from "./context_menu" -import browser from "webextension-polyfill" import type { RequestBody } from "~lib/utils/prompt" +import ContextMenuComponent from "./context_menu" export default function ComboxComponent() { const notionSpaceId = useAtomValue(notionSpaceIdAtom) @@ -41,9 +43,14 @@ export default function ComboxComponent() { const openAIAPIHost = useAtomValue(openAIAPIHostAtom) const openAIAPIModel = useAtomValue(openAIAPIModelAtom) const chatGPTModel = useAtomValue(chatGPTModelAtom) + const googleAiHost = useAtomValue(googleAIHostAtom) const googleAiKey = useAtomValue(googleAIKeyAtom) const googleAiModel = useAtomValue(googleAIModelAtom) + + const groqApiKey = useAtomValue(groqApiKeyAtom) + const groqApiModel = useAtomValue(groqApiModelAtom) + const engine = useAtomValue(engineAtom) const selectedPrompt = useAtomValue(selectedPromptAtom) const [context, setContext] = useAtom(contextAtom) @@ -143,6 +150,9 @@ export default function ComboxComponent() { body.apiUrl = googleAiHost body.apiKey = googleAiKey body.apiModel = googleAiModel + } else if (engine === EngineEnum.Groq) { + body.apiKey = groqApiKey + body.apiModel = groqApiModel } console.log(body) diff --git a/src/lib/api/google-ai.ts b/src/lib/api/google-ai.ts deleted file mode 100644 index 3c4b746..0000000 --- a/src/lib/api/google-ai.ts +++ /dev/null @@ -1,66 +0,0 @@ -async function chat( - prompt: string, - host: string, - apiKey: string, - model: string, - port: chrome.runtime.Port -) { - const url = `${host}/v1beta/models/${model}:generateContent?key=${apiKey}` - const payload = { - contents: [ - { - parts: [ - { - text: prompt, - }, - ], - }, - ], - } - - const resp = await fetch(url, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(payload), - }) - - if (!resp.ok) { - const errMsg = `GoogleAI return error, status: ${resp.status}` - console.log(errMsg) - throw new Error(errMsg) - } - - // parse json response - const data = await resp.json() - console.log(data) - const content = data.candidates[0].content.parts[0].text - port.postMessage(content) -} - -async function GoogleAIChat( - prompt: string, - host: string, - apiKey: string, - model: string, - port: chrome.runtime.Port -) { - if (!apiKey) { - const msg = - "Please set your Google API key in the extension options page." - console.error(msg) - port.postMessage(msg) - port.postMessage("[DONE]") - return - } - try { - await chat(prompt, host, apiKey, model, port) - } catch (err) { - console.error(err) - port.postMessage(err.message) - } - port.postMessage("[DONE]") -} - -export default GoogleAIChat diff --git a/src/lib/api/openai-api.ts b/src/lib/api/openai-api.ts deleted file mode 100644 index c119845..0000000 --- a/src/lib/api/openai-api.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { parseSSEResponse } from "~lib/utils/sse" - -async function chat( - url: string, - instraction: string, - prompt: string, - api_key: string, - model: string, - port: chrome.runtime.Port -) { - const data = { - model: model, - stream: true, - messages: [ - { role: "system", content: instraction }, - { role: "user", content: prompt }, - ], - } - const resp = await fetch(url, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${api_key}`, - }, - body: JSON.stringify(data), - }) - - if (!resp.ok) { - const errMsg = `ChatGPTAPI return error, status: ${resp.status}` - throw new Error(errMsg) - } - - let content: string = "" - - await parseSSEResponse(resp, message => { - if (message === "[DONE]") { - port.postMessage("[DONE]") - return - } - try { - const data = JSON.parse(message) - // console.log(content) - if (data?.choices?.length) { - const delta = data.choices[0].delta - if (delta?.content) { - content += delta.content - port.postMessage(content) - } - } - } catch (err) { - throw new Error(`ChatGPTAPI return error: ${err.message}`) - } - }) -} - -async function OpenAIAPIChat( - url: string, - instraction: string, - prompt: string, - api_key: string, - model: string, - port: chrome.runtime.Port -) { - if (!api_key) { - const msg = - "Please set your OpenAI API key in the extension options page." - console.error(msg) - port.postMessage(msg) - port.postMessage("[DONE]") - return - } - try { - await chat(url, instraction, prompt, api_key, model, port) - } catch (err) { - console.error(err) - port.postMessage(err.message) - } - port.postMessage("[DONE]") -} - -export default OpenAIAPIChat diff --git a/src/lib/api/readability.ts b/src/lib/api/readability.ts deleted file mode 100644 index 94526fb..0000000 --- a/src/lib/api/readability.ts +++ /dev/null @@ -1,35 +0,0 @@ -const HOST = "https://readability.theboys.tech/" - -export type ParseResult = { - title: string - content: string - author: string - date_published: string - lead_image_url: string - dek: string - next_page_url: string - url: string - domain: string - excerpt: string - word_count: number - direction: string - total_pages: number - rendered_pages: number -} - -async function Parse(url: string): Promise { - try { - const path = "api/parser" - const query = `?url=${url}` - const encodedURL = encodeURI(HOST + path + query) - const resp = await fetch(encodedURL) - const data = await resp.json() - // console.log(`readability response: ${JSON.stringify(data)}`) - return data as ParseResult - } catch (error) { - console.error(`readability error: ${error}`) - throw new Error(error) - } -} - -export { Parse } diff --git a/src/lib/atoms.tsx b/src/lib/atoms.tsx index 5a8d425..e52b5ab 100644 --- a/src/lib/atoms.tsx +++ b/src/lib/atoms.tsx @@ -8,13 +8,15 @@ export const storage = new Storage({ area: "local", }) -export const DEFAULT_OPENAI_API_URL = "https://api.openai.com/v1/chat/completions" +export const DEFAULT_OPENAI_API_URL = "https://api.openai.com/v1" export const DEFAULT_OPENAI_API_MODEL = "gpt-3.5-turbo" export const DEFAULT_CHATGPT_MODEL = "text-davinci-002-render-sha" export const DEFAULT_GOOGLE_AI_HOST = "https://generativelanguage.googleapis.com" export const DEFAULT_GOOGLE_AI_MODEL = "gemini-pro" +export const DEFAULT_GROQ_API_MODEL = "llama3-8b-8192" + export const engineAtom = atom(EngineEnum.OpenAIAPI) export const notionSpaceIdAtom = atom("") export const notionSpacesAtom = atom("") @@ -25,6 +27,8 @@ export const chatGPTModelAtom = atom(DEFAULT_CHATGPT_MODEL) export const googleAIModelAtom = atom(DEFAULT_GOOGLE_AI_MODEL) export const googleAIHostAtom = atom(DEFAULT_GOOGLE_AI_HOST) export const googleAIKeyAtom = atom("") +export const groqApiKeyAtom = atom("") +export const groqApiModelAtom = atom(DEFAULT_GROQ_API_MODEL) export const isEnableContextMenuAtom = atom(true) export const processTypeAtom = atom(ProcessTypeEnum.Text) @@ -74,6 +78,8 @@ export const InitAtomComponent = () => { const setGoogleAIModel = useSetAtom(googleAIModelAtom) const setGoogleAIKey = useSetAtom(googleAIKeyAtom) const setGoogleAIHost = useSetAtom(googleAIHostAtom) + const setGroqApiKey = useSetAtom(groqApiKeyAtom) + const setGroqApiModel = useSetAtom(groqApiModelAtom) useEffect(() => { const fetchAndSetAllData = async () => { @@ -87,6 +93,8 @@ export const InitAtomComponent = () => { await fetchAndSetData(ConstEnum.GOOGLE_AI_MODEL, setGoogleAIModel) await fetchAndSetData(ConstEnum.GOOGLE_AI_KEY, setGoogleAIKey) await fetchAndSetData(ConstEnum.GOOGLE_AI_HOST, setGoogleAIHost) + await fetchAndSetData(ConstEnum.GROQ_API_KEY, setGroqApiKey) + await fetchAndSetData(ConstEnum.GROQ_API_MODEL, setGroqApiModel) const isEnableContext = await storage.get( ConstEnum.IS_ENABLE_CONTEXT_MENU ) diff --git a/src/lib/enums.ts b/src/lib/enums.ts index 2dfb592..2541a1d 100644 --- a/src/lib/enums.ts +++ b/src/lib/enums.ts @@ -16,6 +16,8 @@ export enum ConstEnum { GOOGLE_AI_HOST = "google-ai-host", GOOGLE_AI_KEY = "google-ai-key", GOOGLE_AI_MODEL = "google-ai-model", + GROQ_API_KEY = "groq-api-key", + GROQ_API_MODEL = "groq-api-model", } export enum EngineEnum { @@ -26,6 +28,7 @@ export enum EngineEnum { GoogleAI = "google-ai", Bing = "bing", Claude = "claude", + Groq = "groq", } export const EngineMappings = { @@ -36,6 +39,7 @@ export const EngineMappings = { [EngineEnum.Bing]: "🔎 Bing", [EngineEnum.Claude]: "🤖 Claude", [EngineEnum.GoogleAI]: "🤖 Google AI", + [EngineEnum.Groq]: "🤖 Groq", } export const EngineOptions: PromptType[] = [ @@ -46,11 +50,12 @@ export const EngineOptions: PromptType[] = [ { label: "🔎 Bing", value: EngineEnum.Bing, category: "" }, { label: "🤖 Claude", value: EngineEnum.Claude, category: "" }, { label: "🤖 Google AI", value: EngineEnum.GoogleAI, category: "" }, + { label: "🤖 Groq", value: EngineEnum.Groq, category: "" }, ] export enum OpenAIModelEnum { gpt35turbo = "gpt-3.5-turbo", - gpt4 = "gpt-4", + gpt4turbo = "gpt-4-turbo", } export const OpenAIModelOptions: PromptType[] = [ @@ -59,7 +64,7 @@ export const OpenAIModelOptions: PromptType[] = [ value: OpenAIModelEnum.gpt35turbo, category: "", }, - { label: "🤖 GPT-4", value: OpenAIModelEnum.gpt4, category: "" }, + { label: "🤖 GPT-4", value: OpenAIModelEnum.gpt4turbo, category: "" }, ] export enum ProcessTypeEnum { diff --git a/src/lib/stream.ts b/src/lib/stream.ts index 2c5ea4a..8eaef92 100644 --- a/src/lib/stream.ts +++ b/src/lib/stream.ts @@ -1,6 +1,10 @@ +import { BaseChatModel } from "@langchain/core/language_models/chat_models" +import { StringOutputParser } from "@langchain/core/output_parsers" +import { ChatGoogleGenerativeAI } from "@langchain/google-genai" +import { ChatGroq } from "@langchain/groq" +import { ChatOpenAI } from "@langchain/openai" import { BardChat } from "~lib/api/bard" import { BingChat } from "~lib/api/bing" -import OpenAIAPIChat from "~lib/api/openai-api" import { ChatGPTWebChat } from "~lib/api/chatgpt-web" import { NotionCompletion } from "~lib/api/notion-completion" import { EngineEnum } from "~lib/enums" @@ -9,9 +13,26 @@ import { buildChatGPTinstruction, type RequestBody, } from "~lib/utils/prompt" - import { ClaudeChat } from "./api/claude" -import GoogleAIChat from "./api/google-ai" + +async function chatStream( + model: BaseChatModel, + prompt: string, + port: chrome.runtime.Port +) { + const parser = new StringOutputParser() + let content: string = "" + const stream = await model + .pipe(parser) + .stream(prompt) + for await (const chunk of stream) { + if (chunk !== "" && chunk != undefined && chunk != null) { + content += chunk + port.postMessage(content) + } + } + port.postMessage("[DONE]") +} export default async function handleStream( body: RequestBody, @@ -20,6 +41,9 @@ export default async function handleStream( const instruction: string = buildChatGPTinstruction(body) const prompt: string = buildChatGPTPrompt(body) + const finalPrompt: string = `${instruction}\n\n${prompt}` + var model: BaseChatModel + switch (body.engine) { case EngineEnum.ChatGPT: await ChatGPTWebChat( @@ -35,23 +59,21 @@ export default async function handleStream( await ClaudeChat(`${instruction}\n\n${prompt}`, port) break case EngineEnum.OpenAIAPI: - await OpenAIAPIChat( - body.apiUrl, - instruction, - prompt, - body.apiKey, - body.apiModel, - port - ) + model = new ChatOpenAI({ + model: body.apiModel, + apiKey: body.apiKey, + configuration: { + baseURL: body.apiUrl, + } + }) + await chatStream(model, finalPrompt, port) break case EngineEnum.GoogleAI: - await GoogleAIChat( - `${instruction}\n\n${prompt}`, - body.apiUrl, - body.apiKey, - body.apiModel, - port - ) + model = new ChatGoogleGenerativeAI({ + model: body.apiModel, + apiKey: body.apiKey, + }) + await chatStream(model, finalPrompt, port) break case EngineEnum.GoogleBard: await BardChat(`${instruction}\n\n${prompt}`, port) @@ -66,5 +88,16 @@ export default async function handleStream( body.language, body.tone ) + break + case EngineEnum.Groq: + model = new ChatGroq({ + model: body.apiModel, + apiKey: body.apiKey, + }) + await chatStream(model, finalPrompt, port) + break + default: + port.postMessage("Invalid Engine") + port.postMessage("[DONE]") } } diff --git a/src/options.tsx b/src/options.tsx index bc5253e..05300ef 100644 --- a/src/options.tsx +++ b/src/options.tsx @@ -26,6 +26,8 @@ import { googleAIHostAtom, googleAIKeyAtom, googleAIModelAtom, + groqApiKeyAtom, + groqApiModelAtom, isEnableContextMenuAtom, notionSpaceIdAtom, notionSpacesAtom, @@ -79,6 +81,8 @@ function Options() { const [googleAiHost, setGoogleAIHost] = useAtom(googleAIHostAtom) const [googleAIKey, setGoogleAIKey] = useAtom(googleAIKeyAtom) const [googleAIModel, setGoogleAIModel] = useAtom(googleAIModelAtom) + const [groqApiKey, setGroqApiKey] = useAtom(groqApiKeyAtom) + const [groqApiModel, setGroqApiModel] = useAtom(groqApiModelAtom) storage.watch({ [ConstEnum.DEFAULT_ENGINE]: c => setEngine(c.newValue), @@ -90,6 +94,8 @@ function Options() { [ConstEnum.CHATGPT_MODEL]: c => setChatGPTModel(c.newValue), [ConstEnum.GOOGLE_AI_KEY]: c => setGoogleAIKey(c.newValue), [ConstEnum.GOOGLE_AI_MODEL]: c => setGoogleAIModel(c.newValue), + [ConstEnum.GROQ_API_KEY]: c => setGroqApiKey(c.newValue), + [ConstEnum.GROQ_API_MODEL]: c => setGroqApiModel(c.newValue), [ConstEnum.IS_ENABLE_CONTEXT_MENU]: c => setIsEnableContextMenu(c.newValue), }) @@ -233,7 +239,7 @@ function Options() { saveToStorage( @@ -301,6 +307,61 @@ function Options() { ) } + const GroqAPISettings = () => { + return ( +
+
+ + API Key: + + + { + saveToStorage( + ConstEnum.GROQ_API_KEY, + e.target.value + ) + }} + /> + +
+
+ + API Model: + + { + saveToStorage(ConstEnum.GROQ_API_MODEL, e) + }} + > + + + + LLaMA3 8b + + + LLaMA3 70b + + + LLaMA2 70b + + + Mixtral 8x7b + + + Gemma 7b + + + +
+
+ ) + } + const contextMenuSettings = () => { return (
@@ -368,6 +429,13 @@ function Options() { GOOGLE_AI_URL )} {engine == EngineEnum.GoogleAI && googleAISettings()} + + {settingNameToIdComponent(EngineEnum.Groq)} + {engineDescriptionComponent( + EngineEnum.Groq, + "https://console.groq.com" + )} + {engine == EngineEnum.Groq && GroqAPISettings()}