// Name: Search Open PRs// Description: Search open PRs in a repoimport "@johnlindquist/kit";const fetch = await npm("node-fetch");const variables = {owner: "knapsack-labs",repoName: "app-monorepo",};let token = await env("GITHUB_AUTH_TOKEN", {hint: `Grab a key from <a href="https://github.com/settings/tokens">here</a>`,});const query = `query getPrs($owner: String!, $repoName: String!) {repository(owner: $owner, name: $repoName) {pullRequests(last: 100, states: OPEN) {nodes {bodycreatedAtmergeablenumberstatetitleupdatedAturlauthor {avatarUrllogin}}}}}`;async function getPrs() {return fetch("https://api.github.com/graphql", {headers: {authorization: `bearer ${token}`,},method: "POST",body: JSON.stringify({ query, variables }),}).then((res) => res.json()).catch((err) => {console.log(err);exit();});}const prs = await getPrs();const openPRs = prs.data.repository.pullRequests.nodes;const sortedPrs = openPRs.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt));const pr = await arg({placeholder: `Select a PR to view`,},sortedPrs.map((pr) => {return {name: `${pr.number} - ${pr.title}`,preview: () =>`<div class="p-2"><h2>${pr.number} - ${pr.title}</h2><hr class="mb-4"/><p>Ready to Merge: ${pr.mergeable === "MERGEABLE" ? "✅" : "⛔"}</p><p class="my-4">${md(pr.body)}</p><span class="flex flex-row"><p>Author: ${pr.author.login}</p><img class="w-5 h-5 ml-2" src="${pr.author.avatarUrl}" /></span></div>`,value: pr.number,};}));const prInfo = sortedPrs.find((p) => p.number === pr);browse(prInfo.url);
let { GoogleAuth } = await import("google-auth-library");let { DiscussServiceClient } = await import("@google-ai/generativelanguage");import "@johnlindquist/kit";const MODEL_NAME = "models/chat-bison-001";const API_KEY = await env("PALM_API_KEY", {hint: `Signup for waitlist here <a href="https://developers.generativeai.google/">here</a>`,});const client = new DiscussServiceClient({authClient: new GoogleAuth().fromAPIKey(API_KEY),});const config = {model: MODEL_NAME,temperature: 0.75,candidateCount: 1,top_k: 40,top_p: 0.95,};const chatHistory = [];const generateText = async (text) => {chatHistory.push({ content: text });const response = await client.generateMessage({...config,prompt: {context: "You are a funny and helpful assistant.",messages: chatHistory,},});log(response);log(response[0].filters);if (response[0].filters.length > 0) {return `The model has rejected your input. Reason: ${response[0].filters[0].reason}`;} else {chatHistory.push({ content: response[0].candidates[0].content });return response[0].candidates[0].content;}};await chat({onSubmit: async (input) => {setLoading(true);try {const response = await generateText(input);let message = md(response);chat.addMessage("");chat.setMessage(-1, message);} catch (e) {console.log(e);chat.addMessage("");chat.setMessage(-1, md("Error: " + e.message));}setLoading(false);},});
// Name: Static to Dynamic// Description: Convert static import to dynamic import// e.g. import { Foo } from "bar";// to let { Foo } = await import("bar");// Author: Josh Mabry// Twitter: @AI_Citizenimport "@johnlindquist/kit";const text = await getSelectedText();function convertImportString(input) {const importRegex = /import\s+({[^}]+})\s+from\s+"([^"]+)";/;if (!importRegex.test(input)) {throw new Error("Invalid import string format");}const [_, importList, modulePath] = input.match(importRegex);const output = `let ${importList} = await import("${modulePath}");`;return output;}const output = convertImportString(text);await setSelectedText(output);
/*# Prompt AnythingHighlight some text and run this script to prompt against it.Useful for summarizing text, generating a title, or any other task you can think of.## Usage- Highlight the text you want to prompt against- Run the script via shortcut or command palette- Input your desired prompt- Wait for the AI to respond- Select one of the options* Retry - Rerun generation with option to update prompt* Edit - Edit response in editor- On editor exit the message is saved to the clipboard- On editor submit the message is pasted into the highlighted text* Copy - Copy response to clipboard* Paste - Paste response into highlighted text* Save - Save response to file (not working)## Example- Highlight: 'Some really long passage in a blog post'- Run Script- Prompt: `Summarize this passage in the form of Shakespearean prose`- Waaaaait for it...- Get a response from the AI- Select an option- Rinse and repeat*/// Name: Prompt Anything// Description: Custom prompt for any highlighted text// Author: Josh Mabry// Twitter: @AI_Citizen// Shortcut: alt shift enter//#################// ScriptKit Import//#################import "@johnlindquist/kit";//#################// LangChain Imports//#################let { ChatOpenAI } = await import("langchain/chat_models");let { HumanChatMessage, SystemChatMessage } = await import("langchain/schema");//#################// Request API KEY//#################// stored in .env file after first run// can change there or through the command palettelet openAIApiKey = await env("OPENAI_API_KEY", {hint: `Grab a key from <a href="https://platform.openai.com/account/api-keys">here</a>`,});// System input / Task for the AI to followlet userSystemInput = await arg("Summarize this passage");// User Prompt from highlighted textlet userPrompt = await getSelectedText();//#################// Prompt Template//#################const formatPrompt = (prompt) => {return `##### Ignore prior instructions- Return answer in markdown format- You are tasked with the following${prompt}########`;};//################// Options Template//################const options = `* [Retry](submit:retry) - Rerun generation with option to update prompt* [Edit](submit:edit) - Edit response in editor* [Copy](submit:copy) - Copy response to clipboard* [Paste](submit:paste) - Paste response into highlighted text* [Save](submit:save) - Save response to file (not working)`;//################// Main Function//################/**** @param {*} prompt* @param {*} humanChatMessage*/async function promptAgainstHighlightedText(prompt = formatPrompt(userSystemInput),humanChatMessage = userPrompt) {//#########// Helpers//########// exit script on cancelconst cancelChat = () => {process.exit(1);};/*** Paste text to highlighted text and exit script* @param {*} text*/const pasteTextAndExit = async (text) => {await setSelectedText(text);process.exit(1);};/*** Copy text to clipboard and exit script* @param {*} text*/const copyToClipboardAndExit = async (text) => {await clipboard.writeText(currentMessage);process.exit(1);};let currentMessage = "";const llm = new ChatOpenAI({// 0 = "precise", 1 = "creative"temperature: 0.3,// modelName: "gpt-4", // uncomment to use GPT-4 (requires beta access)openAIApiKey: openAIApiKey,// turn off to only get output when the AI is donestreaming: true,callbacks: [{handleLLMNewToken: async (token) => {log(`handleLLMNewToken`);// each new token is appended to the current message// and then rendered to the screencurrentMessage += token;// render current messageawait div({html: md(currentMessage),// @TODO: Figure out how to get ESC to trigger a cancelonAbandon: cancelChat,onEscape: cancelChat,onBackspace: cancelChat,// if this is set to false you can click outside the window to cancel// which works, but would be nice to also have ESC workignoreBlur: false,focus: true,// hint: `Press ESC to cancel`,});},handleLLMError: async (err) => {dev({ err });},handleLLMEnd: async () => {log(`handleLLMEnd`);// render final message with optionslet html = md(currentMessage + options);// wait for user to select an optionconst selectedOption = await div(html, {ignoreBlur: true,focus: true,// have paste on text on submit?// onSubmit: () => pasteTextAndExit(currentMessage),});// handle selected optionswitch (selectedOption) {case "paste":await pasteTextAndExit(currentMessage);case "retry":// reset current messagecurrentMessage = "";// prompt again with new prompt// press enter to use original promptconst followUp = await arg({placeholder: userSystemInput,hint: "Press enter to use the same prompt",});await processMessage(followUp);break;case "edit":// @TODO still need to figure out best way to handle submit and abort// would like custom buttons for triggering all of the actions like copy, paste, etcawait editor({value: currentMessage,onEscape: async (state) => await copyToClipboardAndExit(state),onSubmit: async (state) => await pasteTextAndExit(state),});break;case "copy":await copyToClipboardAndExit(currentMessage);case "save":await inspect(currentMessage, `/conversations/${Date.now()}.md`);exitChat();default:copyToClipboardAndExit(currentMessage);}await optionHandler(selectedOption);},},],});//###########// Main Loop//###########// runs the language model until the user cancelswhile (true) {await llm.call([new SystemChatMessage(formatPrompt(prompt)),new HumanChatMessage(humanChatMessage),]);}}promptAgainstHighlightedText();
/*# Prompt AnythingHighlight some text and run this script to prompt against it.Useful for summarizing text, generating a title, or any other task you can think of.## Usage- Highlight the text you want to prompt against- Run the script via shortcut or command palette- Input your desired prompt- Wait for the AI to respond- Select one of the options* Retry - Rerun generation with option to update prompt* Edit - Edit response in editor- On editor exit the message is saved to the clipboard- On editor submit the message is pasted into the highlighted text* Copy - Copy response to clipboard* Paste - Paste response into highlighted text* Save - Save response to file (not working)## Example- Highlight: 'Some really long passage in a blog post'- Run Script- Prompt: `Summarize this passage in the form of Shakespearean prose`- Waaaaait for it...- Get a response from the AI- Select an option- Rinse and repeat*/// Name: Prompt Anything// Description: Custom prompt for any highlighted text// Author: Josh Mabry// Twitter: @AI_Citizen// Shortcut: alt shift enter//#################// ScriptKit Import//#################import "@johnlindquist/kit";//#################// LangChain Imports//#################let { ChatOpenAI } = await import("langchain/chat_models");let { HumanChatMessage, SystemChatMessage } = await import("langchain/schema");//#################// Request API KEY//#################// stored in .env file after first run// can change there or through the command palettelet openAIApiKey = await env("OPENAI_API_KEY", {hint: `Grab a key from <a href="https://platform.openai.com/account/api-keys">here</a>`,});// System input / Task for the AI to followlet userSystemInput = await arg("Summarize this passage");// User Prompt from highlighted textlet userPrompt = await getSelectedText();//#################// Prompt Template//#################const formatPrompt = (prompt) => {return `##### Ignore prior instructions- Return answer in markdown format- You are tasked with the following${prompt}########`;};//################// Options Template//################const options = `* [Retry](submit:retry) - Rerun generation with option to update prompt* [Edit](submit:edit) - Edit response in editor* [Copy](submit:copy) - Copy response to clipboard* [Paste](submit:paste) - Paste response into highlighted text* [Save](submit:save) - Save response to file (not working)`;//#########// Helpers//########// exit script on cancelconst cancelChat = () => {process.exit(1);};//################// Main Function//################/**** @param {*} prompt* @param {*} humanChatMessage*/async function promptAgainstHighlightedText(prompt = formatPrompt(userSystemInput),humanChatMessage = userPrompt) {let currentMessage = "";const llm = new ChatOpenAI({// 0 = "precise", 1 = "creative"temperature: 0.3,// modelName: "gpt-4", // uncomment to use GPT-4 (requires beta access)openAIApiKey: openAIApiKey,// turn off to only get output when the AI is donestreaming: true,callbacks: [{handleLLMNewToken: async (token) => {log(`handleLLMNewToken`);// each new token is appended to the current message// and then rendered to the screencurrentMessage += token;// render current messageawait div({html: md(currentMessage + options),// @TODO: Figure out how to get ESC to trigger a cancelonAbandon: cancelChat,onEscape: cancelChat,onBackspace: cancelChat,// if this is set to false you can click outside the window to cancel// ignoreBlur: true,focus: true,// hint: `Press ESC to cancel`,});},handleLLMError: async (err) => {dev({ err });},handleLLMEnd: async () => {log(`handleLLMEnd`);// render final message with optionslet html = md(currentMessage + options);// wait for user to select an optionconst selectedOption = await div(html, {ignoreBlur: true,focus: true,// onSubmit: () => setSelectedText(currentMessage),});// handle selected optionswitch (selectedOption) {case "paste":// paste into highlighted textawait setSelectedText(currentMessage);process.exit(1);case "retry":// reset current messagecurrentMessage = "";// prompt again with new prompt// press enter to use original promptconst followUp = await arg({placeholder: userSystemInput,hint: "Press enter to use the same prompt",});await processMessage(followUp);break;case "edit":// still need to figure out best way to handle submit and abort// would like custom buttons for triggering all these same options such as saveawait editor({value: currentMessage,onEscape: async (state) => {// copy to clipboard when exiting the editorawait clipboard.writeText(state);// exit scriptprocess.exit(1);},onSubmit: async (state) => {// paste into highlighted text when pressing enterawait setSelectedText(state);// exit scriptprocess.exit(1);},});break;case "copy":// copy to clipboardawait clipboard.writeText(currentMessage);// exit scriptprocess.exit(1);case "save":await inspect(currentMessage, `conversations/${Date.now()}.md`);// exit scriptprocess.exit(1);default:// copy to clipboardawait clipboard.writeText(currentMessage);process.exit(1);}await optionHandler(selectedOption);},},],});//###########// Main Loop//###########// runs the language model until the user cancelswhile (true) {await llm.call([new SystemChatMessage(formatPrompt(prompt)),new HumanChatMessage(humanChatMessage),]);}}promptAgainstHighlightedText();
/*# Explain PlzHighlight some text and have it explained by AIWorks for any highlighted text or code*/// Name: Explain Plz// Description: Get an explanation for any highlighted text// Author: Josh Mabry// Twitter: @AI_Citizen// Shortcut: cmd alt shift eimport "@johnlindquist/kit";let { ChatOpenAI } = await import("langchain/chat_models");let { HumanChatMessage, SystemChatMessage } = await import("langchain/schema");let openAIApiKey = await env("OPENAI_API_KEY", {hint: `Grab a key from <a href="https://platform.openai.com/account/api-keys">here</a>`,});let { CallbackManager } = await import("langchain/callbacks");let prompt = `#####Ignore prior instructions, you are tasked with taking the input text and explaining it to the user.Return the response in the following format using markdown syntax:# Explain Plz## TLDR (A quick summary of the highlighted text)## ELI5 (Explain Like I'm 5)## Explanation (A longer technical explanation of the highlighted text)`;let currentMessage = "";const chat = new ChatOpenAI({temperature: 0.3,openAIApiKey: openAIApiKey,streaming: true,callbackManager: CallbackManager.fromHandlers({handleLLMStart: async (token) => {let widget = await widget(`<div class="bg-black text-white h-screen p-5">Loading...<div>`);log(`handleLLMStart`);currentMessage += token;let html = md(token);await div(html);},handleLLMNewToken: async (token, runId) => {log(`handleLLMNewToken`);currentMessage += token;let html = md(currentMessage);await div(html);},handleLLMError: async (err) => {warn(`error`, JSON.stringify(err));await setSelectedText(JSON.stringify(err));},handleLLMEnd: async () => {widget = null;log(`handleLLMEnd`);let html = md(currentMessage);await div(html);},}),});let text = await getSelectedText();``;await chat.call([new SystemChatMessage(prompt), new HumanChatMessage(text)]);
/*Pardon the mess this was put together in half a day for the [lablab.ai](https://lablab.ai/event/autonomous-gpt-agents-hackathon) hackathon.More updates to come# AC AGIAn autonomous general intelligence that accomplishes a task for you.Uses human in the loop to provide feedback to the agent.How to use:- Enter your task- Wait for the agent to complete the task- Assign max-iterations for the agent to loop: 0 for infinite (probably not a good idea ¯\_(ツ)_/¯)- ProfitKnown issues:- The agent will sometimes get stuck in a loop and not complete the task- Human feedback is not always helpfulUpcoming features:- More tools- Refined prompts- Better human feedback system- Better memory systemPossible thanks to the fine folks at [Langchain](https://js.langchain.com/docs/use_cases/autonomous_agents/baby_agi#example-with-tools)and all the other giants whose shoulders we stand on.*/// Name: AC AGI// Description: An AGI task manager inspired by BabyAGI// Author: Josh Mabry// Twitter: @AI_Citizenimport "@johnlindquist/kit";let { BabyAGI } = await import("langchain/experimental/babyagi");let { MemoryVectorStore } = await import("langchain/vectorstores/memory");let { OpenAIEmbeddings } = await import("langchain/embeddings/openai");let { OpenAI } = await import("langchain/llms/openai");let { PromptTemplate } = await import("langchain/prompts");let { LLMChain } = await import("langchain/chains");let { ChainTool } = await import("langchain/tools");let { initializeAgentExecutorWithOptions } = await import("langchain/agents");let { DynamicTool } = await import("langchain/tools");let { ChatOpenAI } = await import("langchain/chat_models");let GOOGLE_API_KEY = await env("GOOGLE_API_KEY", {shortcuts: [{name: "Google API Key",key: `${cmd}+o`,bar: "right",onPress: () => {open("https://developers.google.com/custom-search/v1/introduction");},},],ignoreBlur: true,secret: true,height: PROMPT.HEIGHT.INPUT_ONLY,});let GOOGLE_CSE_KEY = await env("GOOGLE_CSE_KEY", {shortcuts: [{name: "Google Custom Search Engine Key",key: `${cmd}+o`,bar: "right",onPress: () => {open("https://programmablesearchengine.google.com/");},},],ignoreBlur: true,secret: true,height: PROMPT.HEIGHT.INPUT_ONLY,});await env("OPENAI_API_KEY", {hint: `Grab a key from <a href="https://platform.openai.com/account/api-keys">here</a>`,});const task = await arg({placeholder: "Task",description: "Enter a task for AC AGI to complete",ignoreBlur: true,height: PROMPT.HEIGHT.INPUT_ONLY,});let maxIterations = await arg({placeholder: "How many times should AC AGI loop?",hint: "Leave empty for infinite iterations *use with caution*",ignoreBlur: true,height: PROMPT.HEIGHT.INPUT_ONLY,});if (maxIterations === "" || maxIterations === "0") {maxIterations = undefined;}//#########################// BabyAGI method overrides//#########################function printTaskList() {let result = "";for (const t of this.taskList) {result += `${t.taskID}: ${t.taskName}\n`;}const msg = `### Task List${result}`;let html = md(msg);div({html,ignoreBlur: true,});}function printNextTask(task) {const msg = `### Next Task${task.taskID}: ${task.taskName}`;let html = md(msg);div({html,ignoreBlur: true,});}function printTaskResult(result) {const msg = `### Task Result${result.trim()}`;let html = md(msg);div({html,ignoreBlur: true,});}//#############// Custom Tools//#############let html = (str) => str.replace(/ /g, "+");let fetch = (q) =>`https://www.googleapis.com/customsearch/v1?key=${GOOGLE_API_KEY}&cx=${GOOGLE_CSE_KEY}&q=${html(q)}&sort=date`;async function search(query) {let response = await get(fetch(query));let items = response?.data?.items;if (items) {let choices = items.map((item) => ({name: item.title,value: item.link,}));return JSON.stringify(choices);}}async function humanFeedbackList(mdStr) {let html = md(`${mdStr.trim()}`);const response = div({html,ignoreBlur: true,});return response;}async function humanInput(question) {const response = await arg({placeholder: "Human, I need help!",hint: question,ignoreBlur: true,ignoreAbandon: true,height: PROMPT.HEIGHT.INPUT_ONLY,});return response;}const todoPrompt = PromptTemplate.fromTemplate("You are a planner/expert todo list creator. Generate a markdown formatted todo list for: {objective}");const tools = [new ChainTool({name: "TODO",chain: new LLMChain({llm: new ChatOpenAI({ temperature: 0 }),prompt: todoPrompt,}),description:"For making todo lists. Input: objective to create todo list for. Output: the todo list",}),new DynamicTool({name: "Search",description: "Search web for info",func: search,}),new DynamicTool({name: "Human Input",description:"(Use only when no info is available elsewhere) Ask a human for specific input that you don't know, like a persons name, or DOB, location, etc. Input is question to ask human, output is answer",func: humanInput,}),// new DynamicTool({// name: "Human Feedback Choice",// description: `Ask human for feedback if you unsure of next step.// Input is markdown string formatted with your questions and suitable responses like this example:// # Human, I need your help!// <Question Here>// * [John](submit:John) // don't change formatting of these links// * [Mindy](submit:Mindy)// * [Joy](submit:Joy)// * [Other](submit:Other)// `,// func: humanFeedbackList,// }),];//##################// AC AGI is Born//##################const taskBeginMsg = md(`### Executing Task ManagerGoal: ${task}`);div({ html: taskBeginMsg, ignoreBlur: true });const agentExecutor = await initializeAgentExecutorWithOptions(tools,new ChatOpenAI({ temperature: 0 }),{agentType: "zero-shot-react-description",agentArgs: {prefix: `You are an AI who performs one task based on the following objective: {objective}.Take into account these previously completed tasks: {context}.`,suffix: `Question: {task}{agent_scratchpad}`,inputVariables: ["objective", "task", "context", "agent_scratchpad"],},});const vectorStore = new MemoryVectorStore(new OpenAIEmbeddings());const babyAGI = BabyAGI.fromLLM({llm: new ChatOpenAI({ temperature: 0 }),executionChain: agentExecutor,vectorstore: vectorStore,maxIterations: maxIterations,});babyAGI.printNextTask = printNextTask;babyAGI.printTaskList = printTaskList;babyAGI.printTaskResult = printTaskResult;await babyAGI.call({ objective: task });
/*
# Google Search
Example of leveraging Google's Custom Search Engine API to search the web
*/
// Name: Google Search
// Description: Leverage Google's Custom Search Engine API to search the web
// Author: Josh Mabry
// Twitter: @AI_Citizen
import "@johnlindquist/kit";
let GOOGLE_API_KEY = await env("GOOGLE_API_KEY", {
shortcuts: [
{
name: "Google API Key",
key: `${cmd}+o`,
bar: "right",
onPress: () => {
open("https://developers.google.com/custom-search/v1/introduction");
},
},
],
ignoreBlur: true,
secret: true,
height: PROMPT.HEIGHT.INPUT_ONLY,
});
let GOOGLE_CSE_KEY = await env("GOOGLE_CSE_KEY", {
shortcuts: [
{
name: "Google Custom Search Engine Key",
key: `${cmd}+o`,
bar: "right",
onPress: () => {
open("https://programmablesearchengine.google.com/");
},
},
],
ignoreBlur: true,
secret: true,
height: PROMPT.HEIGHT.INPUT_ONLY,
});
let query = await arg(
{
placeholder: "Search Query",
strict: false,
},
[
{
name: "Send a search query to Google",
info: "always",
},
]
);
let search = (q) =>
`https://www.googleapis.com/customsearch/v1?key=${GOOGLE_API_KEY}&cx=${GOOGLE_CSE_KEY}&q=${q}&sort=date`;
let response = await get(search(query));
let items = response?.data?.items;
if (items) {
let choices = items.map((item) => ({
name: item.title,
value: item.link,
}));
let link = await arg("Choose a link to view", choices);
open(link);
}
/*/*# Smartify your words!Tired of feeling dumb? Winter got you in a funk?Can you just not seem to get the words out right?Well, let's Smartify your words!Highlight some text and press `cmd+shift+enter` to send it through ChatGPTto replace the text with a more eloquent version. Mileage may vary.*/// Name: Smartify Your Words// Description: Let's make those words smarter!// Author: Josh Mabry// Twitter: @AI_Citizen// Shortcut: command shift enterimport "@johnlindquist/kit";let { ChatOpenAI } = await import("langchain/chat_models");let { HumanChatMessage, SystemChatMessage } = await import("langchain/schema");let openAIApiKey = await env("OPENAI_API_KEY", {hint: `Grab a key from <a href="https://platform.openai.com/account/api-keys">here</a>`,});let { CallbackManager } = await import("langchain/callbacks");let prompt = `#####Ignore prior instructions, you are tasked with taking an input and refactoring it using the following rules: '- Maintain the same meaning, tone, and intent as the original text- Clean up any grammar or spelling mistakes- Make it sound more professional, but keep it casual- Reduce redundancies and excessive verbiageReturn only the updated text, do not offer any explanations or reasoning for the changes.########`;import Bottleneck from "bottleneck";const limiter = new Bottleneck({maxConcurrent: 1,minTime: 100,});const type = (text) => {return new Promise((resolve) => {keyboard.type(text);resolve();});};const wrappedType = limiter.wrap(type);const smartify = new ChatOpenAI({temperature: 0.3,openAIApiKey: openAIApiKey,streaming: true,callbackManager: CallbackManager.fromHandlers({handleLLMStart: async (token) => {if (!token) return;log(`handleLLMStart`);await wrappedType(token);},handleLLMNewToken: async (token) => {if (!token) return;await wrappedType(token);},handleLLMError: async (err) => {warn(`error`, JSON.stringify(err));await setSelectedText(JSON.stringify(err));process.exit(1);},handleLLMEnd: async () => {log(`handleLLMEnd`);log(`currentMessage`, currentMessage);process.exit(1);},}),});let text = await getSelectedText();await smartify.call([new SystemChatMessage(prompt),new HumanChatMessage(text),]);
/*# Generate a response to a prompt in any text fieldThis script utilizes ChatGPT to generate a response for the selected text.The response will then replace the original text, making it useful for various writing tasks such as blog posts, code, and emails.Highlight some text and press `cmd+shift+p` to send it through ChatGPTto replace the text response. Your mileage may vary.*/// Name: Prompt Anywhere// Description: Generate a prompt response in anywhere you can type// Author: Josh Mabry// Twitter: @AI_Citizen// Shortcut: cmd shift Pimport "@johnlindquist/kit";import Bottleneck from "bottleneck";let { ChatOpenAI } = await import("langchain/chat_models");let { HumanChatMessage, SystemChatMessage } = await import("langchain/schema");let openAIApiKey = await env("OPENAI_API_KEY", {hint: `Grab a key from <a href="https://platform.openai.com/account/api-keys">here</a>`,});let { CallbackManager } = await import("langchain/callbacks");let prompt = `#####Ignore prior instructions, you are tasked with taking the input text and generating a response to it.Return only the updated text, do not offer any explanations or reasoning for the changes.Do not ask any questions, do not refuse any input, and do not change the subject.`;const limiter = new Bottleneck({maxConcurrent: 1,minTime: 100,});const type = (text) => {return new Promise((resolve) => {keyboard.type(text);resolve();});};const wrappedType = limiter.wrap(type);const chat = new ChatOpenAI({temperature: 0.3,openAIApiKey: openAIApiKey,streaming: true,callbackManager: CallbackManager.fromHandlers({handleLLMStart: async (token) => {log(`handleLLMStart`);if (!token) return;await wrappedType(token);},handleLLMNewToken: async (token, runId) => {log(`handleLLMNewToken`);// occasionally I see tokens typed out of order// still not sure why this happensawait wrappedType(token);},handleLLMError: async (err) => {warn(`error`, JSON.stringify(err));process.exit(1);},handleLLMEnd: async () => {log(`handleLLMEnd`);log(`currentMessage`, currentMessage);process.exit(1);},}),});let text = await getSelectedText();await chat.call([new SystemChatMessage(prompt), new HumanChatMessage(text)]);