theprogrammablemind 7.4.3 → 7.5.0-beta.0
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/client.js +70 -28
- package/package.json +1 -1
- package/src/config.js +46 -5
- package/src/generators.js +4 -2
- package/src/helpers.js +32 -1
- package/src/semantics.js +4 -2
package/client.js
CHANGED
@@ -692,10 +692,23 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
692
692
|
const failed_responses = !matching(result.responses, expected.responses)
|
693
693
|
const failed_contexts = !matching(result.contexts, expected.contexts)
|
694
694
|
const failed_objects = !matching(actual_objects, expected_objects)
|
695
|
+
|
696
|
+
const pickEm = (objects) => {
|
697
|
+
const picked = {}
|
698
|
+
for (let prop of (testConfig.check || [])) {
|
699
|
+
picked[prop] = objects[prop]
|
700
|
+
}
|
701
|
+
return picked
|
702
|
+
}
|
703
|
+
const expected_checked = sortJson(pickEm(expected.objects.namespaced[0]), { depth: 25 })
|
704
|
+
const actual_checked = sortJson(pickEm(objects), { depth: 25 })
|
705
|
+
const failed_checked = !matching(actual_objects, expected_objects)
|
706
|
+
|
707
|
+
const failed_checks = !matching(actual_objects, expected_objects)
|
695
708
|
const actual_config = sortJson(convertToStable(getConfigForTest(config, testConfig)), { depth: 25 })
|
696
709
|
const expected_config = sortJson(convertToStable(expected.config), { depth: 25 })
|
697
710
|
const failed_config = !matching(actual_config, expected_config)
|
698
|
-
let failed = failed_paraphrases || failed_responses || failed_contexts || failed_objects || failed_config
|
711
|
+
let failed = failed_paraphrases || failed_responses || failed_contexts || failed_objects || failed_config || failed_checked
|
699
712
|
if (!failed) {
|
700
713
|
if (config.afterTest) {
|
701
714
|
failed = config.afterTest({ query: test, expected, actual: result, config })
|
@@ -703,8 +716,8 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
703
716
|
return {
|
704
717
|
utterance: test,
|
705
718
|
errorFromAfterTest: failed,
|
706
|
-
expected: { responses: expected.responses, paraphrases: expected.paraphrases, results: expected.contexts, objects: expected_objects, config: expected.config },
|
707
|
-
actual: { responses: result.responses, paraphrases: result.paraphrases, results: result.contexts, objects: actual_objects, config: actual_config }
|
719
|
+
expected: { responses: expected.responses, paraphrases: expected.paraphrases, results: expected.contexts, checked: expected_checked, objects: expected_objects, config: expected.config },
|
720
|
+
actual: { responses: result.responses, paraphrases: result.paraphrases, results: result.contexts, checked: actual_checked, objects: actual_objects, config: actual_config }
|
708
721
|
}
|
709
722
|
}
|
710
723
|
}
|
@@ -720,8 +733,8 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
720
733
|
if (failed) {
|
721
734
|
return {
|
722
735
|
utterance: test,
|
723
|
-
expected: { responses: expected.responses, paraphrases: expected.paraphrases, results: expected.contexts, objects: expected_objects, config: expected.config },
|
724
|
-
actual: { responses: result.responses, paraphrases: result.paraphrases, results: result.contexts, objects: actual_objects, config: actual_config }
|
736
|
+
expected: { responses: expected.responses, paraphrases: expected.paraphrases, results: expected.contexts, checked: expected_checked, objects: expected_objects, config: expected.config },
|
737
|
+
actual: { responses: result.responses, paraphrases: result.paraphrases, results: result.contexts, checked: actual_checked, objects: actual_objects, config: actual_config }
|
725
738
|
}
|
726
739
|
}
|
727
740
|
} catch(error) {
|
@@ -1254,7 +1267,7 @@ const knowledgeModule = async ({
|
|
1254
1267
|
parser.add_argument('-q', '--query', { help: 'Run the specified query' })
|
1255
1268
|
parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
|
1256
1269
|
parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
|
1257
|
-
parser.add_argument('-
|
1270
|
+
parser.add_argument('-td', '--testDelete', { help: 'Delete the specified query from the tests file.' })
|
1258
1271
|
parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
|
1259
1272
|
parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
|
1260
1273
|
parser.add_argument('-daa', '--dontAddAssociations', { action: 'store_true', help: 'Do not add associations from the tests.' })
|
@@ -1293,11 +1306,11 @@ const knowledgeModule = async ({
|
|
1293
1306
|
return
|
1294
1307
|
}
|
1295
1308
|
|
1296
|
-
if (args.
|
1309
|
+
if (args.testDelete) {
|
1297
1310
|
let tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
|
1298
|
-
tests = tests.filter( (test) => test.query !== args.
|
1311
|
+
tests = tests.filter( (test) => test.query !== args.testDelete );
|
1299
1312
|
writeTestFile(testConfig.name, tests)
|
1300
|
-
console.log(`Remove the test for "${args.
|
1313
|
+
console.log(`Remove the test for "${args.testDelete}"`)
|
1301
1314
|
return
|
1302
1315
|
}
|
1303
1316
|
|
@@ -1462,34 +1475,63 @@ const knowledgeModule = async ({
|
|
1462
1475
|
let newError = false
|
1463
1476
|
if (results.length > 0) {
|
1464
1477
|
let headerShown = false
|
1465
|
-
|
1478
|
+
|
1479
|
+
let hasError = false
|
1466
1480
|
for (const result of results) {
|
1467
|
-
console.log('Utterance: ', result.utterance)
|
1468
1481
|
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1469
|
-
|
1470
|
-
console.log(' Failure')
|
1471
|
-
}
|
1472
|
-
console.log(' expected paraphrases', result.expected.paraphrases)
|
1473
|
-
console.log(' actual paraphrases ', result.actual.paraphrases)
|
1474
|
-
newError = true
|
1475
|
-
headerShown = true
|
1482
|
+
hasError = true
|
1476
1483
|
}
|
1477
1484
|
if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
|
1478
|
-
|
1479
|
-
|
1485
|
+
hasError = true
|
1486
|
+
}
|
1487
|
+
if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
|
1488
|
+
hasError = true
|
1489
|
+
}
|
1490
|
+
}
|
1491
|
+
|
1492
|
+
if (hasError) {
|
1493
|
+
console.log('**************************** ERRORS ************************')
|
1494
|
+
for (const result of results) {
|
1495
|
+
console.log('Utterance: ', result.utterance)
|
1496
|
+
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1497
|
+
if (!headerShown) {
|
1498
|
+
console.log(' Failure')
|
1499
|
+
}
|
1500
|
+
console.log(' expected paraphrases', result.expected.paraphrases)
|
1501
|
+
console.log(' actual paraphrases ', result.actual.paraphrases)
|
1502
|
+
newError = true
|
1503
|
+
headerShown = true
|
1504
|
+
}
|
1505
|
+
if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
|
1506
|
+
if (!headerShown) {
|
1507
|
+
console.log(' Failure')
|
1508
|
+
}
|
1509
|
+
console.log(' expected responses ', result.expected.responses)
|
1510
|
+
console.log(' actual responses ', result.actual.responses)
|
1511
|
+
newError = true
|
1512
|
+
headerShown = true
|
1513
|
+
}
|
1514
|
+
if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
|
1515
|
+
if (!headerShown) {
|
1516
|
+
console.log(' Failure')
|
1517
|
+
}
|
1518
|
+
console.log(' expected checked', result.expected.checked)
|
1519
|
+
console.log(' actual checked ', result.actual.checked)
|
1520
|
+
newError = true
|
1521
|
+
headerShown = true
|
1480
1522
|
}
|
1481
|
-
console.log(' expected responses ', result.expected.responses)
|
1482
|
-
console.log(' actual responses ', result.actual.responses)
|
1483
|
-
newError = true
|
1484
|
-
headerShown = true
|
1485
1523
|
}
|
1486
1524
|
}
|
1487
1525
|
if (!headerShown) {
|
1488
|
-
|
1526
|
+
if (!(testConfig.check && testConfig.check.length > 0)) {
|
1527
|
+
console.log('There are failures due to things other than paraphrases, responses and checked properties being different. They are not shown because you ran -tv or -tva which only shows difference in paraphrase and results. Usually what I do is -s and do a diff to make sure there are no other problems. If the paraphrases or results were different they would have shown here.')
|
1528
|
+
}
|
1529
|
+
}
|
1530
|
+
if (!(testConfig.check && testConfig.check.length > 0)) {
|
1531
|
+
console.log('use -v arg to write files expected.json and actual.json in the current directory for detailed comparison. Or do -s and then git diff the changes.')
|
1532
|
+
// console.log(JSON.stringify(contexts))
|
1533
|
+
console.log('**************************** ERRORS ************************')
|
1489
1534
|
}
|
1490
|
-
console.log('use -v arg to write files expected.json and actual.json in the current directory for detailed comparison. Or do -s and then git diff the changes.')
|
1491
|
-
// console.log(JSON.stringify(contexts))
|
1492
|
-
console.log('**************************** ERRORS ************************')
|
1493
1535
|
}
|
1494
1536
|
// const contexts = { failures: results }
|
1495
1537
|
l(n - 1, hasError || newError)
|
package/package.json
CHANGED
package/src/config.js
CHANGED
@@ -412,11 +412,11 @@ class Config {
|
|
412
412
|
}
|
413
413
|
|
414
414
|
getSemantics (logs = []) {
|
415
|
-
return new Semantics(this.config.semantics || [], logs)
|
415
|
+
return new Semantics(this.config.semantics || [], logs, { km: this.name })
|
416
416
|
}
|
417
417
|
|
418
418
|
getGenerators (logs = []) {
|
419
|
-
return new Generators(this.config.generators || [], logs)
|
419
|
+
return new Generators(this.config.generators || [], logs, { km: this.name })
|
420
420
|
}
|
421
421
|
|
422
422
|
warningNotEvaluated (log, value) {
|
@@ -979,6 +979,35 @@ class Config {
|
|
979
979
|
throw 'Excepted the config argument to be a hash not a Config object'
|
980
980
|
}
|
981
981
|
|
982
|
+
if (config) {
|
983
|
+
const valid = [
|
984
|
+
'hierarchy',
|
985
|
+
'objects',
|
986
|
+
'bridges',
|
987
|
+
'operators',
|
988
|
+
'words',
|
989
|
+
'priorities',
|
990
|
+
'associations',
|
991
|
+
'name',
|
992
|
+
'version',
|
993
|
+
'generators',
|
994
|
+
'semantics',
|
995
|
+
'floaters',
|
996
|
+
'debug',
|
997
|
+
|
998
|
+
// TODO Fix these from the test app
|
999
|
+
'implicit',
|
1000
|
+
'expected_generated',
|
1001
|
+
'expected_results',
|
1002
|
+
'skipSemantics',
|
1003
|
+
'description',
|
1004
|
+
'contexts',
|
1005
|
+
'utterances',
|
1006
|
+
'flatten',
|
1007
|
+
]
|
1008
|
+
helpers.validProps(valid, config, 'config')
|
1009
|
+
}
|
1010
|
+
|
982
1011
|
this.allowDelta = false
|
983
1012
|
this.resetDelta()
|
984
1013
|
|
@@ -1030,7 +1059,8 @@ class Config {
|
|
1030
1059
|
normalizeConfig(config)
|
1031
1060
|
|
1032
1061
|
// set the default server so stuff just works
|
1033
|
-
this.server('
|
1062
|
+
// this.server('https://184.67.27.82:3000', '6804954f-e56d-471f-bbb8-08e3c54d9321')
|
1063
|
+
this.server('https://thinktelligence.com:3000', '6804954f-e56d-471f-bbb8-08e3c54d9321')
|
1034
1064
|
|
1035
1065
|
this.defaultConfig()
|
1036
1066
|
this.initializerFn = ({ currentConfig }) => {
|
@@ -1063,6 +1093,9 @@ class Config {
|
|
1063
1093
|
// this.config.words = {}
|
1064
1094
|
}
|
1065
1095
|
for (let bridge of (this.config.bridges || [])) {
|
1096
|
+
const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generators', 'id', 'inverted', 'isA',
|
1097
|
+
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy' ]
|
1098
|
+
helpers.validProps(valid, bridge, 'bridge')
|
1066
1099
|
/*
|
1067
1100
|
if (bridge.generator) {
|
1068
1101
|
this.config.generators.push({
|
@@ -1078,13 +1111,16 @@ class Config {
|
|
1078
1111
|
}
|
1079
1112
|
if (bridge.before) {
|
1080
1113
|
for (let after of bridge.before) {
|
1114
|
+
if (typeof after == 'string') {
|
1115
|
+
after = [after, 0]
|
1116
|
+
}
|
1081
1117
|
this.addPriorities([after, [bridge.id, bridge.level]])
|
1082
1118
|
}
|
1083
1119
|
}
|
1084
1120
|
if (bridge.words) {
|
1085
1121
|
for (let def of bridge.words) {
|
1086
1122
|
if (typeof def == 'string') {
|
1087
|
-
this.addWordInternal(def, {"id": bridge.id, "initial": "{}" })
|
1123
|
+
this.addWordInternal(def, {"id": bridge.id, "initial": `{ value: "${def}"}` })
|
1088
1124
|
} else {
|
1089
1125
|
const word = def.word
|
1090
1126
|
def = { initial: JSON.stringify(def), id: bridge.id, word: undefined }
|
@@ -1229,6 +1265,10 @@ class Config {
|
|
1229
1265
|
}
|
1230
1266
|
|
1231
1267
|
set api (value) {
|
1268
|
+
if (!value.initialize) {
|
1269
|
+
throw `Expected the API to have an initialize function for ${this.name}.`
|
1270
|
+
}
|
1271
|
+
|
1232
1272
|
if (this._api && this._api.multiApi) {
|
1233
1273
|
this._api.add(this, this._api, value)
|
1234
1274
|
} else {
|
@@ -1746,7 +1786,8 @@ class Config {
|
|
1746
1786
|
config.wasInitialized = false
|
1747
1787
|
// TODO change name of config: to baseConfig:
|
1748
1788
|
const kmFn = (name) => this.getConfig(name)
|
1749
|
-
const
|
1789
|
+
const hierarchy = new Digraph((config.config || {}).hierarchy || [])
|
1790
|
+
const args = { isModule, addWord: aw, km: kmFn, hierarchy, config, baseConfig: this, currentConfig: config, uuid: config._uuid, objects: namespacedObjects, namespace, api: config.api }
|
1750
1791
|
config.initializerFn(args)
|
1751
1792
|
if (config.initAfterApi) {
|
1752
1793
|
initAfterApis.push({ config, args })
|
package/src/generators.js
CHANGED
@@ -124,12 +124,14 @@ class Generator {
|
|
124
124
|
}
|
125
125
|
|
126
126
|
class Generators {
|
127
|
-
constructor (generators, logs = []) {
|
127
|
+
constructor (generators, logs = [], options = {}) {
|
128
|
+
let index = -1
|
128
129
|
generators = (generators || []).map((generator) => {
|
129
130
|
if (generator instanceof Generator) {
|
130
131
|
return generator
|
131
132
|
} else {
|
132
|
-
|
133
|
+
index += 1
|
134
|
+
return new Generator({ km: options.km, index, ...normalizeGenerator(generator) })
|
133
135
|
}
|
134
136
|
})
|
135
137
|
this.defaults = []
|
package/src/helpers.js
CHANGED
@@ -217,4 +217,35 @@ const sortJson = (json) => {
|
|
217
217
|
return json
|
218
218
|
}
|
219
219
|
|
220
|
-
|
220
|
+
const validProps = (valids, object, type) => {
|
221
|
+
for (let prop of Object.keys(object)) {
|
222
|
+
let okay = false
|
223
|
+
for (valid of valids) {
|
224
|
+
if (prop.match(valid)) {
|
225
|
+
okay = true
|
226
|
+
break
|
227
|
+
}
|
228
|
+
}
|
229
|
+
if (!okay) {
|
230
|
+
throw `Unknown property "${prop}" in the ${type}. Valid properties are ${valid}. The ${type} is ${JSON.stringify(object)}`
|
231
|
+
}
|
232
|
+
}
|
233
|
+
}
|
234
|
+
|
235
|
+
module.exports = {
|
236
|
+
validProps,
|
237
|
+
args,
|
238
|
+
safeEquals,
|
239
|
+
appendNoDups,
|
240
|
+
hashIndexesGet,
|
241
|
+
hashIndexesSet,
|
242
|
+
translationMapping,
|
243
|
+
normalizeGenerator,
|
244
|
+
normalizeSemantic,
|
245
|
+
isArray,
|
246
|
+
isObject,
|
247
|
+
isCompound,
|
248
|
+
InitCalls,
|
249
|
+
hashCode,
|
250
|
+
sortJson
|
251
|
+
}
|
package/src/semantics.js
CHANGED
@@ -115,12 +115,14 @@ class Semantic {
|
|
115
115
|
}
|
116
116
|
|
117
117
|
class Semantics {
|
118
|
-
constructor (semantics, logs = []) {
|
118
|
+
constructor (semantics, logs = [], options = {}) {
|
119
|
+
let index = -1
|
119
120
|
semantics = semantics.map((semantic) => {
|
120
121
|
if (semantic instanceof Semantic) {
|
121
122
|
return semantic
|
122
123
|
} else {
|
123
|
-
|
124
|
+
index += 1
|
125
|
+
return new Semantic({ km: options.km, index, ...normalizeSemantic(semantic) })
|
124
126
|
}
|
125
127
|
})
|
126
128
|
|