|
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 |
|
} |
|
|
|
|
|
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}` |
|
} |
|
} |
|
} |
|
|