@bitmagic/asset-core 0.2.14-dev.3 → 0.2.14-dev.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/material-classifier.d.ts +118 -0
- package/dist/material-classifier.d.ts.map +1 -0
- package/dist/material-classifier.js +178 -0
- package/dist/material-classifier.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -32,6 +32,8 @@ export { JUDGE_DIMENSIONS, deriveOverall, judgeModelResponseSchema, judgeScoreca
|
|
|
32
32
|
export type { JudgeDimension, JudgeModelResponse, JudgeScorecard } from './judge-scorecard.js';
|
|
33
33
|
export { JUDGE_GENRE_HINTS, JUDGE_MOBILE_HINT, JUDGE_RUBRIC, MAX_JUDGE_ART_DIRECTION_CHARS, MAX_JUDGE_DESIGN_CHARS, MAX_JUDGE_SCENE_FACTS_CHARS, MAX_JUDGE_VERIFY_CHARS, buildJudgeRubric, buildJudgeStyleHint, } from './judge-prompt.js';
|
|
34
34
|
export type { JudgePriorVerdict, JudgeRubricInput } from './judge-prompt.js';
|
|
35
|
+
export { MATERIAL_CLASSIFIER_NO_PROMPT_NOTE, MATERIAL_CLASSIFIER_RULES, MATERIAL_VERDICT_MIN_CONFIDENCE, MAX_MATERIAL_PROMPT_CHARS, MAX_MATERIAL_TABLE_CHARS, VOXEL_MATERIAL_CLASS_LIST, VOXEL_MATERIAL_CLASS_NAMES, VOXEL_MATERIAL_CLASS_NOTES, buildMaterialClassifierPrompt, materialVerdictsResponseSchema, parseMaterialVerdicts, } from './material-classifier.js';
|
|
36
|
+
export type { MaterialClassifierInput, MaterialVerdict, VoxelMaterialClassName, } from './material-classifier.js';
|
|
35
37
|
export { TERMINAL_FAILURE_CODES, TERMINAL_FAILURE_VERSION, buildTerminalFailure, isTerminalFailureCode, legacyErrorTypeFor, parseTerminalFailure, } from './terminal-failure.js';
|
|
36
38
|
export type { BuildTerminalFailureInput, LegacyErrorType, TerminalFailure, TerminalFailureCode, TerminalFailureDetail, } from './terminal-failure.js';
|
|
37
39
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ export { PIXAR_VOXEL_STYLE, MAX_COVER_DESIGN_CHARS, buildCoverArtPrompt } from '
|
|
|
17
17
|
export { MAX_REFERENCE_DESIGN_CHARS, buildReferenceImagePrompt } from './reference-prompt.js';
|
|
18
18
|
export { JUDGE_DIMENSIONS, deriveOverall, judgeModelResponseSchema, judgeScorecardSchema, } from './judge-scorecard.js';
|
|
19
19
|
export { JUDGE_GENRE_HINTS, JUDGE_MOBILE_HINT, JUDGE_RUBRIC, MAX_JUDGE_ART_DIRECTION_CHARS, MAX_JUDGE_DESIGN_CHARS, MAX_JUDGE_SCENE_FACTS_CHARS, MAX_JUDGE_VERIFY_CHARS, buildJudgeRubric, buildJudgeStyleHint, } from './judge-prompt.js';
|
|
20
|
+
export { MATERIAL_CLASSIFIER_NO_PROMPT_NOTE, MATERIAL_CLASSIFIER_RULES, MATERIAL_VERDICT_MIN_CONFIDENCE, MAX_MATERIAL_PROMPT_CHARS, MAX_MATERIAL_TABLE_CHARS, VOXEL_MATERIAL_CLASS_LIST, VOXEL_MATERIAL_CLASS_NAMES, VOXEL_MATERIAL_CLASS_NOTES, buildMaterialClassifierPrompt, materialVerdictsResponseSchema, parseMaterialVerdicts, } from './material-classifier.js';
|
|
20
21
|
// The agent↔client terminal-failure contract. Also published as the
|
|
21
22
|
// `@bitmagic/asset-core/terminal-failure` subpath: this barrel eagerly pulls in
|
|
22
23
|
// the generators (and therefore zod, the forger client, and node http helpers),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAExF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEtF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5F,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEnF,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAErF,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAO3C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEvG,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,gCAAgC,EAChC,gCAAgC,EAChC,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACnG,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,6BAA6B,EAC7B,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAExF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEtF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5F,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEnF,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAErF,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAO3C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEvG,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,gCAAgC,EAChC,gCAAgC,EAChC,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACnG,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,6BAA6B,EAC7B,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,kCAAkC,EAClC,yBAAyB,EACzB,+BAA+B,EAC/B,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAOlC,oEAAoE;AACpE,gFAAgF;AAChF,gFAAgF;AAChF,oEAAoE;AACpE,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The voxel MATERIAL CLASSIFIER contract: what a model is asked, and what it is
|
|
3
|
+
* allowed to answer.
|
|
4
|
+
*
|
|
5
|
+
* A generated voxel asset is coordinates and colour, so a sword's steel blade
|
|
6
|
+
* shades exactly like its leather grip. The engine describes an asset's colour
|
|
7
|
+
* groups as a small text table (`VxlMaterialSignature`), and the asset's own
|
|
8
|
+
* generation prompt names the materials outright — matching one to the other is
|
|
9
|
+
* a short classification over text. This module is that text: the prompt one
|
|
10
|
+
* side builds and the verdict list the other side validates.
|
|
11
|
+
*
|
|
12
|
+
* Like judge-prompt.ts it composes strings and validates shapes only — no model,
|
|
13
|
+
* no network. It lives here so every lane that classifies (the Creator's agent,
|
|
14
|
+
* api-server on behalf of the CLI, and the CLI's own printed guidance for a
|
|
15
|
+
* coding agent) reads the SAME rules. The rules are what make the answer safe:
|
|
16
|
+
* a wrongly shiny surface is what a player notices, so `matte` is the default,
|
|
17
|
+
* the prompt is the evidence, and abstaining beats guessing.
|
|
18
|
+
*
|
|
19
|
+
* The engine applies these verdicts through `planMaterialSlots`, which drops
|
|
20
|
+
* anything below its confidence floor, refuses a precious material over a large
|
|
21
|
+
* surface the prompt never mentions, and folds an over-budget answer along its
|
|
22
|
+
* collapse chain. Those guards are the last line; this prompt is the first.
|
|
23
|
+
*/
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
/**
|
|
26
|
+
* The engine's closed vocabulary (`VoxelMaterialClassName` in
|
|
27
|
+
* `game/src/engine/VoxelMaterialClass.ts`), mirrored because this package cannot
|
|
28
|
+
* import the engine. A test pins the two lists to each other.
|
|
29
|
+
*/
|
|
30
|
+
export declare const VOXEL_MATERIAL_CLASS_NAMES: readonly ["matte", "cloth", "fur", "leather", "wood", "stone", "plastic", "paint", "metal", "gold", "chrome", "gem", "glass"];
|
|
31
|
+
export type VoxelMaterialClassName = (typeof VOXEL_MATERIAL_CLASS_NAMES)[number];
|
|
32
|
+
/** The vocabulary, spelled out for whoever reads a signature table. */
|
|
33
|
+
export declare const VOXEL_MATERIAL_CLASS_LIST: string;
|
|
34
|
+
/** One class needs a sentence: it is easy to reach for and usually wrong. */
|
|
35
|
+
export declare const VOXEL_MATERIAL_CLASS_NOTES = "`fur` is only for a pelt or plush \u2014 a teddy bear, an animal, a fur trim. Anything merely soft is `cloth`.";
|
|
36
|
+
/**
|
|
37
|
+
* Below this a verdict is ignored by the engine (`MIN_VERDICT_CONFIDENCE` in
|
|
38
|
+
* `VxlMaterialSlotTransforms.ts`). Quoted in the rules so the reader knows what
|
|
39
|
+
* "low confidence" buys them.
|
|
40
|
+
*/
|
|
41
|
+
export declare const MATERIAL_VERDICT_MIN_CONFIDENCE = 0.45;
|
|
42
|
+
/**
|
|
43
|
+
* The rules that actually change the answer. One list, printed by the CLI under
|
|
44
|
+
* a signature table for a coding agent and embedded in the model prompt below,
|
|
45
|
+
* so the two classifiers cannot be told different things.
|
|
46
|
+
*/
|
|
47
|
+
export declare const MATERIAL_CLASSIFIER_RULES: readonly string[];
|
|
48
|
+
/** Printed when the asset records nothing about what it is meant to be. */
|
|
49
|
+
export declare const MATERIAL_CLASSIFIER_NO_PROMPT_NOTE: string;
|
|
50
|
+
/** Caps on what reaches the model; a signature table is ~400 tokens at 16 groups. */
|
|
51
|
+
export declare const MAX_MATERIAL_TABLE_CHARS = 8000;
|
|
52
|
+
export declare const MAX_MATERIAL_PROMPT_CHARS = 2000;
|
|
53
|
+
export interface MaterialClassifierInput {
|
|
54
|
+
/** The asset's display name — context only. */
|
|
55
|
+
assetName: string;
|
|
56
|
+
/** The engine's rendered signature table, verbatim. */
|
|
57
|
+
table: string;
|
|
58
|
+
/** The prompt or description the asset was generated from, when it records one. */
|
|
59
|
+
promptText?: string;
|
|
60
|
+
}
|
|
61
|
+
/** One colour group's verdict, as the engine's `MaterialVerdict` expects it. */
|
|
62
|
+
export interface MaterialVerdict {
|
|
63
|
+
/** A signature group id (`g0`…). */
|
|
64
|
+
id: string;
|
|
65
|
+
/** A class name from the vocabulary, or `unknown` to abstain on that group. */
|
|
66
|
+
class: string;
|
|
67
|
+
/** 0..1. */
|
|
68
|
+
confidence: number;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The prompt a light model answers with a verdict list.
|
|
72
|
+
*
|
|
73
|
+
* The table and the rules are the same text the CLI prints for a coding agent;
|
|
74
|
+
* only the framing and the output directive are added here. Asking for ONLY the
|
|
75
|
+
* JSON, with the empty answer spelled out, is what makes "nothing here shines"
|
|
76
|
+
* a cheap, valid reply rather than something the model has to invent around.
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildMaterialClassifierPrompt(input: MaterialClassifierInput): string;
|
|
79
|
+
/** What the model is asked to return. Lenient on class names — see `parseMaterialVerdicts`. */
|
|
80
|
+
export declare const materialVerdictsResponseSchema: z.ZodObject<{
|
|
81
|
+
verdicts: z.ZodArray<z.ZodObject<{
|
|
82
|
+
id: z.ZodString;
|
|
83
|
+
class: z.ZodString;
|
|
84
|
+
confidence: z.ZodNumber;
|
|
85
|
+
}, "strip", z.ZodTypeAny, {
|
|
86
|
+
id: string;
|
|
87
|
+
class: string;
|
|
88
|
+
confidence: number;
|
|
89
|
+
}, {
|
|
90
|
+
id: string;
|
|
91
|
+
class: string;
|
|
92
|
+
confidence: number;
|
|
93
|
+
}>, "many">;
|
|
94
|
+
}, "strip", z.ZodTypeAny, {
|
|
95
|
+
verdicts: {
|
|
96
|
+
id: string;
|
|
97
|
+
class: string;
|
|
98
|
+
confidence: number;
|
|
99
|
+
}[];
|
|
100
|
+
}, {
|
|
101
|
+
verdicts: {
|
|
102
|
+
id: string;
|
|
103
|
+
class: string;
|
|
104
|
+
confidence: number;
|
|
105
|
+
}[];
|
|
106
|
+
}>;
|
|
107
|
+
/**
|
|
108
|
+
* The model's text → verdicts, or null when it is not an answer at all.
|
|
109
|
+
*
|
|
110
|
+
* Never throws. A verdict naming a class outside the vocabulary is DROPPED rather
|
|
111
|
+
* than failing the whole reply: one invented word should not cost the asset the
|
|
112
|
+
* three good verdicts beside it, and the engine would refuse that verdict anyway.
|
|
113
|
+
* `matte` verdicts are dropped too — they are the default and carry no
|
|
114
|
+
* information — so a reply of all-matte comes back as an empty list, which the
|
|
115
|
+
* engine turns into a byte-identical file.
|
|
116
|
+
*/
|
|
117
|
+
export declare function parseMaterialVerdicts(text: string): MaterialVerdict[] | null;
|
|
118
|
+
//# sourceMappingURL=material-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-classifier.d.ts","sourceRoot":"","sources":["../src/material-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,+HAc7B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjF,uEAAuE;AACvE,eAAO,MAAM,yBAAyB,QAI1B,CAAC;AAEb,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,mHACsE,CAAC;AAE9G;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAStD,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,kCAAkC,QAGE,CAAC;AAElD,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAC9C,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CA4BpF;AAQD,+FAA+F;AAC/F,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;EAEzC,CAAC;AAiBH;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,GAAG,IAAI,CAoB5E"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The voxel MATERIAL CLASSIFIER contract: what a model is asked, and what it is
|
|
3
|
+
* allowed to answer.
|
|
4
|
+
*
|
|
5
|
+
* A generated voxel asset is coordinates and colour, so a sword's steel blade
|
|
6
|
+
* shades exactly like its leather grip. The engine describes an asset's colour
|
|
7
|
+
* groups as a small text table (`VxlMaterialSignature`), and the asset's own
|
|
8
|
+
* generation prompt names the materials outright — matching one to the other is
|
|
9
|
+
* a short classification over text. This module is that text: the prompt one
|
|
10
|
+
* side builds and the verdict list the other side validates.
|
|
11
|
+
*
|
|
12
|
+
* Like judge-prompt.ts it composes strings and validates shapes only — no model,
|
|
13
|
+
* no network. It lives here so every lane that classifies (the Creator's agent,
|
|
14
|
+
* api-server on behalf of the CLI, and the CLI's own printed guidance for a
|
|
15
|
+
* coding agent) reads the SAME rules. The rules are what make the answer safe:
|
|
16
|
+
* a wrongly shiny surface is what a player notices, so `matte` is the default,
|
|
17
|
+
* the prompt is the evidence, and abstaining beats guessing.
|
|
18
|
+
*
|
|
19
|
+
* The engine applies these verdicts through `planMaterialSlots`, which drops
|
|
20
|
+
* anything below its confidence floor, refuses a precious material over a large
|
|
21
|
+
* surface the prompt never mentions, and folds an over-budget answer along its
|
|
22
|
+
* collapse chain. Those guards are the last line; this prompt is the first.
|
|
23
|
+
*/
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
/**
|
|
26
|
+
* The engine's closed vocabulary (`VoxelMaterialClassName` in
|
|
27
|
+
* `game/src/engine/VoxelMaterialClass.ts`), mirrored because this package cannot
|
|
28
|
+
* import the engine. A test pins the two lists to each other.
|
|
29
|
+
*/
|
|
30
|
+
export const VOXEL_MATERIAL_CLASS_NAMES = [
|
|
31
|
+
'matte',
|
|
32
|
+
'cloth',
|
|
33
|
+
'fur',
|
|
34
|
+
'leather',
|
|
35
|
+
'wood',
|
|
36
|
+
'stone',
|
|
37
|
+
'plastic',
|
|
38
|
+
'paint',
|
|
39
|
+
'metal',
|
|
40
|
+
'gold',
|
|
41
|
+
'chrome',
|
|
42
|
+
'gem',
|
|
43
|
+
'glass',
|
|
44
|
+
];
|
|
45
|
+
/** The vocabulary, spelled out for whoever reads a signature table. */
|
|
46
|
+
export const VOXEL_MATERIAL_CLASS_LIST = [
|
|
47
|
+
'matte (default, no special shading)',
|
|
48
|
+
'metal', 'gold', 'chrome', 'gem', 'glass',
|
|
49
|
+
'wood', 'stone', 'cloth', 'fur', 'leather', 'plastic', 'paint',
|
|
50
|
+
].join(', ');
|
|
51
|
+
/** One class needs a sentence: it is easy to reach for and usually wrong. */
|
|
52
|
+
export const VOXEL_MATERIAL_CLASS_NOTES = '`fur` is only for a pelt or plush — a teddy bear, an animal, a fur trim. Anything merely soft is `cloth`.';
|
|
53
|
+
/**
|
|
54
|
+
* Below this a verdict is ignored by the engine (`MIN_VERDICT_CONFIDENCE` in
|
|
55
|
+
* `VxlMaterialSlotTransforms.ts`). Quoted in the rules so the reader knows what
|
|
56
|
+
* "low confidence" buys them.
|
|
57
|
+
*/
|
|
58
|
+
export const MATERIAL_VERDICT_MIN_CONFIDENCE = 0.45;
|
|
59
|
+
/**
|
|
60
|
+
* The rules that actually change the answer. One list, printed by the CLI under
|
|
61
|
+
* a signature table for a coding agent and embedded in the model prompt below,
|
|
62
|
+
* so the two classifiers cannot be told different things.
|
|
63
|
+
*/
|
|
64
|
+
export const MATERIAL_CLASSIFIER_RULES = [
|
|
65
|
+
'`matte` is the right answer for most groups, and costs nothing. Leave a group '
|
|
66
|
+
+ 'out entirely rather than inventing a material for it.',
|
|
67
|
+
'The prompt is the strongest evidence you have: it names the materials, and '
|
|
68
|
+
+ 'your job is to decide which colour group is which.',
|
|
69
|
+
'A material the prompt does NOT name needs strong evidence from the geometry. '
|
|
70
|
+
+ 'A precious material over a large surface is refused unless the prompt says so.',
|
|
71
|
+
`Use a low confidence rather than guessing. Below ${MATERIAL_VERDICT_MIN_CONFIDENCE} a verdict `
|
|
72
|
+
+ 'is dropped, which is a better outcome than a wrongly shiny surface.',
|
|
73
|
+
];
|
|
74
|
+
/** Printed when the asset records nothing about what it is meant to be. */
|
|
75
|
+
export const MATERIAL_CLASSIFIER_NO_PROMPT_NOTE = 'This asset records no prompt or description, so there is nothing saying what '
|
|
76
|
+
+ 'it is meant to be. Classifying on colour alone is guessing — prefer leaving '
|
|
77
|
+
+ 'it alone unless you know what the asset is.';
|
|
78
|
+
/** Caps on what reaches the model; a signature table is ~400 tokens at 16 groups. */
|
|
79
|
+
export const MAX_MATERIAL_TABLE_CHARS = 8000;
|
|
80
|
+
export const MAX_MATERIAL_PROMPT_CHARS = 2000;
|
|
81
|
+
function clip(text, max) {
|
|
82
|
+
return text.length <= max ? text : `${text.slice(0, max)}…`;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The prompt a light model answers with a verdict list.
|
|
86
|
+
*
|
|
87
|
+
* The table and the rules are the same text the CLI prints for a coding agent;
|
|
88
|
+
* only the framing and the output directive are added here. Asking for ONLY the
|
|
89
|
+
* JSON, with the empty answer spelled out, is what makes "nothing here shines"
|
|
90
|
+
* a cheap, valid reply rather than something the model has to invent around.
|
|
91
|
+
*/
|
|
92
|
+
export function buildMaterialClassifierPrompt(input) {
|
|
93
|
+
const rules = MATERIAL_CLASSIFIER_RULES.map((rule) => `- ${rule}`).join('\n');
|
|
94
|
+
const evidence = input.promptText === undefined || input.promptText.trim() === ''
|
|
95
|
+
? `${MATERIAL_CLASSIFIER_NO_PROMPT_NOTE}\nWith no prompt, answer {"verdicts": []} unless the `
|
|
96
|
+
+ 'asset name alone makes a material certain.'
|
|
97
|
+
: `Prompt the asset was generated from: "${clip(input.promptText.trim(), MAX_MATERIAL_PROMPT_CHARS)}"`;
|
|
98
|
+
return `You decide what each colour group of a voxel game asset is MADE OF, so the renderer can shade metal as metal and glass as glass. You see no image — only a table describing the asset's colour groups, and the prompt it was generated from.
|
|
99
|
+
|
|
100
|
+
Asset: "${input.assetName}"
|
|
101
|
+
|
|
102
|
+
${clip(input.table, MAX_MATERIAL_TABLE_CHARS)}
|
|
103
|
+
|
|
104
|
+
How to read the table: \`share\` is the fraction of the asset, \`height\` where the group sits from floor (0) to top (1), \`extent\` its size along each axis relative to the whole, \`radial\` how far from the centre axis, \`shape\` its coarse form, and \`parts\` how many separate pieces the colour forms — a colour scattered across the whole model in many parts is dithering, not a material.
|
|
105
|
+
|
|
106
|
+
${evidence}
|
|
107
|
+
|
|
108
|
+
Classes: ${VOXEL_MATERIAL_CLASS_LIST}
|
|
109
|
+
${VOXEL_MATERIAL_CLASS_NOTES}
|
|
110
|
+
|
|
111
|
+
Rules:
|
|
112
|
+
${rules}
|
|
113
|
+
- Name a group only when you are saying it is NOT matte. Omitting a group means matte.
|
|
114
|
+
- Use "unknown" as the class to say a group could be something special but you cannot tell what.
|
|
115
|
+
|
|
116
|
+
Respond with ONLY valid JSON (no markdown, no code fences), in exactly this shape:
|
|
117
|
+
{"verdicts": [{"id": "g0", "class": "metal", "confidence": 0.9}]}
|
|
118
|
+
Return {"verdicts": []} when nothing on this asset should shine.`;
|
|
119
|
+
}
|
|
120
|
+
const verdictSchema = z.object({
|
|
121
|
+
id: z.string().regex(/^g\d+$/),
|
|
122
|
+
class: z.string().min(1).max(24),
|
|
123
|
+
confidence: z.number().min(0).max(1),
|
|
124
|
+
});
|
|
125
|
+
/** What the model is asked to return. Lenient on class names — see `parseMaterialVerdicts`. */
|
|
126
|
+
export const materialVerdictsResponseSchema = z.object({
|
|
127
|
+
verdicts: z.array(verdictSchema).max(64),
|
|
128
|
+
});
|
|
129
|
+
const KNOWN_CLASSES = new Set([...VOXEL_MATERIAL_CLASS_NAMES, 'unknown']);
|
|
130
|
+
/**
|
|
131
|
+
* Strip a markdown code fence, if the model wrapped its JSON in one. Observed on
|
|
132
|
+
* every call against the light model despite the prompt saying not to.
|
|
133
|
+
*/
|
|
134
|
+
function stripCodeFence(text) {
|
|
135
|
+
const trimmed = text.trim();
|
|
136
|
+
if (!trimmed.startsWith('```'))
|
|
137
|
+
return trimmed;
|
|
138
|
+
return trimmed
|
|
139
|
+
.replace(/^```[a-zA-Z]*\s*/, '')
|
|
140
|
+
.replace(/```$/, '')
|
|
141
|
+
.trim();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The model's text → verdicts, or null when it is not an answer at all.
|
|
145
|
+
*
|
|
146
|
+
* Never throws. A verdict naming a class outside the vocabulary is DROPPED rather
|
|
147
|
+
* than failing the whole reply: one invented word should not cost the asset the
|
|
148
|
+
* three good verdicts beside it, and the engine would refuse that verdict anyway.
|
|
149
|
+
* `matte` verdicts are dropped too — they are the default and carry no
|
|
150
|
+
* information — so a reply of all-matte comes back as an empty list, which the
|
|
151
|
+
* engine turns into a byte-identical file.
|
|
152
|
+
*/
|
|
153
|
+
export function parseMaterialVerdicts(text) {
|
|
154
|
+
let json;
|
|
155
|
+
try {
|
|
156
|
+
json = JSON.parse(stripCodeFence(text));
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const parsed = materialVerdictsResponseSchema.safeParse(json);
|
|
162
|
+
if (!parsed.success)
|
|
163
|
+
return null;
|
|
164
|
+
const seen = new Set();
|
|
165
|
+
const verdicts = [];
|
|
166
|
+
for (const verdict of parsed.data.verdicts) {
|
|
167
|
+
const className = verdict.class.trim().toLowerCase();
|
|
168
|
+
if (!KNOWN_CLASSES.has(className) || className === 'matte')
|
|
169
|
+
continue;
|
|
170
|
+
// First verdict per group wins; a model that lists a group twice is not saying two things.
|
|
171
|
+
if (seen.has(verdict.id))
|
|
172
|
+
continue;
|
|
173
|
+
seen.add(verdict.id);
|
|
174
|
+
verdicts.push({ id: verdict.id, class: className, confidence: verdict.confidence });
|
|
175
|
+
}
|
|
176
|
+
return verdicts;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=material-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-classifier.js","sourceRoot":"","sources":["../src/material-classifier.ts"],"names":[],"mappings":"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"}
|