Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 25 additions & 12 deletions packages/components/nodes/tools/RequestsGet/RequestsGet.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { INode, INodeData, INodeParams } from '../../../src/Interface'
import { getBaseClasses } from '../../../src/utils'
import { RequestsGetTool } from 'langchain/tools'
import { desc, RequestParameters, RequestsGetTool } from './core'

class RequestsGet_Tools implements INode {
label: string
Expand All @@ -22,9 +22,22 @@ class RequestsGet_Tools implements INode {
this.baseClasses = [this.type, ...getBaseClasses(RequestsGetTool)]
this.inputs = [
{
label: 'Max Output Length',
name: 'maxOutputLength',
type: 'number',
label: 'URL',
name: 'url',
type: 'string',
description:
'Agent will make call to this exact URL. If not specified, agent will try to figure out itself from AIPlugin if provided',
additionalParams: true,
optional: true
},
{
label: 'Description',
name: 'description',
type: 'string',
rows: 4,
default: desc,
description: 'Acts like a prompt to tell agent when it should use this tool',
additionalParams: true,
optional: true
},
{
Expand All @@ -39,18 +52,18 @@ class RequestsGet_Tools implements INode {

async init(nodeData: INodeData): Promise<any> {
const headers = nodeData.inputs?.headers as string
const maxOutputLength = nodeData.inputs?.maxOutputLength as string

const obj: any = {}
if (maxOutputLength) {
obj.maxOutputLength = parseInt(maxOutputLength, 10)
}
const url = nodeData.inputs?.url as string
const description = nodeData.inputs?.description as string

const obj: RequestParameters = {}
if (url) obj.url = url
if (description) obj.description = description
if (headers) {
const parsedHeaders = typeof headers === 'object' ? headers : JSON.parse(headers)
return Object.keys(obj).length ? new RequestsGetTool(parsedHeaders, obj) : new RequestsGetTool(parsedHeaders)
obj.headers = parsedHeaders
}
return Object.keys(obj).length ? new RequestsGetTool(undefined, obj) : new RequestsGetTool()

return new RequestsGetTool(obj)
}
}

Expand Down
46 changes: 46 additions & 0 deletions packages/components/nodes/tools/RequestsGet/core.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import fetch from 'node-fetch'
import { Tool } from 'langchain/tools'

export const desc = `A portal to the internet. Use this when you need to get specific content from a website.
Input should be a url (i.e. https://www.google.com). The output will be the text response of the GET request.`

export interface Headers {
[key: string]: string
}

export interface RequestParameters {
headers?: Headers
url?: string
description?: string
maxOutputLength?: number
}

export class RequestsGetTool extends Tool {
name = 'requests_get'
url = ''
description = desc
maxOutputLength = 2000
headers = {}

constructor(args?: RequestParameters) {
super()
this.url = args?.url ?? this.url
this.headers = args?.headers ?? this.headers
this.description = args?.description ?? this.description
this.maxOutputLength = args?.maxOutputLength ?? this.maxOutputLength
}

/** @ignore */
async _call(input: string) {
const inputUrl = !this.url ? input : this.url

if (process.env.DEBUG === 'true') console.info(`Making GET API call to ${inputUrl}`)

const res = await fetch(inputUrl, {
headers: this.headers
})

const text = await res.text()
return text.slice(0, this.maxOutputLength)
}
}
51 changes: 39 additions & 12 deletions packages/components/nodes/tools/RequestsPost/RequestsPost.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { INode, INodeData, INodeParams } from '../../../src/Interface'
import { getBaseClasses } from '../../../src/utils'
import { RequestsPostTool } from 'langchain/tools'
import { RequestParameters, desc, RequestsPostTool } from './core'

class RequestsPost_Tools implements INode {
label: string
Expand All @@ -22,9 +22,31 @@ class RequestsPost_Tools implements INode {
this.baseClasses = [this.type, ...getBaseClasses(RequestsPostTool)]
this.inputs = [
{
label: 'Max Output Length',
name: 'maxOutputLength',
type: 'number',
label: 'URL',
name: 'url',
type: 'string',
description:
'Agent will make call to this exact URL. If not specified, agent will try to figure out itself from AIPlugin if provided',
additionalParams: true,
optional: true
},
{
label: 'Body',
name: 'body',
type: 'json',
description:
'JSON body for the POST request. If not specified, agent will try to figure out itself from AIPlugin if provided',
additionalParams: true,
optional: true
},
{
label: 'Description',
name: 'description',
type: 'string',
rows: 4,
default: desc,
description: 'Acts like a prompt to tell agent when it should use this tool',
additionalParams: true,
optional: true
},
{
Expand All @@ -39,18 +61,23 @@ class RequestsPost_Tools implements INode {

async init(nodeData: INodeData): Promise<any> {
const headers = nodeData.inputs?.headers as string
const maxOutputLength = nodeData.inputs?.maxOutputLength as string

const obj: any = {}
if (maxOutputLength) {
obj.maxOutputLength = parseInt(maxOutputLength, 10)
}
const url = nodeData.inputs?.url as string
const description = nodeData.inputs?.description as string
const body = nodeData.inputs?.body as string

const obj: RequestParameters = {}
if (url) obj.url = url
if (description) obj.description = description
if (headers) {
const parsedHeaders = typeof headers === 'object' ? headers : JSON.parse(headers)
return Object.keys(obj).length ? new RequestsPostTool(parsedHeaders, obj) : new RequestsPostTool(parsedHeaders)
obj.headers = parsedHeaders
}
if (body) {
const parsedBody = typeof body === 'object' ? body : JSON.parse(body)
obj.body = parsedBody
}
return Object.keys(obj).length ? new RequestsPostTool(undefined, obj) : new RequestsPostTool()

return new RequestsPostTool(obj)
}
}

Expand Down
72 changes: 72 additions & 0 deletions packages/components/nodes/tools/RequestsPost/core.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { Tool } from 'langchain/tools'
import fetch from 'node-fetch'

export const desc = `Use this when you want to POST to a website.
Input should be a json string with two keys: "url" and "data".
The value of "url" should be a string, and the value of "data" should be a dictionary of
key-value pairs you want to POST to the url as a JSON body.
Be careful to always use double quotes for strings in the json string
The output will be the text response of the POST request.`

export interface Headers {
[key: string]: string
}

export interface Body {
[key: string]: any
}

export interface RequestParameters {
headers?: Headers
body?: Body
url?: string
description?: string
maxOutputLength?: number
}

export class RequestsPostTool extends Tool {
name = 'requests_post'
url = ''
description = desc
maxOutputLength = Infinity
headers = {}
body = {}

constructor(args?: RequestParameters) {
super()
this.url = args?.url ?? this.url
this.headers = args?.headers ?? this.headers
this.body = args?.body ?? this.body
this.description = args?.description ?? this.description
this.maxOutputLength = args?.maxOutputLength ?? this.maxOutputLength
}

/** @ignore */
async _call(input: string) {
try {
let inputUrl = ''
let inputBody = {}
if (Object.keys(this.body).length || this.url) {
if (this.url) inputUrl = this.url
if (Object.keys(this.body).length) inputBody = this.body
} else {
const { url, data } = JSON.parse(input)
inputUrl = url
inputBody = data
}

if (process.env.DEBUG === 'true') console.info(`Making POST API call to ${inputUrl} with body ${JSON.stringify(inputBody)}`)

const res = await fetch(inputUrl, {
method: 'POST',
headers: this.headers,
body: JSON.stringify(inputBody)
})

const text = await res.text()
return text.slice(0, this.maxOutputLength)
} catch (error) {
return `${error}`
}
}
}
3 changes: 2 additions & 1 deletion packages/components/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,14 @@
"linkifyjs": "^4.1.1",
"mammoth": "^1.5.1",
"moment": "^2.29.3",
"node-fetch": "2",
"node-fetch": "^2.6.11",
"pdf-parse": "^1.1.1",
"weaviate-ts-client": "^1.1.0",
"ws": "^8.9.0"
},
"devDependencies": {
"@types/gulp": "4.0.9",
"@types/node-fetch": "2.6.2",
"@types/ws": "^8.5.3",
"gulp": "^4.0.2",
"typescript": "^4.8.4"
Expand Down
Loading