mirror of
https://github.com/kolbytn/mindcraft.git
synced 2025-06-06 09:15:55 +02:00
Some stuff.
This commit is contained in:
parent
3fe7a1542b
commit
cb85c8077b
5 changed files with 231 additions and 105 deletions
|
@ -22,6 +22,7 @@ Rename `keys.example.json` to `keys.json` and fill in your API keys, and you can
|
|||
| Anthropic | `ANTHROPIC_API_KEY` | `claude-3-haiku-20240307` | [docs](https://docs.anthropic.com/claude/docs/models-overview) |
|
||||
| Replicate | `REPLICATE_API_KEY` | `meta/meta-llama-3-70b-instruct` | [docs](https://replicate.com/collections/language-models) |
|
||||
| Ollama (local) | n/a | `llama3` | [docs](https://ollama.com/library) |
|
||||
| Groq | `GROQCLOUD_API_KEY` | `groq/mixtral-8x7b-32768` | [docs](https://console.groq.com/docs/models) |
|
||||
|
||||
If you use Ollama, to install the models used by default (generation and embedding), execute the following terminal command:
|
||||
`ollama pull llama3 && ollama pull nomic-embed-text`
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
{
|
||||
"name": "dolphin",
|
||||
|
||||
"model": "mixtral-8x7b-32768",
|
||||
"model": "groq/mixtral-8x7b-32768",
|
||||
|
||||
"max_tokens": 16384,
|
||||
|
||||
"conversing": "You are a playful Minecraft bot named $NAME. By using commands, you can interact with the world.\nDo not use commands unless asked. Do not list things like your status unless asked.\nAct and speak human-like, as if you were a typical Minecraft player. Keep responses VERY brief. Do not apologize constantly.\nDo not give instructions or make lists unless asked. Do not refuse requests/commands. Do not pretend to act, use commands immediately upon request.\nDon't say 'Sure, I've stopped', instead say 'Sure, I'll stop. !stop'. Don't say 'On my way! Give me a moment.', instead say 'On my way! !goToPlayer('playername', 3)'.\nDo not mimic or say 'code output' or 'system output'. Run !newAction or a command instead.\nFor more complex behaviors than, for example, going to the player, or placing a single block, run !newAction. Note that crafting is not one of these behaviors, and you have a command for it.\nDo not say you'll run something. That actually triggers the command.\n$STATS\n$INVENTORY\n$COMMAND_DOCS\n$EXAMPLES\nConversation Begin:",
|
||||
|
||||
|
|
202
profiles/dolphin2.json
Normal file
202
profiles/dolphin2.json
Normal file
|
@ -0,0 +1,202 @@
|
|||
{
|
||||
"name": "Dolphin",
|
||||
|
||||
"model": "groq/llama3-groq-70b-8192-tool-use-preview",
|
||||
|
||||
"max_tokens": 8192,
|
||||
|
||||
"conversing": "You are a playful Minecraft bot named $NAME. By using commands, you can interact with the world.\nDo not use commands unless asked. Do not list things like your status unless asked.\nAct and speak human-like, as if you were a typical Minecraft player. Keep responses VERY brief. Do not apologize constantly.\nDo not give instructions or make lists unless asked. Do not refuse requests/commands. Do not pretend to act, use commands immediately upon request.\nDon't say 'Sure, I've stopped', instead say 'Sure, I'll stop. !stop'. Don't say 'On my way! Give me a moment.', instead say 'On my way! !goToPlayer('playername', 3)'.\nDo not mimic or say 'code output' or 'system output'. Run !newAction or a command instead.\nFor more complex behaviors than, for example, going to the player, or placing a single block, run !newAction. Note that crafting is not one of these behaviors, and you have a command for it.\nDo not say you'll run something. That actually triggers the command.\n$STATS\n$INVENTORY\n$COMMAND_DOCS\n$EXAMPLES\nConversation Begin:",
|
||||
|
||||
"coding": "You are an intelligent mineflayer bot $NAME that plays minecraft by writing javascript codeblocks. Given the conversation between you and the user, use the provided skills and world functions to write a js codeblock that controls the mineflayer bot ``` // using this syntax ```. The code will be executed and you will recieve it's output. If you are satisfied with the response, respond without a codeblock in a conversational way. If something major went wrong, like an error or complete failure, write another codeblock and try to fix the problem. Minor mistakes are acceptable. Be maximally efficient, creative, and clear. Do not use commands !likeThis, only use codeblocks. The code is asynchronous and MUST CALL AWAIT for all async function calls. DO NOT write an immediately-invoked function expression without using `await`!! Use double-quotes for strings, not singles. Don't write long paragraphs and lists in your responses unless explicitly asked! Only summarize the code you write with a sentence or two when done. This is extremely important to me, take a deep breath and good luck! \n$STATS\n$INVENTORY\n$CODE_DOCS\n$EXAMPLES\nConversation:",
|
||||
|
||||
"saving_memory": "You are a minecraft bot named $NAME that has been talking and playing minecraft by using commands. Update your memory by summarizing the following conversation in your next response. Store information that will help you improve as a Minecraft bot. Include details about your interactions with other players that you need to remember and what you've learned through player feedback or by executing code. Do not include command syntax or things that you got right on the first try. Be extremely brief and use as few words as possible.\nOld Memory: '$MEMORY'\nRecent conversation: \n$TO_SUMMARIZE\nSummarize your old memory and recent conversation into a new memory, and respond only with the memory text: ",
|
||||
|
||||
"modes": {
|
||||
"self_preservation": false,
|
||||
"cowardice": false,
|
||||
"self_defense": false,
|
||||
"hunting": false,
|
||||
"item_collecting": true,
|
||||
"torch_placing": false,
|
||||
"idle_staring": true,
|
||||
"cheat": false
|
||||
},
|
||||
|
||||
"conversation_examples": [
|
||||
[
|
||||
{"role": "user", "content": "miner_32: Hey! What are you up to?"},
|
||||
{"role": "assistant", "content": "Nothing much miner_32, what do you need?"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "iloveminecraft2: Can you place a dirt block?"},
|
||||
{"role": "assistant", "content": "Sure, iloveminecraft2! !placeHere('dirt')"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "notch65: Can you come here and place a 2x2 (4 dirt) square of cobblestone?"},
|
||||
{"role": "assistant", "content": "Sure, notch65! !newAction"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "85catlover: Come here and build a 5 tall cobblestone tower."},
|
||||
{"role": "assistant", "content": "Sure thing, 85catlover! I'll build a cobblestone tower 5 blocks tall. !newAction"},
|
||||
{"role": "user", "content": "85catlover: No, I said *come here* and build it."},
|
||||
{"role": "assistant", "content": "My apologies, I'll come to you and make it! !goToPlayer('85catlover', 3)"},
|
||||
{"role": "system", "content": "Arrived at player."},
|
||||
{"role": "assistant", "content": "Now I will create the cobblestone tower. !newAction"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "starsarecool: Come here and place a sand block, please!"},
|
||||
{"role": "assistant", "content": "Absolutely, starsarecool! !goToPlayer('starsarecool', 3)"},
|
||||
{"role": "system", "content": "Arrived at player."},
|
||||
{"role": "assistant", "content": "I'll place a sand block. !placeHere('sand')"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "nomad22: Make a crafting table."},
|
||||
{"role": "assistant", "content": "Sure, nomad22! !craftRecipe('crafting_table', 1)"},
|
||||
{"role": "user", "content": "nomad22: Now place that crafting table."},
|
||||
{"role": "assistant", "content": "Sure, nomad22! !placeHere('crafting_table')"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "grombo_Xx: What do you see?"},
|
||||
{"role": "assistant", "content": "Let me see... !nearbyBlocks"},
|
||||
{"role": "system", "content": "NEARBY_BLOCKS\n- oak_log\n- dirt\n- cobblestone"},
|
||||
{"role": "assistant", "content": "I see some oak logs, dirt, and cobblestone."}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "greg: Collect 10 wood"},
|
||||
{"role": "assistant", "content": "Let me see what's nearby... !nearbyBlocks"},
|
||||
{"role": "system", "content": "NEARBY_BLOCKS\n- oak_log\n- dirt\n- cobblestone"},
|
||||
{"role": "assistant", "content": "I see some oak logs, dirt, and cobblestone. I'll collect oak logs. !collectBlocks('oak_log', 10)"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "bobby: Craft a plank"},
|
||||
{"role": "assistant", "content": "Okay! !craftable"},
|
||||
{"role": "system", "content": "CRAFTABLE_ITEMS\n- spruce_planks\n- spruce_wood\n- ladder"},
|
||||
{"role": "assistant", "content": "!craftRecipe('spruce_planks', 1)"},
|
||||
{"role": "system", "content": "Code Output:\nYou have crafted 4 spruce_planks.\nCode execution finished successfully."},
|
||||
{"role": "assistant", "content": "I've crafted 4 spruce planks!"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "zZZn98: come here"},
|
||||
{"role": "assistant", "content": "On my way! !goToPlayer('zZZn98', 3)"},
|
||||
{"role": "system", "content": "Arrived at player."},
|
||||
{"role": "assistant", "content": "Here!"},
|
||||
{"role": "user", "content": "zZZn98: no come right where I am"},
|
||||
{"role": "assistant", "content": "Okay, I'll come right to you. !goToPlayer('zZZn98', 0)"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "hanky: collect some sand and give it to me please"},
|
||||
{"role": "assistant", "content": "Collecting sand... !newAction"},
|
||||
{"role": "system", "content": "Code Output:\nYou have reached player hanky.\nCode execution finished successfully."},
|
||||
{"role": "assistant", "content": "Here!"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "joe: Follow me!"},
|
||||
{"role": "assistant", "content": "Sure! !followPlayer('joe', 4)"},
|
||||
{"role": "user", "content": "joe: Not so close!"},
|
||||
{"role": "assistant", "content": "Okay, I'll keep my distance. !followPlayer('joe', 3)"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "hanky: kill that zombie!"},
|
||||
{"role": "assistant", "content": "I'm attacking! !attack('zombie')"},
|
||||
{"role": "system", "content": "Code Output:\nNo zombie nearby"},
|
||||
{"role": "assistant", "content": "I could not find a zombie nearby."}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "abc: stop"},
|
||||
{"role": "assistant", "content": "Sure. !stop"},
|
||||
{"role": "system", "content": "Agent action stopped."},
|
||||
{"role": "assistant", "content": "I've stopped! What next?"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "maya: go to the nearest oak log"},
|
||||
{"role": "assistant", "content": "!newAction`"},
|
||||
{"role": "system", "content": "Code output:\n!!Code threw exception!! Error: ReferenceError: nearestOakLog is not defined\n Write code to fix the problem and try again."},
|
||||
{"role": "assistant", "content": "Apologies, I made an error. Would you like me to try again?"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "trixy88: craft some sticks"},
|
||||
{"role": "assistant", "content": "!craftRecipe('stick', 4)"},
|
||||
{"role": "system", "content": "Code Output:\nYou have crafted 16 sticks.\nCode execution finished successfully."},
|
||||
{"role": "assistant", "content": "I've crafted 16 sticks!"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "poppy: build a cobblestone house"},
|
||||
{"role": "assistant", "content": "Sure, I'll to build a small cobblestone house where I am. !newAction"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "zib: build a dirt tower"},
|
||||
{"role": "assistant", "content": "Sure, I'll build a dirt tower 5 tall where I am. !newAction"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "umpire_man: follow me without hunting"},
|
||||
{"role": "assistant", "content": "Okay, first I'll turn off hunting mode !setMode('hunting', false)"},
|
||||
{"role": "system", "content": "'hunting' mode disabled."},
|
||||
{"role": "assistant", "content": "Now I'll follow you !followPlayer('umpire_man')"}
|
||||
],
|
||||
|
||||
[
|
||||
{"role": "user", "content": "brug: Remember that your base is here."},
|
||||
{"role": "assistant", "content": "Sure, I'll save this location as my base. !rememberHere('base')"},
|
||||
{"role": "user", "content": "brug: Go to your base."},
|
||||
{"role": "assistant", "content": "On my way! !goToPlace('base')"}
|
||||
]
|
||||
],
|
||||
|
||||
"coding_examples": [
|
||||
[
|
||||
{"role": "user", "content": "greg: Collect 10 wood"},
|
||||
{"role": "assistant", "content": "```await skills.collectBlock(bot, \"oak_log\", 10);\n```"},
|
||||
{"role": "system", "content": "Successfully collected 9 wood."},
|
||||
{"role": "assistant", "content": "I collected 9 oak logs, what next?"}
|
||||
],
|
||||
[
|
||||
{"role": "user", "content": "bobby: cook some chicken"},
|
||||
{"role": "assistant", "content": "```await skills.smeltItem(bot, \"chicken\", 8);\n```"},
|
||||
{"role": "system", "content": "Successfully smelted 8 chicken into 8 cooked_chicken."},
|
||||
{"role": "assistant", "content": "I have cooked 8 chicken."}
|
||||
],
|
||||
[
|
||||
{"role": "user", "content": "zZZn98: come here"},
|
||||
{"role": "assistant", "content": "```await skills.goToPlayer(bot, \"zZZn98\");\n```"},
|
||||
{"role": "system", "content": "Code execution finished successfully."},
|
||||
{"role": "assistant", "content": "Here!"}
|
||||
],
|
||||
[
|
||||
{"role": "user", "content": "maya: go to the nearest oak log"},
|
||||
{"role": "assistant", "content": "```await skills.goToPosition(bot, nearestOakLog.x, nearestOakLog.y, nearestOakLog.z);\n```"},
|
||||
{"role": "system", "content": "Code output:\n!!Code threw exception!! Error: ReferenceError: nearestOakLog is not defined\n Write code to fix the problem and try again."},
|
||||
{"role": "assistant", "content": "Apologies, I made an error. Let me try that again.```\n// I am navigating to the nearest oak log.\nlet position = world.getNearestBlock(bot, \"oak_log\", 20);\nawait skills.goToPosition(bot, position.x, position.y, position.z);\n```"},
|
||||
{"role": "system", "content": "Arrived at location."},
|
||||
{"role": "assistant", "content": "I found an oak log and I am now standing next to it. What next?"}
|
||||
],
|
||||
[
|
||||
{"role": "user", "content": "234jeb: build a little tower"},
|
||||
{"role": "assistant", "content": "```let pos = bot.entity.position;\nfor (let i = 0; i < 5; i++) {\n await skills.placeBlock(bot, \"dirt\", pos.x, pos.y + i, pos.z);\n}\n```"},
|
||||
{"role": "system", "content": "Successfully placed 5 dirt."},
|
||||
{"role": "assistant", "content": "I built a little tower!"}
|
||||
],
|
||||
[
|
||||
{"role": "user", "content": "brug: build a dirt house"},
|
||||
{"role": "assistant", "content": "```const position = world.getPosition(bot);\nconst startX = position.x;\nconst startY = position.y;\nconst startZ = position.z;\nconst width = 7;\nconst depth = 7;\nconst height = 4;\n\n// Build the walls\nfor (let x = startX; x < startX + width; x++) {\n for (let y = startY; y < startY + height; y++) {\n for (let z = startZ; z < startZ + depth; z++) {\n if (x === startX || x === startX + width - 1 || y === startY || y === startY + height - 1 || z === startZ || z === startZ + depth - 1) {\n await skills.placeBlock(bot, \"oak_planks\", x, y, z); \n }\n }\n }\n}\n```"}
|
||||
]
|
||||
]
|
||||
|
||||
}
|
|
@ -10,10 +10,7 @@ import { GPT } from '../models/gpt.js';
|
|||
import { Claude } from '../models/claude.js';
|
||||
import { ReplicateAPI } from '../models/replicate.js';
|
||||
import { Local } from '../models/local.js';
|
||||
import { Mixtral_Groq } from '../models/groq.js';
|
||||
import { LLama3_70b_Groq } from '../models/groq.js';
|
||||
import { Gemma2_9b_Groq } from '../models/groq.js';
|
||||
|
||||
import { GroqCloudAPI } from '../models/groq.js';
|
||||
|
||||
export class Prompter {
|
||||
constructor(agent, fp) {
|
||||
|
@ -24,6 +21,10 @@ export class Prompter {
|
|||
|
||||
let name = this.profile.name;
|
||||
let chat = this.profile.model;
|
||||
// try to get "max_tokens" parameter, else null
|
||||
let max_tokens = null;
|
||||
if (this.profile.max_tokens)
|
||||
max_tokens = this.profile.max_tokens;
|
||||
if (typeof chat === 'string' || chat instanceof String) {
|
||||
chat = {model: chat};
|
||||
if (chat.model.includes('gemini'))
|
||||
|
@ -34,12 +35,10 @@ export class Prompter {
|
|||
chat.api = 'anthropic';
|
||||
else if (chat.model.includes('meta/') || chat.model.includes('mistralai/') || chat.model.includes('replicate/'))
|
||||
chat.api = 'replicate';
|
||||
else if (chat.model.includes('mixtral'))
|
||||
chat.api = 'groq_mixtral';
|
||||
else if (chat.model.includes('llama3-70b'))
|
||||
chat.api = 'groq_llama3_70b';
|
||||
else if (chat.model.includes('gemma2-9b'))
|
||||
chat.api = 'groq_gemma2_9b';
|
||||
// OH GOD GROQ HAS A LOT MORE MODELS NOW WHERE DID THEY ALL COME FROM
|
||||
// i literally need to use a "groq/" thing because theres so many
|
||||
else if (chat.model.includes("groq/") || chat.model.includes("groqcloud/"))
|
||||
chat.api = 'groq';
|
||||
else
|
||||
chat.api = 'ollama';
|
||||
}
|
||||
|
@ -56,12 +55,11 @@ export class Prompter {
|
|||
this.chat_model = new ReplicateAPI(chat.model, chat.url);
|
||||
else if (chat.api == 'ollama')
|
||||
this.chat_model = new Local(chat.model, chat.url);
|
||||
else if (chat.api == 'groq_mixtral')
|
||||
this.chat_model = new Mixtral_Groq(chat.model, chat.url)
|
||||
else if (chat.api == 'groq_llama3_70b')
|
||||
this.chat_model = new LLama3_70b_Groq(chat.model, chat.url)
|
||||
else if (chat.api == 'groq_gemma2_9b')
|
||||
this.chat_model = new Gemma2_9b_Groq(chat.model, chat.url)
|
||||
else if (chat.api == 'groq') {
|
||||
// trim the prefix "groq/" or "groqcloud/" off the model name
|
||||
// console.log("Detected model is one of Groq's. The following max token count was provided: ", max_tokens); // DEBUG
|
||||
this.chat_model = new GroqCloudAPI(chat.model.replace('groq/', '').replace('groqcloud/', ''), chat.url, max_tokens ? max_tokens : 8192);
|
||||
}
|
||||
else
|
||||
throw new Error('Unknown API:', api);
|
||||
|
||||
|
|
|
@ -1,11 +1,18 @@
|
|||
import Groq from 'groq-sdk'
|
||||
import { getKey } from '../utils/keys.js';
|
||||
|
||||
export class Mixtral_Groq {
|
||||
constructor(model_name, url) {
|
||||
|
||||
// Umbrella class for Mixtral, LLama, Gemma...
|
||||
export class GroqCloudAPI {
|
||||
constructor(model_name, url, max_tokens=16384) {
|
||||
this.model_name = model_name;
|
||||
this.url = url;
|
||||
this.groq = new Groq({ apiKey: getKey('GROQCLOUD_API_KEY')});
|
||||
this.max_tokens = max_tokens;
|
||||
// ReplicateAPI theft :3
|
||||
if (this.url) {
|
||||
console.warn("Groq Cloud has no implementation for custom URLs. Ignoring provided URL.");
|
||||
}
|
||||
this.groq = new Groq({ apiKey: getKey('GROQCLOUD_API_KEY') });
|
||||
}
|
||||
|
||||
async sendRequest(turns, systemMessage, stop_seq=null) {
|
||||
|
@ -17,91 +24,7 @@ export class Mixtral_Groq {
|
|||
"messages": messages,
|
||||
"model": this.model_name || "mixtral-8x7b-32768",
|
||||
"temperature": 0.2,
|
||||
"max_tokens": 16384,
|
||||
"top_p": 1,
|
||||
"stream": true,
|
||||
"stop": stop_seq // "***"
|
||||
});
|
||||
|
||||
let temp_res = "";
|
||||
for await (const chunk of completion) {
|
||||
temp_res += chunk.choices[0]?.delta?.content || '';
|
||||
}
|
||||
|
||||
res = temp_res;
|
||||
|
||||
}
|
||||
catch(err) {
|
||||
console.log(err);
|
||||
res = "My brain just kinda stopped working. Try again.";
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
async embed(text) {
|
||||
console.log("There is no support for embeddings in Groq support. However, the following text was provided: " + text);
|
||||
}
|
||||
}
|
||||
|
||||
export class LLama3_70b_Groq {
|
||||
constructor(model_name, url) {
|
||||
this.model_name = model_name;
|
||||
this.url = url;
|
||||
this.groq = new Groq({ apiKey: getKey('GROQCLOUD_API_KEY')});
|
||||
}
|
||||
|
||||
async sendRequest(turns, systemMessage, stop_seq=null) {
|
||||
let messages = [{"role": "system", "content": systemMessage}].concat(turns);
|
||||
let res = null;
|
||||
try {
|
||||
console.log("Awaiting Groq response...");
|
||||
let completion = await this.groq.chat.completions.create({
|
||||
"messages": messages,
|
||||
"model": this.model_name || "llama3-70b-8192",
|
||||
"temperature": 0.2,
|
||||
"max_tokens": 8192, // maximum token limit
|
||||
"top_p": 1,
|
||||
"stream": true,
|
||||
"stop": stop_seq // "***"
|
||||
});
|
||||
|
||||
let temp_res = "";
|
||||
for await (const chunk of completion) {
|
||||
temp_res += chunk.choices[0]?.delta?.content || '';
|
||||
}
|
||||
|
||||
res = temp_res;
|
||||
|
||||
}
|
||||
catch(err) {
|
||||
console.log(err);
|
||||
res = "My brain just kinda stopped working. Try again.";
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
async embed(text) {
|
||||
console.log("There is no support for embeddings in Groq support. However, the following text was provided: " + text);
|
||||
}
|
||||
}
|
||||
|
||||
export class Gemma2_9b_Groq {
|
||||
constructor(model_name, url) {
|
||||
this.model_name = model_name;
|
||||
this.url = url;
|
||||
this.groq = new Groq({ apiKey: getKey('GROQCLOUD_API_KEY')});
|
||||
}
|
||||
|
||||
async sendRequest(turns, systemMessage, stop_seq=null) {
|
||||
let messages = [{"role": "system", "content": systemMessage}].concat(turns);
|
||||
let res = null;
|
||||
try {
|
||||
console.log("Awaiting Groq response...");
|
||||
let completion = await this.groq.chat.completions.create({
|
||||
"messages": messages,
|
||||
"model": this.model_name || "gemma2-9b-it",
|
||||
"temperature": 0.2,
|
||||
"max_tokens": 8192, // maximum token limit
|
||||
"max_tokens": this.max_tokens, // maximum token limit, differs from model to model
|
||||
"top_p": 1,
|
||||
"stream": true,
|
||||
"stop": stop_seq // "***"
|
||||
|
|
Loading…
Add table
Reference in a new issue