From 07ca2039e2de7875898dac767a1974278c677dc2 Mon Sep 17 00:00:00 2001 From: Yung Spook Date: Tue, 31 Dec 2024 02:59:55 -0600 Subject: [PATCH] Add Allora Network machine learning (#149) * Add Allora Network machine learning * Allora plugin PR feedback --- .../examples/vercel-ai/allora/.env.template | 5 ++ .../examples/vercel-ai/allora/README.md | 15 ++++ typescript/examples/vercel-ai/allora/index.ts | 45 ++++++++++ .../examples/vercel-ai/allora/package.json | 22 +++++ .../examples/vercel-ai/allora/tsconfig.json | 8 ++ typescript/packages/plugins/allora/README.md | 38 ++++++++ .../packages/plugins/allora/package.json | 41 +++++++++ .../plugins/allora/src/allora.plugin.ts | 20 +++++ .../plugins/allora/src/allora.service.ts | 25 ++++++ typescript/packages/plugins/allora/src/api.ts | 86 +++++++++++++++++++ .../packages/plugins/allora/src/index.ts | 2 + .../packages/plugins/allora/src/parameters.ts | 9 ++ .../packages/plugins/allora/tsconfig.json | 6 ++ .../packages/plugins/allora/tsup.config.ts | 6 ++ typescript/packages/plugins/allora/turbo.json | 11 +++ typescript/pnpm-lock.yaml | 77 ++++++++++++++--- 16 files changed, 404 insertions(+), 12 deletions(-) create mode 100644 typescript/examples/vercel-ai/allora/.env.template create mode 100644 typescript/examples/vercel-ai/allora/README.md create mode 100644 typescript/examples/vercel-ai/allora/index.ts create mode 100644 typescript/examples/vercel-ai/allora/package.json create mode 100644 typescript/examples/vercel-ai/allora/tsconfig.json create mode 100644 typescript/packages/plugins/allora/README.md create mode 100644 typescript/packages/plugins/allora/package.json create mode 100644 typescript/packages/plugins/allora/src/allora.plugin.ts create mode 100644 typescript/packages/plugins/allora/src/allora.service.ts create mode 100644 typescript/packages/plugins/allora/src/api.ts create mode 100644 typescript/packages/plugins/allora/src/index.ts create mode 100644 typescript/packages/plugins/allora/src/parameters.ts create mode 100644 typescript/packages/plugins/allora/tsconfig.json create mode 100644 typescript/packages/plugins/allora/tsup.config.ts create mode 100644 typescript/packages/plugins/allora/turbo.json diff --git a/typescript/examples/vercel-ai/allora/.env.template b/typescript/examples/vercel-ai/allora/.env.template new file mode 100644 index 000000000..e4f9531b1 --- /dev/null +++ b/typescript/examples/vercel-ai/allora/.env.template @@ -0,0 +1,5 @@ +OPENAI_API_KEY= +WALLET_PRIVATE_KEY= +ALLORA_API_URL= +ALLORA_API_KEY= +COINGECKO_API_KEY= diff --git a/typescript/examples/vercel-ai/allora/README.md b/typescript/examples/vercel-ai/allora/README.md new file mode 100644 index 000000000..89bc61646 --- /dev/null +++ b/typescript/examples/vercel-ai/allora/README.md @@ -0,0 +1,15 @@ +# Vercel AI Allora Example + +## Setup + +Copy the `.env.template` and populate with your values. + +``` +cp .env.template .env +``` + +## Usage + +``` +npx ts-node index.ts +``` diff --git a/typescript/examples/vercel-ai/allora/index.ts b/typescript/examples/vercel-ai/allora/index.ts new file mode 100644 index 000000000..5d75823b7 --- /dev/null +++ b/typescript/examples/vercel-ai/allora/index.ts @@ -0,0 +1,45 @@ +import { openai } from '@ai-sdk/openai' +import { generateText } from 'ai' + +import { http, createWalletClient } from 'viem' +import { privateKeyToAccount } from 'viem/accounts' +import { sepolia } from 'viem/chains' + +import { getOnChainTools } from '@goat-sdk/adapter-vercel-ai' + +import { allora } from '@goat-sdk/plugin-allora' +import { coingecko } from "@goat-sdk/plugin-coingecko" +import { viem } from '@goat-sdk/wallet-viem' + +require('dotenv').config() + +const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as `0x${string}`) + +const walletClient = createWalletClient({ + account: account, + transport: http(), + chain: sepolia, +}) + +;(async () => { + const tools = await getOnChainTools({ + wallet: viem(walletClient), + plugins: [ + allora({ + apiKey: process.env.ALLORA_API_KEY, + }), + coingecko({ + apiKey: process.env.COINGECKO_API_KEY as string, + }), + ], + }) + + const result = await generateText({ + model: openai('gpt-4o-mini'), + tools: tools, + maxSteps: 5, + prompt: 'Can you fetch the current price of ETH and the predicted price in 8 hours and make a recommendation as to whether I should buy or sell?', + }) + + console.log(result.text) +})() diff --git a/typescript/examples/vercel-ai/allora/package.json b/typescript/examples/vercel-ai/allora/package.json new file mode 100644 index 000000000..9b19ec229 --- /dev/null +++ b/typescript/examples/vercel-ai/allora/package.json @@ -0,0 +1,22 @@ +{ + "name": "goat-examples-vercel-ai-allora", + "version": "0.1.0", + "description": "", + "private": true, + "scripts": { + "test": "vitest run --passWithNoTests" + }, + "author": "", + "license": "MIT", + "dependencies": { + "@ai-sdk/openai": "^1.0.4", + "@goat-sdk/adapter-vercel-ai": "workspace:*", + "@goat-sdk/core": "workspace:*", + "@goat-sdk/plugin-allora": "workspace:*", + "@goat-sdk/plugin-coingecko": "workspace:*", + "@goat-sdk/wallet-viem": "workspace:*", + "ai": "catalog:", + "dotenv": "^16.4.5", + "viem": "2.21.49" + } +} diff --git a/typescript/examples/vercel-ai/allora/tsconfig.json b/typescript/examples/vercel-ai/allora/tsconfig.json new file mode 100644 index 000000000..a7fc4a937 --- /dev/null +++ b/typescript/examples/vercel-ai/allora/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["index.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/typescript/packages/plugins/allora/README.md b/typescript/packages/plugins/allora/README.md new file mode 100644 index 000000000..d53ac844c --- /dev/null +++ b/typescript/packages/plugins/allora/README.md @@ -0,0 +1,38 @@ +# Goat Allora Plugin šŸ (TypeScript) + +[Allora Network](https://allora.network) plugin for Goat. Allora Network is an AI-powered inference platform that delivers real-time, self-improving predictions and insights for various use cases. By aggregating and analyzing data from diverse sourcesā€”such as blockchain networks and off-chain APIsā€”Allora seamlessly provides low-latency, high-performance predictive analytics without requiring complex infrastructure. The platformā€™s intuitive approach allows developers to focus on building intelligence-driven solutions, while Allora takes care of the heavy lifting behind the scenes. + +## Installation + +``` +npm install @goat-sdk/plugin-allora +``` + +## Setup + +```typescript +import { allora } from '@goat-sdk/plugin-allora' + +const plugin = allora({ + apiKey: process.env.ALLORA_API_KEY, +}) +``` + +## Available Actions + +### Fetch Price Prediction + +Fetches a price prediction for the given asset and timeframe. + +## Goat + +
+Go out and eat some grass. + +[Docs](https://ohmygoat.dev) | [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples) | [Discord](https://discord.gg/goat-sdk)
+ +## Goat šŸ + +Goat šŸ (Great On-chain Agent Toolkit) is an open-source library enabling AI agents to interact with blockchain protocols and smart contracts via their own wallets. + + diff --git a/typescript/packages/plugins/allora/package.json b/typescript/packages/plugins/allora/package.json new file mode 100644 index 000000000..e18f85d78 --- /dev/null +++ b/typescript/packages/plugins/allora/package.json @@ -0,0 +1,41 @@ +{ + "name": "@goat-sdk/plugin-allora", + "version": "0.1.0", + "files": [ + "dist/**/*", + "README.md", + "package.json" + ], + "scripts": { + "build": "tsup", + "clean": "rm -rf dist", + "test": "vitest run --passWithNoTests" + }, + "sideEffects": false, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "dependencies": { + "@goat-sdk/core": "workspace:*", + "zod": "catalog:", + "axios": "1.7.9" + }, + "peerDependencies": { + "@goat-sdk/core": "workspace:*" + }, + "homepage": "https://ohmygoat.dev", + "repository": { + "type": "git", + "url": "git+https://github.com/goat-sdk/goat.git" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/goat-sdk/goat/issues" + }, + "keywords": [ + "ai", + "agents", + "web3", + "allora" + ] +} diff --git a/typescript/packages/plugins/allora/src/allora.plugin.ts b/typescript/packages/plugins/allora/src/allora.plugin.ts new file mode 100644 index 000000000..b7909747a --- /dev/null +++ b/typescript/packages/plugins/allora/src/allora.plugin.ts @@ -0,0 +1,20 @@ +import { PluginBase } from '@goat-sdk/core' +import { AlloraService } from './allora.service' + +export interface AlloraPluginOptions { + apiKey?: string + apiRoot?: string +} + +export class AlloraPlugin extends PluginBase { + constructor(opts: AlloraPluginOptions) { + super('allora', [ new AlloraService(opts) ]) + } + + supportsChain = () => true +} + +export function allora(options: AlloraPluginOptions) { + return new AlloraPlugin(options) +} + diff --git a/typescript/packages/plugins/allora/src/allora.service.ts b/typescript/packages/plugins/allora/src/allora.service.ts new file mode 100644 index 000000000..509a36356 --- /dev/null +++ b/typescript/packages/plugins/allora/src/allora.service.ts @@ -0,0 +1,25 @@ +import { Tool } from '@goat-sdk/core' +import { AlloraAPIClient, AlloraPricePredictionToken, AlloraPricePredictionTimeframe } from './api' +import { GetAlloraPricePredictionParameters } from './parameters' + +export interface AlloraServiceOptions { + apiKey?: string + apiRoot?: string +} + +export class AlloraService { + private readonly client: AlloraAPIClient + + constructor(opts: AlloraServiceOptions) { + this.client = new AlloraAPIClient(opts) + } + + @Tool({ + description: 'Fetch a future price prediction for a crypto asset from Allora Network. Specify 5 minutes from now `5m`, or 8 hours from now `8h`.', + }) + async getPricePrediction(parameters: GetAlloraPricePredictionParameters) { + const { ticker, timeframe } = parameters + return this.client.fetchAlloraPricePrediction(ticker as AlloraPricePredictionToken, timeframe as AlloraPricePredictionTimeframe) + } +} + diff --git a/typescript/packages/plugins/allora/src/api.ts b/typescript/packages/plugins/allora/src/api.ts new file mode 100644 index 000000000..9c40af703 --- /dev/null +++ b/typescript/packages/plugins/allora/src/api.ts @@ -0,0 +1,86 @@ +import axios from 'axios' + +export interface AlloraInferenceData { + network_inference: string + network_inference_normalized: string + confidence_interval_percentiles: string[] + confidence_interval_percentiles_normalized: string[] + confidence_interval_values: string[] + confidence_interval_values_normalized: string[] + topic_id: string + timestamp: number + extra_data: string +} + +export interface AlloraAPIResponse { + request_id: string + status: boolean + data: { + signature: string + inference_data: AlloraInferenceData + } +} + +export enum AlloraPricePredictionToken { + BTC = 'BTC', + ETH = 'ETH', +} + +export enum AlloraPricePredictionTimeframe { + '5m' = '5m', + '8h' = '8h', +} + +export enum AlloraPricePredictionSignatureFormat { + EthereumSepolia = 'ethereum-11155111' +} + +export interface AlloraAPIClientOptions { + apiKey?: string + apiRoot?: string +} + +export class AlloraAPIClient { + private apiKey: string | null | undefined + private apiRoot: string + + constructor(opts: AlloraAPIClientOptions) { + this.apiKey = opts.apiKey + + opts.apiRoot = opts.apiRoot || 'https://api.upshot.xyz/v2/allora' + this.apiRoot = opts.apiRoot[opts.apiRoot.length - 1] === '/' ? opts.apiRoot.substr(0, opts.apiRoot.length - 1) : opts.apiRoot + } + + public async fetchAlloraPricePrediction( + asset: AlloraPricePredictionToken, + timeframe: AlloraPricePredictionTimeframe, + signatureFormat: AlloraPricePredictionSignatureFormat = AlloraPricePredictionSignatureFormat.EthereumSepolia, + ): Promise> { + const url = `consumer/price/${signatureFormat}/${asset}/${timeframe}` + const resp = await this.fetchAlloraAPIData(url) + if (!resp?.data?.inference_data) { + throw new Error(`API response missing data: ${JSON.stringify(resp)}`) + } + return resp.data.inference_data + } + + private async fetchAlloraAPIData(endpoint: string): Promise> { + endpoint = endpoint[0] === '/' ? endpoint.substr(1) : endpoint + + const url = `${this.apiRoot}/${endpoint}` + const headers: Record = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + if (!!this.apiKey) { + headers['x-api-key'] = this.apiKey + } + + const response = await axios.get(url, { headers }) + if (response.status >= 400) { + throw new Error(`Allora plugin: error requesting price prediction: url=${url} status=${response.status} body=${JSON.stringify(response.data, null, 4)}`) + } + + return response.data + } +} diff --git a/typescript/packages/plugins/allora/src/index.ts b/typescript/packages/plugins/allora/src/index.ts new file mode 100644 index 000000000..f722473b4 --- /dev/null +++ b/typescript/packages/plugins/allora/src/index.ts @@ -0,0 +1,2 @@ +export * from './allora.plugin' +export * from './parameters' diff --git a/typescript/packages/plugins/allora/src/parameters.ts b/typescript/packages/plugins/allora/src/parameters.ts new file mode 100644 index 000000000..3fb24037b --- /dev/null +++ b/typescript/packages/plugins/allora/src/parameters.ts @@ -0,0 +1,9 @@ +import { createToolParameters } from '@goat-sdk/core' +import { z } from 'zod' + +export class GetAlloraPricePredictionParameters extends createToolParameters( + z.object({ + ticker: z.enum(['BTC', 'ETH']).describe('The ticker of the currency for which to fetch a price prediction.'), + timeframe: z.enum(['5m', '8h']).describe('The timeframe for the prediction (currently, either "5m" or "8h").'), + }) +) {} diff --git a/typescript/packages/plugins/allora/tsconfig.json b/typescript/packages/plugins/allora/tsconfig.json new file mode 100644 index 000000000..b4ae67c1f --- /dev/null +++ b/typescript/packages/plugins/allora/tsconfig.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "../../../tsconfig.base.json", + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/typescript/packages/plugins/allora/tsup.config.ts b/typescript/packages/plugins/allora/tsup.config.ts new file mode 100644 index 000000000..ca77fa112 --- /dev/null +++ b/typescript/packages/plugins/allora/tsup.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'tsup' +import { treeShakableConfig } from '../../../tsup.config.base' + +export default defineConfig({ + ...treeShakableConfig, +}) diff --git a/typescript/packages/plugins/allora/turbo.json b/typescript/packages/plugins/allora/turbo.json new file mode 100644 index 000000000..45f951676 --- /dev/null +++ b/typescript/packages/plugins/allora/turbo.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://turbo.build/schema.json", + "extends": ["//"], + "tasks": { + "build": { + "inputs": ["src/**", "tsup.config.ts", "!./**/*.test.{ts,tsx}", "tsconfig.json"], + "dependsOn": ["^build"], + "outputs": ["dist/**"] + } + } +} diff --git a/typescript/pnpm-lock.yaml b/typescript/pnpm-lock.yaml index 335af0141..26a80d041 100644 --- a/typescript/pnpm-lock.yaml +++ b/typescript/pnpm-lock.yaml @@ -222,7 +222,7 @@ importers: version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) langchain: specifier: ^0.3.2 - version: 0.3.6(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)) + version: 0.3.6(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)) viem: specifier: 2.21.49 version: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -255,7 +255,7 @@ importers: version: 16.4.5 langchain: specifier: ^0.3.2 - version: 0.3.6(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)))(axios@1.7.4)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)) + version: 0.3.6(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)) viem: specifier: 2.21.49 version: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.24.1) @@ -327,6 +327,36 @@ importers: specifier: 2.21.49 version: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.24.1) + examples/vercel-ai/allora: + dependencies: + '@ai-sdk/openai': + specifier: ^1.0.4 + version: 1.0.11(zod@3.24.1) + '@goat-sdk/adapter-vercel-ai': + specifier: workspace:* + version: link:../../../packages/adapters/vercel-ai + '@goat-sdk/core': + specifier: workspace:* + version: link:../../../packages/core + '@goat-sdk/plugin-allora': + specifier: workspace:* + version: link:../../../packages/plugins/allora + '@goat-sdk/plugin-coingecko': + specifier: workspace:* + version: link:../../../packages/plugins/coingecko + '@goat-sdk/wallet-viem': + specifier: workspace:* + version: link:../../../packages/wallets/viem + ai: + specifier: 'catalog:' + version: 4.0.3(react@19.0.0-rc-66855b96-20241106)(zod@3.24.1) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + viem: + specifier: 2.21.49 + version: 2.21.49(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.24.1) + examples/vercel-ai/chromia: dependencies: '@ai-sdk/openai': @@ -784,7 +814,7 @@ importers: dependencies: '@ai16z/eliza': specifier: 0.1.5-alpha.5 - version: 0.1.5-alpha.5(@google-cloud/vertexai@1.9.0(encoding@0.1.13))(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(handlebars@4.7.8)(react@19.0.0-rc-66855b96-20241106)(sswr@2.1.0(svelte@5.2.12))(svelte@5.2.12)(vue@3.5.13(typescript@5.6.3)) + version: 0.1.5-alpha.5(@google-cloud/vertexai@1.9.0(encoding@0.1.13))(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(react@19.0.0-rc-66855b96-20241106)(sswr@2.1.0(svelte@5.2.12))(svelte@5.2.12)(vue@3.5.13(typescript@5.6.3)) '@goat-sdk/core': specifier: workspace:* version: link:../../core @@ -860,6 +890,18 @@ importers: specifier: 'catalog:' version: 3.23.8 + packages/plugins/allora: + dependencies: + '@goat-sdk/core': + specifier: workspace:* + version: link:../../core + axios: + specifier: 1.7.9 + version: 1.7.9 + zod: + specifier: 'catalog:' + version: 3.23.8 + packages/plugins/coingecko: dependencies: '@goat-sdk/core': @@ -6012,6 +6054,9 @@ packages: axios@1.7.4: resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -11470,7 +11515,7 @@ snapshots: transitivePeerDependencies: - zod - '@ai16z/eliza@0.1.5-alpha.5(@google-cloud/vertexai@1.9.0(encoding@0.1.13))(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(handlebars@4.7.8)(react@19.0.0-rc-66855b96-20241106)(sswr@2.1.0(svelte@5.2.12))(svelte@5.2.12)(vue@3.5.13(typescript@5.6.3))': + '@ai16z/eliza@0.1.5-alpha.5(@google-cloud/vertexai@1.9.0(encoding@0.1.13))(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(react@19.0.0-rc-66855b96-20241106)(sswr@2.1.0(svelte@5.2.12))(svelte@5.2.12)(vue@3.5.13(typescript@5.6.3))': dependencies: '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) '@ai-sdk/google': 0.0.55(zod@3.23.8) @@ -11488,7 +11533,7 @@ snapshots: glob: 11.0.0 js-sha1: 0.7.0 js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + langchain: 0.3.6(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) tinyld: 1.3.4 @@ -18966,6 +19011,14 @@ snapshots: transitivePeerDependencies: - debug + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.1.0: {} b4a@1.6.7: {} @@ -20254,7 +20307,7 @@ snapshots: extension-port-stream@3.0.0: dependencies: - readable-stream: 3.6.2 + readable-stream: 4.6.0 webextension-polyfill: 0.10.0 external-editor@3.1.0: @@ -21388,7 +21441,7 @@ snapshots: kuler@2.0.0: {} - langchain@0.3.6(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): + langchain@0.3.6(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): dependencies: '@langchain/core': 0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) '@langchain/openai': 0.3.14(@langchain/core@0.3.18(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13) @@ -21404,13 +21457,13 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.5(zod@3.23.8) optionalDependencies: - axios: 1.7.4 + axios: 1.7.9 handlebars: 4.7.8 transitivePeerDependencies: - encoding - openai - langchain@0.3.6(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)): + langchain@0.3.6(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)): dependencies: '@langchain/core': 0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)) '@langchain/openai': 0.3.14(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13) @@ -21426,13 +21479,13 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.5(zod@3.23.8) optionalDependencies: - axios: 1.7.4 + axios: 1.7.9 handlebars: 4.7.8 transitivePeerDependencies: - encoding - openai - langchain@0.3.6(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)))(axios@1.7.4)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)): + langchain@0.3.6(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)): dependencies: '@langchain/core': 0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)) '@langchain/openai': 0.3.14(@langchain/core@0.3.6(openai@4.77.0(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) @@ -21448,7 +21501,7 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.5(zod@3.23.8) optionalDependencies: - axios: 1.7.4 + axios: 1.7.9 handlebars: 4.7.8 transitivePeerDependencies: - encoding