Search

Results include substring matches and semantically similar vals. Learn more
toowired avatar
gptmemory
@toowired
A simple Rest API that allows for you GPT to save and recall snippets of data (memories). You can read my blog post explaining it in detail here: xkonti.tech Demonstration First conversation: What GPT sent do the API: { "name": "Life Essence and Biological Processes", "description": "Explore the role of life essence in enabling biological processes, with a focus on how dimensional interference, particularly from the Incorporeal dimension, facilitates the existence of these processes. This exploration should delve into the complex interplay between the Physical and Incorporeal dimensions, examining how life essence acts as a crucial element in the emergence and sustenance of life in the Physical dimension.", "summary": "Expanding on the role of life essence in biological processes, emphasizing the interaction between the Physical and Incorporeal dimensions.", "reason": "To deepen the understanding of how life essence, influenced by dimensional interference, is essential for biological processes in the novel's universe." } Separate conversation somewhere in the future: Setup There are several steps to set up the API: deploy and configure the API create the API key for your GPT add an action for the API in you GPT add prompt section to your GPT so that it can use it properly Deploying the API on Val Town Deploy your own memory API. You can fork the following Val to do it: https://www.val.town/v/xkonti/memoryApiExample In the code configure the appropriate values: apiName the name of your API - used in the Privacy Policy (eg. Memory API ) contactEmail - the email to provide for contact in the Privacy Policy (eg. some@email.com ) lastPolicyUpdate - the date the Privacy Policy was last updated (eg. 2023-11-28 ) blobKeyPrefix - the prefix for the blob storage keys used by your API - more info below (eg. gpt:memories: ) apiKeyPrefix - the prefix for you API Keys secrets - more info below (eg. GPTMEMORYAPI_KEY_ ) Create API keys The Memory API is designed to serve multiple GPTs at the same time. Each GPT should have it's own unique name and API key . The name is used for identifying the specific GPT and appended to both: blobKeyPrefix - to maintain separate memory storage from other GPTs apiKeyPrefix - to maintain separate API key for each GPT Please pick a unique alphanumeric name for your GPT. For example personaltrainer . Generate some alphanumeric API key for your GPT. For example Wrangle-Chapped-Monkhood4-Domain-Suspend Add a new secret to your Val.town secrets storage. The Key should be the picked name prefixed by apiKeyPrefix . Using the default it would be GPTMEMORYAPI_KEY_personaltrainer . The value of the secret should be the API key itself. The memories of the GPT will be stored in the blob storage under the key blobKeyPrefix + name , for example: gpt:memories:personaltrainer . Adding GPT action Add a new action in your GPT. Get the OpenAPI spefication by calling the /openapi endpoint of your API Change all <APIURL> instances within the specification to the url of your deployed API. For example https://xkonti-memoryapiexample.web.val.run Set the authentication method to basic and provide a base64 encoded version of the <name>:<apiKey> . For example: personaltrainer:Wrangle-Chapped-Monkhood4-Domain-Suspend -> cGVyc29uYWx0cmFpbmVyOldyYW5nbGUtQ2hhcHBlZC1Nb25raG9vZDQtRG9tYWluLVN1c3BlbmQ= Add the link to the privacy policy, which is the /privacy endpoint of your API. For example: https://xkonti-memoryapiexample.web.val.run/privacy Adding the prompt section To make your GPT understand the usage of your new action you should include usage instruction in your prompt. Here's an example of such instructions section: # Long-term memory At some point the user might ask you to do something with "memory". Things like "remember", "save to memory", "forget", "update memory", etc. Please use corresponding actions to achieve those tasks. User might also ask you to perform some task with the context of your "memory" - in that case fetch all memories before proceeding with the task. The memories should be formed in a clear and purely informative language, void of unnecessary adjectives or decorative language forms. An exception to that rule might be a case when the language itself is the integral part of information (snippet of writing to remember for later, examples of some specific language forms, quotes, etc.). Structure of a memory: - name - a simple name of the memory to give it context at a glance - description - a detailed description of the thing that should be remembered. There is no length limit. - summary - a short summary of the memory. This should be formed in a way that will allow for ease of understanding which memories to retrieve in full detail just by reading the list of summaries. If there are some simple facts that have to be remembered and are the main point of the memory they should be included in the summary. The summary should also be written in a compressed way with all unnecessary words skipped if possible (more like a set of keywords or a Google Search input). - reason - the reason for the remembering - this should give extra information about the situation in which the memory was requested to be saved. The memory accessed through those actions is a long-term memory persistent between various conversations with the user. You can assume that there already are many memories available for retrieval. In some situations you might want to save some information to your memory for future recall. Do it in situations where you expect that some important details of the conversation might be lost and should be preserved. Analogously you can retrieve memories at any point if the task at hand suggests the need or there isn't much information about the subject in your knowledge base.
Script
1. Add a new action in your GPT.
2. Get the OpenAPI spefication by calling the `/openapi` endpoint of your API
3. Change all `<APIURL>` instances within the specification to the url of your deployed API. For example `https://xkonti-memo
jamisonl avatar
adorableRedChameleon
@jamisonl
Bot for Cama discord server. To initialize new slash commands, you have to run a separate bit of code. This is for modifying their functionality
HTTP
mmands, you have to run a separate bit of code. This is for modifying their functionality
const rest = new REST({ version: "9" }).setToken(process.env.DISCORD_BOT_TOKEN);
async function findUserVoiceChannel(guildId, userId) {
try {
return null;
async function sayMessage(guildId, channelId, message) {
const url = googleTTS.getAudioUrl(message, {
resolve();
function createDiscordJSAdapter(channelId, guildId) {
return {
req.headers.get("X-Signature-Timestamp"),
// Get the user calling this slash command
const userId = await body.member?.user?.id;
elan avatar
myApi
@elan
An interactive, runnable TypeScript val by elan
Script
export function myApi(name) {
return "hi " + name;
squidpunch avatar
myApi
@squidpunch
An interactive, runnable TypeScript val by squidpunch
Script
export function myApi(name) {
return "hi " + name;
zzz avatar
Tokenizer
@zzz
An interactive, runnable TypeScript val by zzz
Script
return this._encoder.encode(text);
async function loadModel(modelName: Model) {
if (!_init) {
return await load((registry as Registry)[models[modelName]]);
async function buildEncoder(modelName: Model) {
const model = await loadModel(modelName);
return new Tiktoken(model.bpe_ranks, model.special_tokens, model.pat_str);
async function tokenize(text: string, modelName?: Model) {
modelName = modelName ?? "gpt-3.5-turbo";
lpoulter avatar
myApi
@lpoulter
An interactive, runnable TypeScript val by lpoulter
Script
export function myApi(name) {
return "hi " + name;
dhvanil avatar
val_s1Vy2SyJHW
@dhvanil
An interactive, runnable TypeScript val by dhvanil
HTTP
export async function val_s1Vy2SyJHW(req) {
try {
// Execute the code directly and capture its result
jamisonl avatar
ruralCrimsonGuppy
@jamisonl
Bot for Cama discord server. To initialize new slash commands, you have to run a separate bit of code. This is for modifying their functionality
HTTP
mmands, you have to run a separate bit of code. This is for modifying their functionality
const rest = new REST({ version: "9" }).setToken(process.env.DISCORD_BOT_TOKEN);
async function findUserVoiceChannel(guildId, userId) {
try {
return null;
async function sayMessage(guildId, channelId, message) {
const url = googleTTS.getAudioUrl(message, {
resolve();
function createDiscordJSAdapter(channelId, guildId) {
return {
req.headers.get("X-Signature-Timestamp"),
// Get the user calling this slash command
const userId = await body.member?.user?.id;
jothsa avatar
myApi
@jothsa
An interactive, runnable TypeScript val by jothsa
Script
export function myApi(name) {
return "hi " + name;
daleseo avatar
myApi
@daleseo
An interactive, runnable TypeScript val by daleseo
Script
export function myApi(name) {
return "hi " + name;
nbbaier avatar
saveToTana
@nbbaier
Save To Tana This val provides a function saveToTana allows the creation of nodes in Tana via their Input API . The parameters are as follows: Token: to access the Tana Input API, you must pass an API token to the function. Obtain an API token from the Tana app and save it as a secret in Val Town. Node: the node that is created within Tana is passed as the second argument and must conform to the shape of an Input API node (see the documentation on github for details. Target node: optionally, you can specify a specific target node by passing a node ID to the function as it's third argument. Example Usage One way to use this val is with a web endpoint that you can send data to to have parsed and submitted to Tana as a specific type of node. For example, this val import { saveToTana } from "https://esm.town/v/nbbaier/saveToTana"; import { APIPlainNode } from "https://esm.town/v/nbbaier/tanaTypes"; import { Hono } from "npm:hono"; const token = Deno.env.get("tanaInputAPI"); export const honoTanaEndpoint = async (req: Request) => { const app = new Hono(); app.get("/", async c => { let { text, url } = c.req.query(); const payload: APIPlainNode = { name: text, children: [ { type: "field", attributeId: "cwi23sOzRSh8", children: [ { dataType: "url", name: url, }, ], }, ], supertags: [], }; const newNode = await saveToTana(token, payload); return c.json({ newNode }); }); return app.fetch(req); }; Combined with a Chrome extension like Rich URL , the above val allows one to send selected text on a page along with that pages URL to Tana via the val's public GET endpoint.
Script
# Save To Tana
This val provides a function `saveToTana` allows the creation of nodes in [Tana](https://tana.inc/) via their [Input API](htt
**Token:** to access the Tana Input API, you must pass an API token to the function. Obtain an API token from the Tana app a
- **Node:** the node that is created within Tana is passed as the second argument and must conform to the shape of an Input A
ionally, you can specify a specific target node by passing a node ID to the function as it's third argument.
## Example Usage
abdulamite avatar
myApi
@abdulamite
An interactive, runnable TypeScript val by abdulamite
Script
export function myApi(name, date) {
console.log("Here is something in the console");
return "hi " + name + date;
vladimyr avatar
lua_wasi_example
@vladimyr
// console.log(`exit code = ${result.exitCode}`);
Script
print(_VERSION)
print("Hello world")
function sum(a, b)
return a + b
end
acunniffe avatar
myApi
@acunniffe
An interactive, runnable TypeScript val by acunniffe
Script
export function myApi(name) {
return "hi " + name;
handler avatar
myApi
@handler
An interactive, runnable TypeScript val by handler
Script
export function myApi(name) {
return "hi " + name;
…
63
…
Next