Last active
September 10, 2024 14:00
-
-
Save wxgeorge/faec3b828c54d9c845892e45ad614bdf to your computer and use it in GitHub Desktop.
Featherless with Langchain-js v0.2.12 example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // based on https://github.com/OpenRouterTeam/openrouter-examples/blob/main/examples/langchain/index.ts | |
| import { ChatOpenAI } from "@langchain/openai" | |
| import { HumanMessage, SystemMessage, AIMessage } from "@langchain/core/messages" | |
| import 'dotenv/config' | |
| // TODO: make a key at https://featherless.ai/account/api-keys and put it in .env | |
| const FEATHERLESS_API_KEY = process.env.FEATHERLESS_API_KEY | |
| const FEATHERLESS_BASE_URL = | |
| process.env.FEATHERLESS_BASE_URL || "https://api.featherless.ai/v1" | |
| const chat = new ChatOpenAI( | |
| { | |
| modelName: "NousResearch/Meta-Llama-3.1-8B-Instruct", | |
| // modelName: "meta-llama/Meta-Llama-3-8B-Instruct", | |
| // Note that access to certain models, like Llama3, requires accepting the Ts&Cs of the model. | |
| // please visit https://featherless.ai/models/meta-llama/Meta-Llama-3-8B-Instruct for details on how to do this | |
| // modelName: "HuggingFaceH4/zephyr-7b-beta", | |
| // modelName: "failspy/Meta-Llama-3-8B-Instruct-abliterated-v3", | |
| // modelName: "failspy/Llama-3-8B-Instruct-MopeyMule", | |
| temperature: 0.8, | |
| maxTokens: 300, | |
| // unfortunately this does _not_ work with streaming, as that requires a token counting endpoint, which | |
| // featherless does not currently have. | |
| // streaming: true, | |
| openAIApiKey: FEATHERLESS_API_KEY, | |
| }, | |
| { | |
| basePath: FEATHERLESS_BASE_URL, | |
| baseOptions: { | |
| headers: { | |
| "HTTP-Referer": "https://localhost:3000/", | |
| "X-Title": "Langchain.js Testing", | |
| }, | |
| }, | |
| } | |
| ) | |
| async function main() { | |
| const response = await chat.call([ | |
| new SystemMessage( | |
| "You are a helpful assistant that translates English to some other language, depending on the context." | |
| ), | |
| ...lotsOfMessages(2), | |
| new HumanMessage( | |
| "Translate: I am bouncy goofball who loves cookies and wants to go to Disneyland and ride the teacups. But one day I will be a real boy." | |
| ), | |
| ]) | |
| console.log(response) | |
| } | |
| // Helpers | |
| function* lotsOfMessages(numMessages) { | |
| const batch = [ | |
| new HumanMessage("Translate: I make cookies."), | |
| new AIMessage("Je fais des biscuits."), | |
| new HumanMessage("Translate: I am a human."), | |
| new AIMessage("Je suis un humain."), | |
| new HumanMessage("Translate: I am a robot."), | |
| new AIMessage("Je suis un robot."), | |
| new HumanMessage("Translate: I am a dog."), | |
| new AIMessage("Je suis un chien."), | |
| new HumanMessage("Translate: I am a cat."), | |
| new AIMessage("Je suis un chat."), | |
| new HumanMessage("Translate: I am a bird."), | |
| new AIMessage("Je suis un oiseau."), | |
| new HumanMessage("Translate: I am a fish."), | |
| new AIMessage("Je suis un poisson."), | |
| new HumanMessage("Translate: I am a horse."), | |
| new AIMessage("Je suis un cheval."), | |
| new HumanMessage("Translate: I am a cow."), | |
| new AIMessage("Je suis une vache."), | |
| new HumanMessage("Translate: I am a pig."), | |
| new AIMessage("Je suis un cochon."), | |
| ] | |
| for (let i = 0; i < numMessages; i++) { | |
| yield batch[i % batch.length] | |
| } | |
| } | |
| // console.log(...lotsOfMessages(2)) | |
| // Run | |
| main().catch((e) => console.error(e)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "name": "featherless-langchain-js-example", | |
| "version": "1.0.0", | |
| "lockfileVersion": 3, | |
| "requires": true, | |
| "packages": { | |
| "": { | |
| "name": "featherless-langchain-js-example", | |
| "version": "1.0.0", | |
| "license": "ISC", | |
| "dependencies": { | |
| "@langchain/openai": "^0.2.5", | |
| "dotenv": "^16.4.5", | |
| "langchain": "^0.2.12", | |
| "openai": "^4.54.0" | |
| } | |
| }, | |
| "node_modules/@langchain/core": { | |
| "version": "0.2.20", | |
| "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.20.tgz", | |
| "integrity": "sha512-WPBjrzOj79/yqjloDUIw1GDhuRQfHis07TyyDj+qS81nHh0svSasetKcqAZ3L5JoPcBmEL7rRBtM+OcyC3mLVg==", | |
| "dependencies": { | |
| "ansi-styles": "^5.0.0", | |
| "camelcase": "6", | |
| "decamelize": "1.2.0", | |
| "js-tiktoken": "^1.0.12", | |
| "langsmith": "~0.1.39", | |
| "mustache": "^4.2.0", | |
| "p-queue": "^6.6.2", | |
| "p-retry": "4", | |
| "uuid": "^10.0.0", | |
| "zod": "^3.22.4", | |
| "zod-to-json-schema": "^3.22.3" | |
| }, | |
| "engines": { | |
| "node": ">=18" | |
| } | |
| }, | |
| "node_modules/@langchain/openai": { | |
| "version": "0.2.5", | |
| "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.2.5.tgz", | |
| "integrity": "sha512-gQXS5VBFyAco0jgSnUVan6fYVSIxlffmDaeDGpXrAmz2nQPgiN/h24KYOt2NOZ1zRheRzRuO/CfRagMhyVUaFA==", | |
| "dependencies": { | |
| "@langchain/core": ">=0.2.16 <0.3.0", | |
| "js-tiktoken": "^1.0.12", | |
| "openai": "^4.49.1", | |
| "zod": "^3.22.4", | |
| "zod-to-json-schema": "^3.22.3" | |
| }, | |
| "engines": { | |
| "node": ">=18" | |
| } | |
| }, | |
| "node_modules/@langchain/textsplitters": { | |
| "version": "0.0.3", | |
| "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.0.3.tgz", | |
| "integrity": "sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==", | |
| "dependencies": { | |
| "@langchain/core": ">0.2.0 <0.3.0", | |
| "js-tiktoken": "^1.0.12" | |
| }, | |
| "engines": { | |
| "node": ">=18" | |
| } | |
| }, | |
| "node_modules/@types/node": { | |
| "version": "18.19.43", | |
| "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", | |
| "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", | |
| "dependencies": { | |
| "undici-types": "~5.26.4" | |
| } | |
| }, | |
| "node_modules/@types/node-fetch": { | |
| "version": "2.6.11", | |
| "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", | |
| "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", | |
| "dependencies": { | |
| "@types/node": "*", | |
| "form-data": "^4.0.0" | |
| } | |
| }, | |
| "node_modules/@types/retry": { | |
| "version": "0.12.0", | |
| "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", | |
| "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" | |
| }, | |
| "node_modules/@types/uuid": { | |
| "version": "9.0.8", | |
| "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", | |
| "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" | |
| }, | |
| "node_modules/abort-controller": { | |
| "version": "3.0.0", | |
| "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", | |
| "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", | |
| "dependencies": { | |
| "event-target-shim": "^5.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=6.5" | |
| } | |
| }, | |
| "node_modules/agentkeepalive": { | |
| "version": "4.5.0", | |
| "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", | |
| "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", | |
| "dependencies": { | |
| "humanize-ms": "^1.2.1" | |
| }, | |
| "engines": { | |
| "node": ">= 8.0.0" | |
| } | |
| }, | |
| "node_modules/ansi-styles": { | |
| "version": "5.2.0", | |
| "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", | |
| "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", | |
| "engines": { | |
| "node": ">=10" | |
| }, | |
| "funding": { | |
| "url": "https://github.com/chalk/ansi-styles?sponsor=1" | |
| } | |
| }, | |
| "node_modules/argparse": { | |
| "version": "2.0.1", | |
| "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", | |
| "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" | |
| }, | |
| "node_modules/asynckit": { | |
| "version": "0.4.0", | |
| "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | |
| "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" | |
| }, | |
| "node_modules/base64-js": { | |
| "version": "1.5.1", | |
| "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | |
| "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", | |
| "funding": [ | |
| { | |
| "type": "github", | |
| "url": "https://github.com/sponsors/feross" | |
| }, | |
| { | |
| "type": "patreon", | |
| "url": "https://www.patreon.com/feross" | |
| }, | |
| { | |
| "type": "consulting", | |
| "url": "https://feross.org/support" | |
| } | |
| ] | |
| }, | |
| "node_modules/binary-extensions": { | |
| "version": "2.3.0", | |
| "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", | |
| "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", | |
| "engines": { | |
| "node": ">=8" | |
| }, | |
| "funding": { | |
| "url": "https://github.com/sponsors/sindresorhus" | |
| } | |
| }, | |
| "node_modules/binary-search": { | |
| "version": "1.3.6", | |
| "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", | |
| "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" | |
| }, | |
| "node_modules/camelcase": { | |
| "version": "6.3.0", | |
| "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", | |
| "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", | |
| "engines": { | |
| "node": ">=10" | |
| }, | |
| "funding": { | |
| "url": "https://github.com/sponsors/sindresorhus" | |
| } | |
| }, | |
| "node_modules/combined-stream": { | |
| "version": "1.0.8", | |
| "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", | |
| "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", | |
| "dependencies": { | |
| "delayed-stream": "~1.0.0" | |
| }, | |
| "engines": { | |
| "node": ">= 0.8" | |
| } | |
| }, | |
| "node_modules/commander": { | |
| "version": "10.0.1", | |
| "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", | |
| "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", | |
| "engines": { | |
| "node": ">=14" | |
| } | |
| }, | |
| "node_modules/decamelize": { | |
| "version": "1.2.0", | |
| "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", | |
| "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/delayed-stream": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | |
| "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", | |
| "engines": { | |
| "node": ">=0.4.0" | |
| } | |
| }, | |
| "node_modules/dotenv": { | |
| "version": "16.4.5", | |
| "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", | |
| "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", | |
| "engines": { | |
| "node": ">=12" | |
| }, | |
| "funding": { | |
| "url": "https://dotenvx.com" | |
| } | |
| }, | |
| "node_modules/event-target-shim": { | |
| "version": "5.0.1", | |
| "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", | |
| "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", | |
| "engines": { | |
| "node": ">=6" | |
| } | |
| }, | |
| "node_modules/eventemitter3": { | |
| "version": "4.0.7", | |
| "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", | |
| "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" | |
| }, | |
| "node_modules/form-data": { | |
| "version": "4.0.0", | |
| "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", | |
| "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", | |
| "dependencies": { | |
| "asynckit": "^0.4.0", | |
| "combined-stream": "^1.0.8", | |
| "mime-types": "^2.1.12" | |
| }, | |
| "engines": { | |
| "node": ">= 6" | |
| } | |
| }, | |
| "node_modules/form-data-encoder": { | |
| "version": "1.7.2", | |
| "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", | |
| "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" | |
| }, | |
| "node_modules/formdata-node": { | |
| "version": "4.4.1", | |
| "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", | |
| "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", | |
| "dependencies": { | |
| "node-domexception": "1.0.0", | |
| "web-streams-polyfill": "4.0.0-beta.3" | |
| }, | |
| "engines": { | |
| "node": ">= 12.20" | |
| } | |
| }, | |
| "node_modules/humanize-ms": { | |
| "version": "1.2.1", | |
| "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", | |
| "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", | |
| "dependencies": { | |
| "ms": "^2.0.0" | |
| } | |
| }, | |
| "node_modules/is-any-array": { | |
| "version": "2.0.1", | |
| "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", | |
| "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" | |
| }, | |
| "node_modules/js-tiktoken": { | |
| "version": "1.0.12", | |
| "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.12.tgz", | |
| "integrity": "sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ==", | |
| "dependencies": { | |
| "base64-js": "^1.5.1" | |
| } | |
| }, | |
| "node_modules/js-yaml": { | |
| "version": "4.1.0", | |
| "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", | |
| "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", | |
| "dependencies": { | |
| "argparse": "^2.0.1" | |
| }, | |
| "bin": { | |
| "js-yaml": "bin/js-yaml.js" | |
| } | |
| }, | |
| "node_modules/jsonpointer": { | |
| "version": "5.0.1", | |
| "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", | |
| "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/langchain": { | |
| "version": "0.2.12", | |
| "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.2.12.tgz", | |
| "integrity": "sha512-ZHtJrHUpridZ7IQu7N/wAQ6iMAAO7VLzkupHqKP79S6p+alrPbn1BjRnh+PeGm92YiY5DafTCuvchmujxx7bCQ==", | |
| "dependencies": { | |
| "@langchain/core": ">=0.2.11 <0.3.0", | |
| "@langchain/openai": ">=0.1.0 <0.3.0", | |
| "@langchain/textsplitters": "~0.0.0", | |
| "binary-extensions": "^2.2.0", | |
| "js-tiktoken": "^1.0.12", | |
| "js-yaml": "^4.1.0", | |
| "jsonpointer": "^5.0.1", | |
| "langchainhub": "~0.0.8", | |
| "langsmith": "~0.1.30", | |
| "ml-distance": "^4.0.0", | |
| "openapi-types": "^12.1.3", | |
| "p-retry": "4", | |
| "uuid": "^10.0.0", | |
| "yaml": "^2.2.1", | |
| "zod": "^3.22.4", | |
| "zod-to-json-schema": "^3.22.3" | |
| }, | |
| "engines": { | |
| "node": ">=18" | |
| }, | |
| "peerDependencies": { | |
| "@aws-sdk/client-s3": "*", | |
| "@aws-sdk/client-sagemaker-runtime": "*", | |
| "@aws-sdk/client-sfn": "*", | |
| "@aws-sdk/credential-provider-node": "*", | |
| "@azure/storage-blob": "*", | |
| "@browserbasehq/sdk": "*", | |
| "@gomomento/sdk": "*", | |
| "@gomomento/sdk-core": "*", | |
| "@gomomento/sdk-web": "^1.51.1", | |
| "@langchain/anthropic": "*", | |
| "@langchain/aws": "*", | |
| "@langchain/cohere": "*", | |
| "@langchain/community": "*", | |
| "@langchain/google-genai": "*", | |
| "@langchain/google-vertexai": "*", | |
| "@langchain/groq": "*", | |
| "@langchain/mistralai": "*", | |
| "@langchain/ollama": "*", | |
| "@mendable/firecrawl-js": "*", | |
| "@notionhq/client": "*", | |
| "@pinecone-database/pinecone": "*", | |
| "@supabase/supabase-js": "*", | |
| "@vercel/kv": "*", | |
| "@xata.io/client": "*", | |
| "apify-client": "*", | |
| "assemblyai": "*", | |
| "axios": "*", | |
| "cheerio": "*", | |
| "chromadb": "*", | |
| "convex": "*", | |
| "couchbase": "*", | |
| "d3-dsv": "*", | |
| "epub2": "*", | |
| "fast-xml-parser": "*", | |
| "handlebars": "^4.7.8", | |
| "html-to-text": "*", | |
| "ignore": "*", | |
| "ioredis": "*", | |
| "jsdom": "*", | |
| "mammoth": "*", | |
| "mongodb": "*", | |
| "node-llama-cpp": "*", | |
| "notion-to-md": "*", | |
| "officeparser": "*", | |
| "pdf-parse": "*", | |
| "peggy": "^3.0.2", | |
| "playwright": "*", | |
| "puppeteer": "*", | |
| "pyodide": "^0.24.1", | |
| "redis": "*", | |
| "sonix-speech-recognition": "*", | |
| "srt-parser-2": "*", | |
| "typeorm": "*", | |
| "weaviate-ts-client": "*", | |
| "web-auth-library": "*", | |
| "ws": "*", | |
| "youtube-transcript": "*", | |
| "youtubei.js": "*" | |
| }, | |
| "peerDependenciesMeta": { | |
| "@aws-sdk/client-s3": { | |
| "optional": true | |
| }, | |
| "@aws-sdk/client-sagemaker-runtime": { | |
| "optional": true | |
| }, | |
| "@aws-sdk/client-sfn": { | |
| "optional": true | |
| }, | |
| "@aws-sdk/credential-provider-node": { | |
| "optional": true | |
| }, | |
| "@azure/storage-blob": { | |
| "optional": true | |
| }, | |
| "@browserbasehq/sdk": { | |
| "optional": true | |
| }, | |
| "@gomomento/sdk": { | |
| "optional": true | |
| }, | |
| "@gomomento/sdk-core": { | |
| "optional": true | |
| }, | |
| "@gomomento/sdk-web": { | |
| "optional": true | |
| }, | |
| "@langchain/anthropic": { | |
| "optional": true | |
| }, | |
| "@langchain/aws": { | |
| "optional": true | |
| }, | |
| "@langchain/cohere": { | |
| "optional": true | |
| }, | |
| "@langchain/community": { | |
| "optional": true | |
| }, | |
| "@langchain/google-genai": { | |
| "optional": true | |
| }, | |
| "@langchain/google-vertexai": { | |
| "optional": true | |
| }, | |
| "@langchain/groq": { | |
| "optional": true | |
| }, | |
| "@langchain/mistralai": { | |
| "optional": true | |
| }, | |
| "@langchain/ollama": { | |
| "optional": true | |
| }, | |
| "@mendable/firecrawl-js": { | |
| "optional": true | |
| }, | |
| "@notionhq/client": { | |
| "optional": true | |
| }, | |
| "@pinecone-database/pinecone": { | |
| "optional": true | |
| }, | |
| "@supabase/supabase-js": { | |
| "optional": true | |
| }, | |
| "@vercel/kv": { | |
| "optional": true | |
| }, | |
| "@xata.io/client": { | |
| "optional": true | |
| }, | |
| "apify-client": { | |
| "optional": true | |
| }, | |
| "assemblyai": { | |
| "optional": true | |
| }, | |
| "axios": { | |
| "optional": true | |
| }, | |
| "cheerio": { | |
| "optional": true | |
| }, | |
| "chromadb": { | |
| "optional": true | |
| }, | |
| "convex": { | |
| "optional": true | |
| }, | |
| "couchbase": { | |
| "optional": true | |
| }, | |
| "d3-dsv": { | |
| "optional": true | |
| }, | |
| "epub2": { | |
| "optional": true | |
| }, | |
| "faiss-node": { | |
| "optional": true | |
| }, | |
| "fast-xml-parser": { | |
| "optional": true | |
| }, | |
| "handlebars": { | |
| "optional": true | |
| }, | |
| "html-to-text": { | |
| "optional": true | |
| }, | |
| "ignore": { | |
| "optional": true | |
| }, | |
| "ioredis": { | |
| "optional": true | |
| }, | |
| "jsdom": { | |
| "optional": true | |
| }, | |
| "mammoth": { | |
| "optional": true | |
| }, | |
| "mongodb": { | |
| "optional": true | |
| }, | |
| "node-llama-cpp": { | |
| "optional": true | |
| }, | |
| "notion-to-md": { | |
| "optional": true | |
| }, | |
| "officeparser": { | |
| "optional": true | |
| }, | |
| "pdf-parse": { | |
| "optional": true | |
| }, | |
| "peggy": { | |
| "optional": true | |
| }, | |
| "playwright": { | |
| "optional": true | |
| }, | |
| "puppeteer": { | |
| "optional": true | |
| }, | |
| "pyodide": { | |
| "optional": true | |
| }, | |
| "redis": { | |
| "optional": true | |
| }, | |
| "sonix-speech-recognition": { | |
| "optional": true | |
| }, | |
| "srt-parser-2": { | |
| "optional": true | |
| }, | |
| "typeorm": { | |
| "optional": true | |
| }, | |
| "weaviate-ts-client": { | |
| "optional": true | |
| }, | |
| "web-auth-library": { | |
| "optional": true | |
| }, | |
| "ws": { | |
| "optional": true | |
| }, | |
| "youtube-transcript": { | |
| "optional": true | |
| }, | |
| "youtubei.js": { | |
| "optional": true | |
| } | |
| } | |
| }, | |
| "node_modules/langchainhub": { | |
| "version": "0.0.11", | |
| "resolved": "https://registry.npmjs.org/langchainhub/-/langchainhub-0.0.11.tgz", | |
| "integrity": "sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==" | |
| }, | |
| "node_modules/langsmith": { | |
| "version": "0.1.41", | |
| "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.1.41.tgz", | |
| "integrity": "sha512-8R7s/225Pxmv0ipMfd6sqmWVsfHLQivYlQZ0vx5K+ReoknummTenQlVK8gapk3kqRMnzkrouuRHMhWjMR6RgUA==", | |
| "dependencies": { | |
| "@types/uuid": "^9.0.1", | |
| "commander": "^10.0.1", | |
| "p-queue": "^6.6.2", | |
| "p-retry": "4", | |
| "semver": "^7.6.3", | |
| "uuid": "^9.0.0" | |
| }, | |
| "peerDependencies": { | |
| "@langchain/core": "*", | |
| "langchain": "*", | |
| "openai": "*" | |
| }, | |
| "peerDependenciesMeta": { | |
| "@langchain/core": { | |
| "optional": true | |
| }, | |
| "langchain": { | |
| "optional": true | |
| }, | |
| "openai": { | |
| "optional": true | |
| } | |
| } | |
| }, | |
| "node_modules/langsmith/node_modules/uuid": { | |
| "version": "9.0.1", | |
| "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", | |
| "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", | |
| "funding": [ | |
| "https://github.com/sponsors/broofa", | |
| "https://github.com/sponsors/ctavan" | |
| ], | |
| "bin": { | |
| "uuid": "dist/bin/uuid" | |
| } | |
| }, | |
| "node_modules/mime-db": { | |
| "version": "1.52.0", | |
| "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", | |
| "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", | |
| "engines": { | |
| "node": ">= 0.6" | |
| } | |
| }, | |
| "node_modules/mime-types": { | |
| "version": "2.1.35", | |
| "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", | |
| "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", | |
| "dependencies": { | |
| "mime-db": "1.52.0" | |
| }, | |
| "engines": { | |
| "node": ">= 0.6" | |
| } | |
| }, | |
| "node_modules/ml-array-mean": { | |
| "version": "1.1.6", | |
| "resolved": "https://registry.npmjs.org/ml-array-mean/-/ml-array-mean-1.1.6.tgz", | |
| "integrity": "sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==", | |
| "dependencies": { | |
| "ml-array-sum": "^1.1.6" | |
| } | |
| }, | |
| "node_modules/ml-array-sum": { | |
| "version": "1.1.6", | |
| "resolved": "https://registry.npmjs.org/ml-array-sum/-/ml-array-sum-1.1.6.tgz", | |
| "integrity": "sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==", | |
| "dependencies": { | |
| "is-any-array": "^2.0.0" | |
| } | |
| }, | |
| "node_modules/ml-distance": { | |
| "version": "4.0.1", | |
| "resolved": "https://registry.npmjs.org/ml-distance/-/ml-distance-4.0.1.tgz", | |
| "integrity": "sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw==", | |
| "dependencies": { | |
| "ml-array-mean": "^1.1.6", | |
| "ml-distance-euclidean": "^2.0.0", | |
| "ml-tree-similarity": "^1.0.0" | |
| } | |
| }, | |
| "node_modules/ml-distance-euclidean": { | |
| "version": "2.0.0", | |
| "resolved": "https://registry.npmjs.org/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz", | |
| "integrity": "sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==" | |
| }, | |
| "node_modules/ml-tree-similarity": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz", | |
| "integrity": "sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==", | |
| "dependencies": { | |
| "binary-search": "^1.3.5", | |
| "num-sort": "^2.0.0" | |
| } | |
| }, | |
| "node_modules/ms": { | |
| "version": "2.1.3", | |
| "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", | |
| "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" | |
| }, | |
| "node_modules/mustache": { | |
| "version": "4.2.0", | |
| "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", | |
| "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", | |
| "bin": { | |
| "mustache": "bin/mustache" | |
| } | |
| }, | |
| "node_modules/node-domexception": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", | |
| "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", | |
| "funding": [ | |
| { | |
| "type": "github", | |
| "url": "https://github.com/sponsors/jimmywarting" | |
| }, | |
| { | |
| "type": "github", | |
| "url": "https://paypal.me/jimmywarting" | |
| } | |
| ], | |
| "engines": { | |
| "node": ">=10.5.0" | |
| } | |
| }, | |
| "node_modules/node-fetch": { | |
| "version": "2.7.0", | |
| "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", | |
| "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", | |
| "dependencies": { | |
| "whatwg-url": "^5.0.0" | |
| }, | |
| "engines": { | |
| "node": "4.x || >=6.0.0" | |
| }, | |
| "peerDependencies": { | |
| "encoding": "^0.1.0" | |
| }, | |
| "peerDependenciesMeta": { | |
| "encoding": { | |
| "optional": true | |
| } | |
| } | |
| }, | |
| "node_modules/num-sort": { | |
| "version": "2.1.0", | |
| "resolved": "https://registry.npmjs.org/num-sort/-/num-sort-2.1.0.tgz", | |
| "integrity": "sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==", | |
| "engines": { | |
| "node": ">=8" | |
| }, | |
| "funding": { | |
| "url": "https://github.com/sponsors/sindresorhus" | |
| } | |
| }, | |
| "node_modules/openai": { | |
| "version": "4.54.0", | |
| "resolved": "https://registry.npmjs.org/openai/-/openai-4.54.0.tgz", | |
| "integrity": "sha512-e/12BdtTtj+tXs7iHm+Dm7H7WjEWnw7O52B2wSfCQ6lD5F6cvjzo7cANXy5TJ1Q3/qc8YRPT5wBTTFtP5sBp1g==", | |
| "dependencies": { | |
| "@types/node": "^18.11.18", | |
| "@types/node-fetch": "^2.6.4", | |
| "abort-controller": "^3.0.0", | |
| "agentkeepalive": "^4.2.1", | |
| "form-data-encoder": "1.7.2", | |
| "formdata-node": "^4.3.2", | |
| "node-fetch": "^2.6.7" | |
| }, | |
| "bin": { | |
| "openai": "bin/cli" | |
| } | |
| }, | |
| "node_modules/openapi-types": { | |
| "version": "12.1.3", | |
| "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", | |
| "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==" | |
| }, | |
| "node_modules/p-finally": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", | |
| "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", | |
| "engines": { | |
| "node": ">=4" | |
| } | |
| }, | |
| "node_modules/p-queue": { | |
| "version": "6.6.2", | |
| "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", | |
| "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", | |
| "dependencies": { | |
| "eventemitter3": "^4.0.4", | |
| "p-timeout": "^3.2.0" | |
| }, | |
| "engines": { | |
| "node": ">=8" | |
| }, | |
| "funding": { | |
| "url": "https://github.com/sponsors/sindresorhus" | |
| } | |
| }, | |
| "node_modules/p-retry": { | |
| "version": "4.6.2", | |
| "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", | |
| "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", | |
| "dependencies": { | |
| "@types/retry": "0.12.0", | |
| "retry": "^0.13.1" | |
| }, | |
| "engines": { | |
| "node": ">=8" | |
| } | |
| }, | |
| "node_modules/p-timeout": { | |
| "version": "3.2.0", | |
| "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", | |
| "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", | |
| "dependencies": { | |
| "p-finally": "^1.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=8" | |
| } | |
| }, | |
| "node_modules/retry": { | |
| "version": "0.13.1", | |
| "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", | |
| "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", | |
| "engines": { | |
| "node": ">= 4" | |
| } | |
| }, | |
| "node_modules/semver": { | |
| "version": "7.6.3", | |
| "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", | |
| "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", | |
| "bin": { | |
| "semver": "bin/semver.js" | |
| }, | |
| "engines": { | |
| "node": ">=10" | |
| } | |
| }, | |
| "node_modules/tr46": { | |
| "version": "0.0.3", | |
| "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", | |
| "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" | |
| }, | |
| "node_modules/undici-types": { | |
| "version": "5.26.5", | |
| "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", | |
| "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" | |
| }, | |
| "node_modules/uuid": { | |
| "version": "10.0.0", | |
| "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", | |
| "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", | |
| "funding": [ | |
| "https://github.com/sponsors/broofa", | |
| "https://github.com/sponsors/ctavan" | |
| ], | |
| "bin": { | |
| "uuid": "dist/bin/uuid" | |
| } | |
| }, | |
| "node_modules/web-streams-polyfill": { | |
| "version": "4.0.0-beta.3", | |
| "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", | |
| "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", | |
| "engines": { | |
| "node": ">= 14" | |
| } | |
| }, | |
| "node_modules/webidl-conversions": { | |
| "version": "3.0.1", | |
| "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", | |
| "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" | |
| }, | |
| "node_modules/whatwg-url": { | |
| "version": "5.0.0", | |
| "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", | |
| "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", | |
| "dependencies": { | |
| "tr46": "~0.0.3", | |
| "webidl-conversions": "^3.0.0" | |
| } | |
| }, | |
| "node_modules/yaml": { | |
| "version": "2.5.0", | |
| "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", | |
| "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", | |
| "bin": { | |
| "yaml": "bin.mjs" | |
| }, | |
| "engines": { | |
| "node": ">= 14" | |
| } | |
| }, | |
| "node_modules/zod": { | |
| "version": "3.23.8", | |
| "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", | |
| "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", | |
| "funding": { | |
| "url": "https://github.com/sponsors/colinhacks" | |
| } | |
| }, | |
| "node_modules/zod-to-json-schema": { | |
| "version": "3.23.2", | |
| "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", | |
| "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", | |
| "peerDependencies": { | |
| "zod": "^3.23.3" | |
| } | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "name": "featherless-langchain-js-example", | |
| "version": "1.0.0", | |
| "main": "index.js", | |
| "scripts": { | |
| "test": "echo \"Error: no test specified\" && exit 1" | |
| }, | |
| "author": "", | |
| "license": "ISC", | |
| "description": "", | |
| "dependencies": { | |
| "@langchain/openai": "^0.2.5", | |
| "dotenv": "^16.4.5", | |
| "langchain": "^0.2.12", | |
| "openai": "^4.54.0" | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment