feat(items): add server field and improve item management
refactor(ai): enhance item structure generation with schema validation feat(ai): add token usage tracking and cost calculation fix(ui): improve item card number formatting with locale support docs(items): add documentation for item value separation test(items): add tests for value field validation
This commit is contained in:
1 parent
dc169f9eba
commit
d3704602fd
22 files changed
+1317
-95
No files matched your search
+34
-10
@@ -56,7 +56,7 @@ Front-end fields (AdminItemForm):
|
||||
- skill: string opcional
|
||||
- servers: lista de servidores (separados por vírgula)
|
||||
- tags: lista de tags (texto)
|
||||
- description: texto longo
|
||||
- description: texto (máximo 100 caracteres)
|
||||
- dynamic metadata: campos variáveis definidos por categoria (servidores, atributos, etc)
|
||||
`.trim();
|
||||
|
||||
@@ -79,7 +79,9 @@ Você é um assistente que prepara payloads JSON para cadastro de itens no banco
|
||||
INSTRUÇÕES IMPORTANTES:
|
||||
- Responda SOMENTE com JSON válido. Nenhum texto fora do JSON.
|
||||
- Se não tiver certeza, retorne null nos campos desconhecidos.
|
||||
- Utilize ao máximo a estrutura de tabelas e campos informada abaixo.
|
||||
- Utilize ao máximo a estrutura de tabelas e campos informada abaixo.
|
||||
- Você receberá somente a estrutura das tabelas SQLite (nomes, colunas e tipos). Use esse esquema para escolher uma tabela existente adequada ou sugerir uma nova. Nunca inclua dados reais.
|
||||
- Campo "description": limite máximo de 100 caracteres. Se a descrição original exceder 100 caracteres, retorne apenas os primeiros 100 caracteres sem acrescentar sufixos (sem "..."), e nunca gere texto além desse limite.
|
||||
|
||||
Contexto fornecido pelo usuário:
|
||||
- Nome: ${context.name}
|
||||
@@ -103,19 +105,41 @@ Formato obrigatório da resposta:
|
||||
{
|
||||
"table": "nome_da_tabela",
|
||||
"columns": {
|
||||
"name": "...",
|
||||
"description": "...",
|
||||
"rarity": "...",
|
||||
"metadata": {...},
|
||||
"outros_campos": ...
|
||||
"name": string | null,
|
||||
"description": string | null,
|
||||
"category": string | null,
|
||||
"rarity": string | null,
|
||||
"image_url": string | null,
|
||||
"image_local_path": string | null,
|
||||
"level": number | null,
|
||||
"weight": number | null,
|
||||
"slots": number | null,
|
||||
"skill": string | null,
|
||||
"servers": string[] | null,
|
||||
"tags": string[] | null,
|
||||
"metadata": object | null
|
||||
},
|
||||
"schemaSuggestion": {
|
||||
"table": "nome_da_tabela_existente_ou_nova",
|
||||
"columns": [
|
||||
{ "name": "coluna_1", "type": "TEXT|INTEGER|REAL|BOOLEAN" },
|
||||
{ "name": "coluna_2", "type": "TEXT|INTEGER|REAL|BOOLEAN" }
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Consistência:
|
||||
- Escolha a tabela coerente com o escopo. Para global, use "items" ou equivalente.
|
||||
- Escolha a tabela coerente com o escopo. Para global, use "items_all".
|
||||
- Para escopo de servidor, use "items_<slug_do_servidor>", onde <slug> é o nome do servidor em minúsculas, com espaços transformados em "_" e removendo caracteres não alfanuméricos.
|
||||
- Inclua sempre os campos básicos: name, description.
|
||||
- Aplique outros campos conforme a descrição (ex.: atributos, requisitos, bônus).
|
||||
- Se houver informações que encaixem em metadados dinâmicos, use um objeto "metadata".
|
||||
- Nunca produza "description" com mais de 100 caracteres.
|
||||
|
||||
Regras adicionais:
|
||||
- Servidores ("servers"): utilize SOMENTE nomes presentes na lista fornecida no contexto. Prefira o formato array de strings (ex.: ["Belobra", "Antica"]). Se não aplicável, use null.
|
||||
- Metadata: inclua apenas atributos descritivos (ex.: "attributes", "requirements", "protections", "flags"). É PROIBIDO incluir qualquer campo de valor/preço/mercado. Não utilize chaves: "price", "value", "buy", "sell", "currency", "npc_price", "marketPrice", "minPrice", "maxPrice", "avgPrice".
|
||||
- Tipos: números devem ser números (sem aspas). Se o valor for desconhecido, retorne null. Não invente dados.
|
||||
|
||||
${extraInstructions ?? ""}
|
||||
`.trim();
|
||||
@@ -127,13 +151,13 @@ export interface InlineImageData {
|
||||
}
|
||||
|
||||
export async function buildGeminiParts(prompt: string, images: InlineImageData[] = []) {
|
||||
const parts: Array<{ text?: string; inlineData?: { mimeType: string; data: string } }> = [
|
||||
const parts: Array<{ text?: string; inline_data?: { mimeType: string; data: string } }> = [
|
||||
{ text: prompt },
|
||||
];
|
||||
|
||||
images.slice(0, 2).forEach((image) => {
|
||||
parts.push({
|
||||
inlineData: {
|
||||
inline_data: {
|
||||
mimeType: image.mimeType,
|
||||
data: image.base64Data,
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user