@geotechcli/core 0.4.33 → 0.4.35
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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest/geotech-document.d.ts +17 -0
- package/dist/ingest/geotech-document.d.ts.map +1 -1
- package/dist/ingest/geotech-document.js +258 -22
- package/dist/ingest/geotech-document.js.map +1 -1
- package/dist/ingest/geotech-extract.d.ts.map +1 -1
- package/dist/ingest/geotech-extract.js +6 -2
- package/dist/ingest/geotech-extract.js.map +1 -1
- package/dist/ingest/job-store.d.ts +1 -1
- package/dist/ingest/job-store.d.ts.map +1 -1
- package/dist/ingest/job-worker.d.ts.map +1 -1
- package/dist/ingest/job-worker.js +49 -16
- package/dist/ingest/job-worker.js.map +1 -1
- package/dist/llm/providers/hosted-beta.d.ts.map +1 -1
- package/dist/llm/providers/hosted-beta.js +1 -0
- package/dist/llm/providers/hosted-beta.js.map +1 -1
- package/dist/llm/providers/zhipu.d.ts.map +1 -1
- package/dist/llm/providers/zhipu.js +3 -0
- package/dist/llm/providers/zhipu.js.map +1 -1
- package/dist/llm/router.d.ts +2 -0
- package/dist/llm/router.d.ts.map +1 -1
- package/dist/llm/router.js +2 -0
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/types.d.ts +1 -0
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js.map +1 -1
- package/dist/meta/metadata.json +2 -2
- package/dist/report/html.d.ts.map +1 -1
- package/dist/report/html.js +226 -48
- package/dist/report/html.js.map +1 -1
- package/dist/report/ingest-dossier.d.ts +1 -0
- package/dist/report/ingest-dossier.d.ts.map +1 -1
- package/dist/report/ingest-dossier.js +211 -34
- package/dist/report/ingest-dossier.js.map +1 -1
- package/dist/vision/geotech-document.d.ts +1 -0
- package/dist/vision/geotech-document.d.ts.map +1 -1
- package/dist/vision/geotech-document.js +156 -5
- package/dist/vision/geotech-document.js.map +1 -1
- package/dist/vision/layout-ocr.d.ts +44 -0
- package/dist/vision/layout-ocr.d.ts.map +1 -0
- package/dist/vision/layout-ocr.js +216 -0
- package/dist/vision/layout-ocr.js.map +1 -0
- package/dist/vision/ocr.d.ts +5 -1
- package/dist/vision/ocr.d.ts.map +1 -1
- package/dist/vision/ocr.js +33 -2
- package/dist/vision/ocr.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export { loadEvidenceRecord, listEvidenceRecords, persistEvidenceRecord, persist
|
|
|
20
20
|
export { toolRegistry, type ToolDefinition, type ToolResult, } from './agents/tools.js';
|
|
21
21
|
export { analyzeCoreBox, classifyRMRFromImage, classifySoilFromDescription, interpretBoreholeLog, interpretBoreholeLogWithContext, mergeBoreholeLogPages, queryGBRDocument, interpretSensorImage, type ParseSafety, type ParseStatus, type CoreBoxAnalysisResult, type HybridRMRResult, type SoilClassificationFromTextResult, type BoreholeInterpretation, type BoreholeLayer, type BoreholeLocation, type BoreholeLogContext, type BoreholeLogPageResult, type SensorInterpretation, } from './vision/index.js';
|
|
22
22
|
export { extractGeotechDocumentFactsFromText, interpretGeotechDocumentPage, type GeotechDocumentContext, type GeotechDocumentInsight, type GeotechDocumentClassification, type GeotechMaterialObservation, type GeotechParameterObservation, } from './vision/geotech-document.js';
|
|
23
|
+
export { parseDocumentLayoutWithGlmOcr, supportsGlmOcrLayoutParsing, type GlmOcrLayoutElement, type GlmOcrLayoutPage, type GlmOcrLayoutResult, } from './vision/layout-ocr.js';
|
|
23
24
|
export { generateReport, buildIngestDossier, buildArtifactDrivenReport, generateReportFromCaseFile, renderIngestDossierAsHtml, renderReportAsPdf, renderReportAsDocx, type GeneratedReport, type ReportSection, type BuildIngestDossierOptions, type CaseFileGeneratedReport, type CaseFileReportInput, type GenerateStoredCaseFileReportOptions, type IngestDossier, type IngestDossierApproval, type IngestDossierBadge, type IngestDossierFindingGroup, type IngestDossierMetric, type IngestDossierNarrativeSection, type IngestDossierPageCard, type IngestDossierSourceResult, type IngestDossierStoredReview, type IngestDossierTable, type IngestDossierTone, } from './report/index.js';
|
|
24
25
|
export { exportGeoJSON, exportBoreholeGeoJSON, exportDXF, exportBoreholeProfileDXF, exportCSV, exportJSON, type GeoJSONFeatureInput, type DXFEntity, } from './export/index.js';
|
|
25
26
|
export { InMemoryUsageStore, checkUsageAndAbuse, generateFingerprint, detectSuspiciousActivity, type UsageRecord, type UsageStore, type AbuseCheckResult, } from './llm/middleware/metering.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,cAAc,gBAAgB,CAAC;AAG/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGzI,OAAO,EACL,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EACpE,cAAc,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAClE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAClE,eAAe,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,sBAAsB,EACvF,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAC3E,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EACxF,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,GACrD,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,GAChC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,UAAU,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,2BAA2B,EAC3B,oBAAoB,EACpB,+BAA+B,EAC/B,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,gCAAgC,EACrC,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mCAAmC,EACnC,4BAA4B,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,GACjC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -29,6 +29,7 @@ export { loadEvidenceRecord, listEvidenceRecords, persistEvidenceRecord, persist
|
|
|
29
29
|
export { toolRegistry, } from './agents/tools.js';
|
|
30
30
|
export { analyzeCoreBox, classifyRMRFromImage, classifySoilFromDescription, interpretBoreholeLog, interpretBoreholeLogWithContext, mergeBoreholeLogPages, queryGBRDocument, interpretSensorImage, } from './vision/index.js';
|
|
31
31
|
export { extractGeotechDocumentFactsFromText, interpretGeotechDocumentPage, } from './vision/geotech-document.js';
|
|
32
|
+
export { parseDocumentLayoutWithGlmOcr, supportsGlmOcrLayoutParsing, } from './vision/layout-ocr.js';
|
|
32
33
|
// Report generation
|
|
33
34
|
export { generateReport, buildIngestDossier, buildArtifactDrivenReport, generateReportFromCaseFile, renderIngestDossierAsHtml, renderReportAsPdf, renderReportAsDocx, } from './report/index.js';
|
|
34
35
|
// Export formats
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,cAAc,gBAAgB,CAAC;AAE/B,sBAAsB;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,mCAAmC;AACnC,cAAc,gBAAgB,CAAC;AAE/B,gBAAgB;AAChB,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAEhC,4BAA4B;AAC5B,cAAc,mBAAmB,CAAC;AAElC,yBAAyB;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AAEpC,qBAAqB;AACrB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAqD,MAAM,sBAAsB,CAAC;AAEzI,6BAA6B;AAC7B,OAAO,EACL,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EACpE,cAAc,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAClE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAClE,eAAe,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,sBAAsB,GAIxF,MAAM,oBAAoB,CAAC;AAE5B,uCAAuC;AACvC,OAAO,EAAE,iBAAiB,EAAiB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EACL,QAAQ,EACR,iBAAiB,GAIlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,QAAQ,GAIT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,uBAAuB,GASxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,GAGb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,2BAA2B,EAC3B,oBAAoB,EACpB,+BAA+B,EAC/B,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,GAYrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mCAAmC,EACnC,4BAA4B,GAM7B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,6 +70,7 @@ export interface GeotechDocumentIngestResult {
|
|
|
70
70
|
parameters: GeotechParameterObservation[];
|
|
71
71
|
risks: string[];
|
|
72
72
|
recommendations: string[];
|
|
73
|
+
synthesis?: GeotechDocumentSynthesis | null;
|
|
73
74
|
contentChunks?: GeotechDocumentContentChunk[];
|
|
74
75
|
pageAudits: GeotechDocumentPageAudit[];
|
|
75
76
|
pageFailures: string[];
|
|
@@ -81,6 +82,16 @@ export interface GeotechDocumentIngestResult {
|
|
|
81
82
|
reviewRequired: boolean;
|
|
82
83
|
canAutoProceed: boolean;
|
|
83
84
|
}
|
|
85
|
+
export interface GeotechDocumentSynthesis {
|
|
86
|
+
takeaways: string[];
|
|
87
|
+
groundModel: string[];
|
|
88
|
+
keyParameters: string[];
|
|
89
|
+
interpretation: string[];
|
|
90
|
+
limitations: string[];
|
|
91
|
+
sourcePages: number[];
|
|
92
|
+
rawLLMText?: string;
|
|
93
|
+
latencyMs?: number;
|
|
94
|
+
}
|
|
84
95
|
export interface GeotechDocumentContentChunk {
|
|
85
96
|
chunkId: string;
|
|
86
97
|
pageRange: [number, number];
|
|
@@ -101,6 +112,12 @@ export interface IngestGeotechDocumentOptions {
|
|
|
101
112
|
interpretPage?: typeof interpretGeotechDocumentPage;
|
|
102
113
|
extractTextFacts?: typeof extractGeotechDocumentFactsFromText;
|
|
103
114
|
transcribePageImageText?: typeof transcribeDocumentImageText;
|
|
115
|
+
synthesizeDocument?: (input: {
|
|
116
|
+
config: LLMConfig;
|
|
117
|
+
result: Omit<GeotechDocumentIngestResult, 'synthesis' | 'contentChunks'> & {
|
|
118
|
+
contentChunks?: GeotechDocumentContentChunk[];
|
|
119
|
+
};
|
|
120
|
+
}) => Promise<GeotechDocumentSynthesis | null>;
|
|
104
121
|
pageConcurrency?: number;
|
|
105
122
|
now?: () => Date;
|
|
106
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geotech-document.d.ts","sourceRoot":"","sources":["../../src/ingest/geotech-document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"geotech-document.d.ts","sourceRoot":"","sources":["../../src/ingest/geotech-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,26 @@
|
|
|
1
|
+
import { generateText } from '../llm/router.js';
|
|
1
2
|
import { resolveProviderCapabilities } from '../llm/index.js';
|
|
3
|
+
import { parseJsonObject } from '../vision/parse.js';
|
|
2
4
|
import { extractGeotechDocumentFactsFromText, interpretGeotechDocumentPage, } from '../vision/geotech-document.js';
|
|
3
5
|
import { transcribeDocumentImageText } from '../vision/index.js';
|
|
4
6
|
import { recoverDocumentTextHint } from '../vision/ocr.js';
|
|
5
7
|
function uniqueStrings(values) {
|
|
6
8
|
return [...new Set(values.filter((value) => typeof value === 'string' && value.trim().length > 0))];
|
|
7
9
|
}
|
|
10
|
+
function normalizeTextItems(value, limit = 8) {
|
|
11
|
+
if (!Array.isArray(value)) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
return uniqueStrings(value.map((item) => (typeof item === 'string' ? item.replace(/\s+/g, ' ').trim() : ''))).slice(0, limit);
|
|
15
|
+
}
|
|
16
|
+
function normalizeSourcePages(value) {
|
|
17
|
+
if (!Array.isArray(value)) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
return [...new Set(value
|
|
21
|
+
.map((item) => Number(item))
|
|
22
|
+
.filter((item) => Number.isInteger(item) && item > 0))].sort((left, right) => left - right);
|
|
23
|
+
}
|
|
8
24
|
function createFindingKey(finding) {
|
|
9
25
|
return [
|
|
10
26
|
finding.severity,
|
|
@@ -239,6 +255,21 @@ function resolveTextExtractionTimeoutMs(baseTimeoutMs, textHint) {
|
|
|
239
255
|
}
|
|
240
256
|
return baseTimeoutMs;
|
|
241
257
|
}
|
|
258
|
+
function shouldPreferDirectVisualExtraction(input) {
|
|
259
|
+
if (input.config.provider !== 'hosted-beta') {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
const hasAcceptedText = typeof input.textHint === 'string'
|
|
263
|
+
&& input.textHint.trim().length >= 24
|
|
264
|
+
&& (input.inspectionPage?.normalizedArtifact?.textQuality.accepted ?? false);
|
|
265
|
+
if (hasAcceptedText) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
return input.page.sourceKind === 'raster-image'
|
|
269
|
+
&& (input.inspectionPage?.classification === 'image-only'
|
|
270
|
+
|| input.inspectionPage?.classification === 'graphics-only'
|
|
271
|
+
|| input.inspectionPage?.classification === 'text-unreadable');
|
|
272
|
+
}
|
|
242
273
|
function normalizeHeadingText(value) {
|
|
243
274
|
return value
|
|
244
275
|
.toLowerCase()
|
|
@@ -567,6 +598,142 @@ function chooseDocumentSummary(chunks) {
|
|
|
567
598
|
.filter((value) => typeof value === 'string' && value.trim().length > 0)).slice(0, 3);
|
|
568
599
|
return summaries.length > 0 ? summaries.join(' ') : null;
|
|
569
600
|
}
|
|
601
|
+
function compactForPrompt(value, maxLength) {
|
|
602
|
+
if (!value) {
|
|
603
|
+
return '';
|
|
604
|
+
}
|
|
605
|
+
const normalized = value.replace(/\s+/g, ' ').trim();
|
|
606
|
+
return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1).trim()}...` : normalized;
|
|
607
|
+
}
|
|
608
|
+
function buildSynthesisEvidence(input) {
|
|
609
|
+
const parameterLines = input.parameters.slice(0, 40).map((parameter) => [
|
|
610
|
+
parameter.name,
|
|
611
|
+
parameter.valueText,
|
|
612
|
+
parameter.unit,
|
|
613
|
+
parameter.material ? `material=${parameter.material}` : null,
|
|
614
|
+
parameter.context ? `context=${parameter.context}` : null,
|
|
615
|
+
].filter(Boolean).join(' | '));
|
|
616
|
+
const materialLines = input.materials.slice(0, 30).map((material) => [
|
|
617
|
+
material.kind,
|
|
618
|
+
material.description,
|
|
619
|
+
material.uscsSymbol ? `USCS=${material.uscsSymbol}` : null,
|
|
620
|
+
material.lithology ? `lithology=${material.lithology}` : null,
|
|
621
|
+
].filter(Boolean).join(' | '));
|
|
622
|
+
const classificationLines = input.classifications.slice(0, 25).map((classification) => [
|
|
623
|
+
classification.system,
|
|
624
|
+
classification.value,
|
|
625
|
+
classification.context,
|
|
626
|
+
].filter(Boolean).join(' | '));
|
|
627
|
+
const chunkLines = [...input.contentChunks]
|
|
628
|
+
.filter((chunk) => chunk.sectionType !== 'administrative')
|
|
629
|
+
.sort((left, right) => right.significance - left.significance)
|
|
630
|
+
.slice(0, 18)
|
|
631
|
+
.map((chunk) => `Pages ${chunk.pageRange[0]}-${chunk.pageRange[1]} | ${chunk.sectionType ?? 'general'} | ${compactForPrompt(chunk.headingAncestry[0], 80)} | ${compactForPrompt(chunk.text, 320)}`);
|
|
632
|
+
return [
|
|
633
|
+
`Title: ${input.title ?? 'unknown'}`,
|
|
634
|
+
`Document class: ${input.documentClass ?? 'unknown'}`,
|
|
635
|
+
`Current summary: ${input.summary ?? 'none'}`,
|
|
636
|
+
'',
|
|
637
|
+
'Materials:',
|
|
638
|
+
materialLines.join('\n') || 'None extracted.',
|
|
639
|
+
'',
|
|
640
|
+
'Classifications:',
|
|
641
|
+
classificationLines.join('\n') || 'None extracted.',
|
|
642
|
+
'',
|
|
643
|
+
'Engineering parameters:',
|
|
644
|
+
parameterLines.join('\n') || 'None extracted.',
|
|
645
|
+
'',
|
|
646
|
+
'Risks:',
|
|
647
|
+
input.risks.slice(0, 12).join('\n') || 'None extracted.',
|
|
648
|
+
'',
|
|
649
|
+
'Recommendations:',
|
|
650
|
+
input.recommendations.slice(0, 12).join('\n') || 'None extracted.',
|
|
651
|
+
'',
|
|
652
|
+
'Source page evidence:',
|
|
653
|
+
chunkLines.join('\n') || 'No source chunks retained.',
|
|
654
|
+
].join('\n');
|
|
655
|
+
}
|
|
656
|
+
function isEmptySynthesisResponseError(error) {
|
|
657
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
658
|
+
return /no content|empty.*content|assistant text|did not contain assistant text/i.test(message);
|
|
659
|
+
}
|
|
660
|
+
async function synthesizeGeotechDocumentResult(input) {
|
|
661
|
+
const contentChunks = (input.result.contentChunks ?? []);
|
|
662
|
+
const hasEngineeringSignal = input.result.materials.length > 0
|
|
663
|
+
|| input.result.classifications.length > 0
|
|
664
|
+
|| input.result.parameters.length > 0
|
|
665
|
+
|| contentChunks.some((chunk) => chunk.sectionType !== 'administrative' && chunk.sectionType !== 'visual-appendix');
|
|
666
|
+
if (!hasEngineeringSignal) {
|
|
667
|
+
return null;
|
|
668
|
+
}
|
|
669
|
+
const prompt = `Create a concise engineering synthesis from the extracted geotechnical report evidence. Respond with ONLY a JSON object:
|
|
670
|
+
{
|
|
671
|
+
"takeaways": ["<report-level takeaway with source-page wording where possible>"],
|
|
672
|
+
"groundModel": ["<soil/rock/groundwater model statement>"],
|
|
673
|
+
"keyParameters": ["<parameter, value, unit, material/context, source page if known>"],
|
|
674
|
+
"interpretation": ["<engineering interpretation supported by extracted evidence>"],
|
|
675
|
+
"limitations": ["<uncertainty, missing evidence, OCR/layout/visual limitations>"],
|
|
676
|
+
"sourcePages": [<page numbers that support the synthesis>]
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
Do not invent values. Do not increase confidence. Prefer explicit soil and rock mechanics parameters, groundwater observations, classification systems, and foundation/geohazard implications.
|
|
680
|
+
|
|
681
|
+
Evidence:
|
|
682
|
+
${buildSynthesisEvidence({
|
|
683
|
+
documentClass: input.result.documentClass,
|
|
684
|
+
title: input.result.title,
|
|
685
|
+
summary: input.result.summary,
|
|
686
|
+
materials: input.result.materials,
|
|
687
|
+
classifications: input.result.classifications,
|
|
688
|
+
parameters: input.result.parameters,
|
|
689
|
+
risks: input.result.risks,
|
|
690
|
+
recommendations: input.result.recommendations,
|
|
691
|
+
contentChunks,
|
|
692
|
+
}).slice(0, 9000)}`;
|
|
693
|
+
const requestSynthesis = async (thinkingMode) => generateText(prompt, input.config, {
|
|
694
|
+
systemPrompt: 'You are a senior geotechnical engineer synthesizing extracted report evidence into a review brief. Use cautious, evidence-bound language. Respond with JSON only.',
|
|
695
|
+
temperature: 0.1,
|
|
696
|
+
jsonMode: true,
|
|
697
|
+
maxTokens: 1200,
|
|
698
|
+
thinkingMode,
|
|
699
|
+
});
|
|
700
|
+
let response;
|
|
701
|
+
try {
|
|
702
|
+
response = await requestSynthesis('enabled');
|
|
703
|
+
if (!response.text.trim()) {
|
|
704
|
+
response = await requestSynthesis('disabled');
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
catch (error) {
|
|
708
|
+
if (!isEmptySynthesisResponseError(error)) {
|
|
709
|
+
throw error;
|
|
710
|
+
}
|
|
711
|
+
response = await requestSynthesis('disabled');
|
|
712
|
+
}
|
|
713
|
+
const parsed = parseJsonObject(response.text);
|
|
714
|
+
if (!parsed.value) {
|
|
715
|
+
return {
|
|
716
|
+
takeaways: [],
|
|
717
|
+
groundModel: [],
|
|
718
|
+
keyParameters: [],
|
|
719
|
+
interpretation: [],
|
|
720
|
+
limitations: ['GLM-5.1 synthesis did not return valid JSON; use extracted tables and page audits for review.'],
|
|
721
|
+
sourcePages: [],
|
|
722
|
+
rawLLMText: response.text,
|
|
723
|
+
latencyMs: response.latencyMs,
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
return {
|
|
727
|
+
takeaways: normalizeTextItems(parsed.value.takeaways, 8),
|
|
728
|
+
groundModel: normalizeTextItems(parsed.value.groundModel, 10),
|
|
729
|
+
keyParameters: normalizeTextItems(parsed.value.keyParameters, 16),
|
|
730
|
+
interpretation: normalizeTextItems(parsed.value.interpretation, 10),
|
|
731
|
+
limitations: normalizeTextItems(parsed.value.limitations, 10),
|
|
732
|
+
sourcePages: normalizeSourcePages(parsed.value.sourcePages),
|
|
733
|
+
rawLLMText: response.text,
|
|
734
|
+
latencyMs: response.latencyMs,
|
|
735
|
+
};
|
|
736
|
+
}
|
|
570
737
|
function buildPageLeadText(inspectionPage, options) {
|
|
571
738
|
if (!inspectionPage) {
|
|
572
739
|
return '';
|
|
@@ -917,6 +1084,29 @@ export async function ingestGeotechDocument(options) {
|
|
|
917
1084
|
...options.config,
|
|
918
1085
|
timeout: pageTimeoutMs,
|
|
919
1086
|
};
|
|
1087
|
+
if (shouldPreferDirectVisualExtraction({
|
|
1088
|
+
config: options.config,
|
|
1089
|
+
page,
|
|
1090
|
+
inspectionPage,
|
|
1091
|
+
textHint: pageTextHint,
|
|
1092
|
+
})) {
|
|
1093
|
+
const context = {
|
|
1094
|
+
pageNumber: page.pageNumber,
|
|
1095
|
+
totalPages: page.totalPages,
|
|
1096
|
+
pageClassification: inspectionPage?.classification,
|
|
1097
|
+
directVisualPreferred: true,
|
|
1098
|
+
};
|
|
1099
|
+
const result = await withPageTimeout(interpretPage(page.base64, page.mimeType, pagePhaseConfig, context), pageTimeoutMs, `Page ${page.pageNumber}: direct visual page interpretation timed out after ${Math.round(pageTimeoutMs / 1000)}s`);
|
|
1100
|
+
return {
|
|
1101
|
+
ok: true,
|
|
1102
|
+
pageNumber: page.pageNumber,
|
|
1103
|
+
inspectionPage,
|
|
1104
|
+
textHintSource: 'vision-visual',
|
|
1105
|
+
recoveryWarnings: ['Skipped OCR-only transcription and used direct visual extraction for an image-heavy hosted-beta page.'],
|
|
1106
|
+
ocrRecovered: false,
|
|
1107
|
+
result,
|
|
1108
|
+
};
|
|
1109
|
+
}
|
|
920
1110
|
const recovery = await withPageTimeout(recoverDocumentTextHint({
|
|
921
1111
|
existingTextHint: pageTextHint,
|
|
922
1112
|
existingTextAccepted: inspectionPage?.normalizedArtifact?.textQuality.accepted ?? true,
|
|
@@ -952,7 +1142,7 @@ export async function ingestGeotechDocument(options) {
|
|
|
952
1142
|
inspectionPage,
|
|
953
1143
|
textHintSource,
|
|
954
1144
|
recoveryWarnings: recovery.warnings,
|
|
955
|
-
ocrRecovered: recovery.source === 'local-ocr' || recovery.source === 'vision-ocr',
|
|
1145
|
+
ocrRecovered: recovery.source === 'local-ocr' || recovery.source === 'vision-ocr' || recovery.source === 'glm-ocr',
|
|
956
1146
|
result,
|
|
957
1147
|
};
|
|
958
1148
|
}
|
|
@@ -971,7 +1161,11 @@ export async function ingestGeotechDocument(options) {
|
|
|
971
1161
|
if (settled.ok) {
|
|
972
1162
|
if (settled.ocrRecovered) {
|
|
973
1163
|
recoveredOcrPages.add(settled.pageNumber);
|
|
974
|
-
documentWarnings.push(`Recovered ${settled.textHintSource === 'local-ocr'
|
|
1164
|
+
documentWarnings.push(`Recovered ${settled.textHintSource === 'local-ocr'
|
|
1165
|
+
? 'local OCR'
|
|
1166
|
+
: settled.textHintSource === 'glm-ocr'
|
|
1167
|
+
? 'GLM-OCR layout'
|
|
1168
|
+
: 'OCR-style'} text hint for page ${settled.pageNumber}.`);
|
|
975
1169
|
}
|
|
976
1170
|
else if (settled.textHintSource === 'pdfjs-text') {
|
|
977
1171
|
documentWarnings.push(`Recovered high-fidelity PDF text for page ${settled.pageNumber} without a multimodal OCR call.`);
|
|
@@ -1038,8 +1232,11 @@ export async function ingestGeotechDocument(options) {
|
|
|
1038
1232
|
const contentChunks = buildContentChunks(pageResults, options.inspection);
|
|
1039
1233
|
const title = chooseDocumentTitle(contentChunks);
|
|
1040
1234
|
const documentClass = chooseDocumentClass(contentChunks);
|
|
1041
|
-
const
|
|
1042
|
-
|
|
1235
|
+
const lowYieldPages = new Set(contentChunks
|
|
1236
|
+
.filter((chunk) => chunk.sectionType === 'administrative' || chunk.sectionType === 'visual-appendix')
|
|
1237
|
+
.flatMap((chunk) => chunk.sourcePages));
|
|
1238
|
+
const partialAuditCount = pageAudits.filter((audit) => audit.parseStatus === 'partial' && !lowYieldPages.has(audit.pageNumber)).length;
|
|
1239
|
+
const failedAuditCount = pageAudits.filter((audit) => audit.parseStatus === 'failed' && !lowYieldPages.has(audit.pageNumber)).length;
|
|
1043
1240
|
const parseStatus = pageFailures.length > 0
|
|
1044
1241
|
? 'partial'
|
|
1045
1242
|
: mergeParseStatus(pageResults.map((result) => result.parseStatus));
|
|
@@ -1053,18 +1250,36 @@ export async function ingestGeotechDocument(options) {
|
|
|
1053
1250
|
: 100;
|
|
1054
1251
|
const confidence = Math.max(0, Math.min(confidenceCap, Math.round(baseConfidence - failurePenalty - partialPenalty)));
|
|
1055
1252
|
const reviewFindings = deriveDocumentFindings(pageResults, pageFailures, materials, classifications, parameters, options.inspection);
|
|
1253
|
+
for (const audit of pageAudits) {
|
|
1254
|
+
if (audit.textHintSource !== 'vision-visual') {
|
|
1255
|
+
continue;
|
|
1256
|
+
}
|
|
1257
|
+
reviewFindings.push({
|
|
1258
|
+
code: 'direct_visual_review_required',
|
|
1259
|
+
severity: 'review',
|
|
1260
|
+
scope: 'page',
|
|
1261
|
+
message: `Page ${audit.pageNumber} was interpreted directly from the rendered page image without accepted text or OCR transcription. Verify extracted values against the source page before approval.`,
|
|
1262
|
+
pageNumber: audit.pageNumber,
|
|
1263
|
+
});
|
|
1264
|
+
}
|
|
1056
1265
|
const reviewRequired = reviewFindings.some(findingRequiresReview);
|
|
1057
1266
|
const allPagesParsed = pageAudits.length > 0 && pageAudits.every((audit) => audit.parseStatus === 'parsed');
|
|
1058
|
-
const
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1267
|
+
const contentChunksForResult = contentChunks.map((chunk) => ({
|
|
1268
|
+
chunkId: chunk.chunkId,
|
|
1269
|
+
pageRange: chunk.pageRange,
|
|
1270
|
+
headingAncestry: chunk.headingAncestry,
|
|
1271
|
+
scope: chunk.scope,
|
|
1272
|
+
sectionType: chunk.sectionType,
|
|
1273
|
+
significance: chunk.significance,
|
|
1274
|
+
text: chunk.text,
|
|
1275
|
+
sourcePages: chunk.sourcePages,
|
|
1276
|
+
}));
|
|
1277
|
+
const generatedAt = now().toISOString();
|
|
1278
|
+
const baseResult = {
|
|
1064
1279
|
kind: 'geotech-ingest-result',
|
|
1065
1280
|
schemaVersion: 1,
|
|
1066
1281
|
documentType: 'geotech-document',
|
|
1067
|
-
generatedAt
|
|
1282
|
+
generatedAt,
|
|
1068
1283
|
source: {
|
|
1069
1284
|
...options.source,
|
|
1070
1285
|
totalPages: options.pages?.length ?? 1,
|
|
@@ -1081,19 +1296,10 @@ export async function ingestGeotechDocument(options) {
|
|
|
1081
1296
|
parameters,
|
|
1082
1297
|
risks,
|
|
1083
1298
|
recommendations,
|
|
1084
|
-
contentChunks:
|
|
1085
|
-
chunkId: chunk.chunkId,
|
|
1086
|
-
pageRange: chunk.pageRange,
|
|
1087
|
-
headingAncestry: chunk.headingAncestry,
|
|
1088
|
-
scope: chunk.scope,
|
|
1089
|
-
sectionType: chunk.sectionType,
|
|
1090
|
-
significance: chunk.significance,
|
|
1091
|
-
text: chunk.text,
|
|
1092
|
-
sourcePages: chunk.sourcePages,
|
|
1093
|
-
})),
|
|
1299
|
+
contentChunks: contentChunksForResult,
|
|
1094
1300
|
pageAudits,
|
|
1095
1301
|
pageFailures,
|
|
1096
|
-
warnings,
|
|
1302
|
+
warnings: [],
|
|
1097
1303
|
reviewFindings,
|
|
1098
1304
|
reviewReasons: summarizeReviewReasons(reviewFindings),
|
|
1099
1305
|
parseStatus,
|
|
@@ -1106,5 +1312,35 @@ export async function ingestGeotechDocument(options) {
|
|
|
1106
1312
|
&& pageFailures.length === 0
|
|
1107
1313
|
&& parameterSanitization.warnings.length === 0,
|
|
1108
1314
|
};
|
|
1315
|
+
let synthesis = null;
|
|
1316
|
+
const synthesisWarnings = [];
|
|
1317
|
+
const synthesisRunner = options.synthesizeDocument
|
|
1318
|
+
?? (process.env.NODE_ENV === 'test' ? null : synthesizeGeotechDocumentResult);
|
|
1319
|
+
if (synthesisRunner) {
|
|
1320
|
+
try {
|
|
1321
|
+
synthesis = await synthesisRunner({
|
|
1322
|
+
config: options.config,
|
|
1323
|
+
result: baseResult,
|
|
1324
|
+
});
|
|
1325
|
+
if (synthesis && synthesis.takeaways.length > 0) {
|
|
1326
|
+
synthesisWarnings.push('GLM-5.1 synthesis generated report-level takeaways from extracted page evidence.');
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
catch (error) {
|
|
1330
|
+
synthesisWarnings.push(`GLM-5.1 synthesis failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
const warnings = uniqueStrings([
|
|
1334
|
+
...documentWarnings,
|
|
1335
|
+
...parameterSanitization.warnings,
|
|
1336
|
+
...synthesisWarnings,
|
|
1337
|
+
...pageResults.flatMap((result) => result.warnings),
|
|
1338
|
+
]);
|
|
1339
|
+
return {
|
|
1340
|
+
...baseResult,
|
|
1341
|
+
summary: synthesis?.takeaways[0] ?? baseResult.summary,
|
|
1342
|
+
synthesis,
|
|
1343
|
+
warnings,
|
|
1344
|
+
};
|
|
1109
1345
|
}
|
|
1110
1346
|
//# sourceMappingURL=geotech-document.js.map
|