wiki-graph-core 0.3.1
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/LICENSE +201 -0
- package/data/editor/clue_reviewer.jinja +410 -0
- package/data/editor/clue_reviewer_generator.jinja +428 -0
- package/data/editor/revision_feedback.jinja +5 -0
- package/data/editor/text_compressor.jinja +127 -0
- package/data/guaranteed/response_intent_classifier.jinja +8 -0
- package/data/help/commands/archive/next.jinja +29 -0
- package/data/help/commands/gc.jinja +38 -0
- package/data/help/commands/legacy/migrate.jinja +20 -0
- package/data/help/commands/legacy.jinja +19 -0
- package/data/help/commands/maintenance/chapter/add.jinja +41 -0
- package/data/help/commands/maintenance/chapter/list.jinja +33 -0
- package/data/help/commands/maintenance/chapter/move.jinja +36 -0
- package/data/help/commands/maintenance/chapter/remove.jinja +26 -0
- package/data/help/commands/maintenance/chapter/reset.jinja +29 -0
- package/data/help/commands/maintenance/chapter/set-source.jinja +34 -0
- package/data/help/commands/maintenance/chapter/set-summary.jinja +31 -0
- package/data/help/commands/maintenance/chapter/set-title.jinja +29 -0
- package/data/help/commands/maintenance/chapter/tree.jinja +58 -0
- package/data/help/commands/maintenance/chapter.jinja +59 -0
- package/data/help/commands/maintenance/cover.jinja +28 -0
- package/data/help/commands/maintenance/meta.jinja +55 -0
- package/data/help/commands/predicate.jinja +460 -0
- package/data/help/commands/root.jinja +83 -0
- package/data/help/commands/transform.jinja +34 -0
- package/data/help/commands/uri.jinja +274 -0
- package/data/help/topics/config.jinja +88 -0
- package/data/help/topics/format.jinja +72 -0
- package/data/help/topics/readiness.jinja +99 -0
- package/data/help/topics/recipe.jinja +151 -0
- package/data/help/topics/runtime.jinja +62 -0
- package/data/help/topics/uri.jinja +178 -0
- package/data/output/epub/cover.xhtml.jinja +13 -0
- package/data/output/epub/nav.xhtml.jinja +12 -0
- package/data/output/epub/package.opf.xml.jinja +39 -0
- package/data/output/epub/section.xhtml.jinja +12 -0
- package/data/topologization/book_coherence_extraction.jinja +223 -0
- package/data/topologization/chunk_extraction.jinja +233 -0
- package/data/topologization/evidence_choice.jinja +38 -0
- package/data/topologization/translate_chunks.jinja +138 -0
- package/data/topologization/user_focused_extraction.jinja +378 -0
- package/dist/archive/query/archive-view.d.ts +26 -0
- package/dist/archive/query/archive-view.js +4540 -0
- package/dist/archive/query/archive-view.js.map +1 -0
- package/dist/archive/query/continuation-cursor.d.ts +61 -0
- package/dist/archive/query/continuation-cursor.js +363 -0
- package/dist/archive/query/continuation-cursor.js.map +1 -0
- package/dist/archive/query/index.d.ts +29 -0
- package/dist/archive/query/index.js +63 -0
- package/dist/archive/query/index.js.map +1 -0
- package/dist/archive/query/lexical-search.d.ts +22 -0
- package/dist/archive/query/lexical-search.js +137 -0
- package/dist/archive/query/lexical-search.js.map +1 -0
- package/dist/archive/query/search-cache.d.ts +192 -0
- package/dist/archive/query/search-cache.js +1248 -0
- package/dist/archive/query/search-cache.js.map +1 -0
- package/dist/archive/search-index/index.d.ts +26 -0
- package/dist/archive/search-index/index.js +29 -0
- package/dist/archive/search-index/index.js.map +1 -0
- package/dist/archive/search-index/search-index.d.ts +26 -0
- package/dist/archive/search-index/search-index.js +555 -0
- package/dist/archive/search-index/search-index.js.map +1 -0
- package/dist/archive/search-index/search-tokenizer.d.ts +16 -0
- package/dist/archive/search-index/search-tokenizer.js +225 -0
- package/dist/archive/search-index/search-tokenizer.js.map +1 -0
- package/dist/common/cli-command.d.ts +4 -0
- package/dist/common/cli-command.js +7 -0
- package/dist/common/cli-command.js.map +1 -0
- package/dist/common/data-dir.d.ts +3 -0
- package/dist/common/data-dir.js +48 -0
- package/dist/common/data-dir.js.map +1 -0
- package/dist/common/language.d.ts +55 -0
- package/dist/common/language.js +208 -0
- package/dist/common/language.js.map +1 -0
- package/dist/common/llm-scope.d.ts +19 -0
- package/dist/common/llm-scope.js +31 -0
- package/dist/common/llm-scope.js.map +1 -0
- package/dist/common/logging.d.ts +22 -0
- package/dist/common/logging.js +141 -0
- package/dist/common/logging.js.map +1 -0
- package/dist/common/template.d.ts +8 -0
- package/dist/common/template.js +54 -0
- package/dist/common/template.js.map +1 -0
- package/dist/common/tinyld-language.d.ts +6 -0
- package/dist/common/tinyld-language.js +34 -0
- package/dist/common/tinyld-language.js.map +1 -0
- package/dist/common/wiki-graph-dir.d.ts +10 -0
- package/dist/common/wiki-graph-dir.js +41 -0
- package/dist/common/wiki-graph-dir.js.map +1 -0
- package/dist/common/wiki-graph-temp.d.ts +6 -0
- package/dist/common/wiki-graph-temp.js +21 -0
- package/dist/common/wiki-graph-temp.js.map +1 -0
- package/dist/common/wiki-graph-uri.d.ts +28 -0
- package/dist/common/wiki-graph-uri.js +171 -0
- package/dist/common/wiki-graph-uri.js.map +1 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.js +13 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/task-context.d.ts +41 -0
- package/dist/context/task-context.js +111 -0
- package/dist/context/task-context.js.map +1 -0
- package/dist/document/database.d.ts +30 -0
- package/dist/document/database.js +273 -0
- package/dist/document/database.js.map +1 -0
- package/dist/document/document.d.ts +153 -0
- package/dist/document/document.js +615 -0
- package/dist/document/document.js.map +1 -0
- package/dist/document/fragments.d.ts +63 -0
- package/dist/document/fragments.js +371 -0
- package/dist/document/fragments.js.map +1 -0
- package/dist/document/index.d.ts +13 -0
- package/dist/document/index.js +62 -0
- package/dist/document/index.js.map +1 -0
- package/dist/document/schema.d.ts +8 -0
- package/dist/document/schema.js +472 -0
- package/dist/document/schema.js.map +1 -0
- package/dist/document/shared-state-database.d.ts +9 -0
- package/dist/document/shared-state-database.js +193 -0
- package/dist/document/shared-state-database.js.map +1 -0
- package/dist/document/stores.d.ts +203 -0
- package/dist/document/stores.js +1678 -0
- package/dist/document/stores.js.map +1 -0
- package/dist/document/text-streams.d.ts +86 -0
- package/dist/document/text-streams.js +515 -0
- package/dist/document/text-streams.js.map +1 -0
- package/dist/document/types.d.ts +148 -0
- package/dist/document/types.js +69 -0
- package/dist/document/types.js.map +1 -0
- package/dist/editor/clue.d.ts +27 -0
- package/dist/editor/clue.js +158 -0
- package/dist/editor/clue.js.map +1 -0
- package/dist/editor/compressor.d.ts +18 -0
- package/dist/editor/compressor.js +68 -0
- package/dist/editor/compressor.js.map +1 -0
- package/dist/editor/editor.d.ts +39 -0
- package/dist/editor/editor.js +253 -0
- package/dist/editor/editor.js.map +1 -0
- package/dist/editor/feedback.d.ts +16 -0
- package/dist/editor/feedback.js +104 -0
- package/dist/editor/feedback.js.map +1 -0
- package/dist/editor/index.d.ts +17 -0
- package/dist/editor/index.js +5 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/editor/language-review.d.ts +14 -0
- package/dist/editor/language-review.js +35 -0
- package/dist/editor/language-review.js.map +1 -0
- package/dist/editor/log.d.ts +37 -0
- package/dist/editor/log.js +202 -0
- package/dist/editor/log.js.map +1 -0
- package/dist/editor/markup.d.ts +20 -0
- package/dist/editor/markup.js +294 -0
- package/dist/editor/markup.js.map +1 -0
- package/dist/editor/prompt-templates.d.ts +6 -0
- package/dist/editor/prompt-templates.js +11 -0
- package/dist/editor/prompt-templates.js.map +1 -0
- package/dist/editor/response.d.ts +5 -0
- package/dist/editor/response.js +31 -0
- package/dist/editor/response.js.map +1 -0
- package/dist/editor/review.d.ts +34 -0
- package/dist/editor/review.js +189 -0
- package/dist/editor/review.js.map +1 -0
- package/dist/editor/types.d.ts +31 -0
- package/dist/editor/types.js +21 -0
- package/dist/editor/types.js.map +1 -0
- package/dist/evidence-selection/anchor-resolver.d.ts +43 -0
- package/dist/evidence-selection/anchor-resolver.js +783 -0
- package/dist/evidence-selection/anchor-resolver.js.map +1 -0
- package/dist/evidence-selection/anchor-types.d.ts +27 -0
- package/dist/evidence-selection/anchor-types.js +1 -0
- package/dist/evidence-selection/anchor-types.js.map +1 -0
- package/dist/evidence-selection/index.d.ts +8 -0
- package/dist/evidence-selection/index.js +32 -0
- package/dist/evidence-selection/index.js.map +1 -0
- package/dist/evidence-selection/prompt.d.ts +18 -0
- package/dist/evidence-selection/prompt.js +54 -0
- package/dist/evidence-selection/prompt.js.map +1 -0
- package/dist/evidence-selection/quote-score.d.ts +29 -0
- package/dist/evidence-selection/quote-score.js +331 -0
- package/dist/evidence-selection/quote-score.js.map +1 -0
- package/dist/evidence-selection/selection-resolver.d.ts +19 -0
- package/dist/evidence-selection/selection-resolver.js +303 -0
- package/dist/evidence-selection/selection-resolver.js.map +1 -0
- package/dist/evidence-selection/text.d.ts +4 -0
- package/dist/evidence-selection/text.js +66 -0
- package/dist/evidence-selection/text.js.map +1 -0
- package/dist/evidence-selection/types.d.ts +36 -0
- package/dist/evidence-selection/types.js +1 -0
- package/dist/evidence-selection/types.js.map +1 -0
- package/dist/facade/app.d.ts +75 -0
- package/dist/facade/app.js +141 -0
- package/dist/facade/app.js.map +1 -0
- package/dist/facade/build-queue.d.ts +181 -0
- package/dist/facade/build-queue.js +1442 -0
- package/dist/facade/build-queue.js.map +1 -0
- package/dist/facade/chapter-build.d.ts +60 -0
- package/dist/facade/chapter-build.js +1020 -0
- package/dist/facade/chapter-build.js.map +1 -0
- package/dist/facade/chapter.d.ts +168 -0
- package/dist/facade/chapter.js +944 -0
- package/dist/facade/chapter.js.map +1 -0
- package/dist/facade/digest.d.ts +55 -0
- package/dist/facade/digest.js +168 -0
- package/dist/facade/digest.js.map +1 -0
- package/dist/facade/graph.d.ts +60 -0
- package/dist/facade/graph.js +203 -0
- package/dist/facade/graph.js.map +1 -0
- package/dist/facade/import.d.ts +49 -0
- package/dist/facade/import.js +262 -0
- package/dist/facade/import.js.map +1 -0
- package/dist/facade/index.d.ts +39 -0
- package/dist/facade/index.js +171 -0
- package/dist/facade/index.js.map +1 -0
- package/dist/facade/knowledge-graph-build.d.ts +75 -0
- package/dist/facade/knowledge-graph-build.js +897 -0
- package/dist/facade/knowledge-graph-build.js.map +1 -0
- package/dist/facade/llm-sampling.d.ts +11 -0
- package/dist/facade/llm-sampling.js +58 -0
- package/dist/facade/llm-sampling.js.map +1 -0
- package/dist/facade/types.d.ts +8 -0
- package/dist/facade/types.js +1 -0
- package/dist/facade/types.js.map +1 -0
- package/dist/facade/wiki-graph-archive.d.ts +41 -0
- package/dist/facade/wiki-graph-archive.js +130 -0
- package/dist/facade/wiki-graph-archive.js.map +1 -0
- package/dist/gc/files.d.ts +15 -0
- package/dist/gc/files.js +141 -0
- package/dist/gc/files.js.map +1 -0
- package/dist/gc/index.d.ts +2 -0
- package/dist/gc/index.js +5 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/gc/lock.d.ts +3 -0
- package/dist/gc/lock.js +137 -0
- package/dist/gc/lock.js.map +1 -0
- package/dist/gc/runner.d.ts +9 -0
- package/dist/gc/runner.js +129 -0
- package/dist/gc/runner.js.map +1 -0
- package/dist/gc/tmp-gc.d.ts +5 -0
- package/dist/gc/tmp-gc.js +57 -0
- package/dist/gc/tmp-gc.js.map +1 -0
- package/dist/gc/types.d.ts +24 -0
- package/dist/gc/types.js +1 -0
- package/dist/gc/types.js.map +1 -0
- package/dist/gc.cjs +10041 -0
- package/dist/gc.cjs.map +1 -0
- package/dist/gc.d.cts +10 -0
- package/dist/gc.d.ts +2 -0
- package/dist/gc.js +5 -0
- package/dist/gc.js.map +1 -0
- package/dist/guaranteed/classifier.d.ts +10 -0
- package/dist/guaranteed/classifier.js +88 -0
- package/dist/guaranteed/classifier.js.map +1 -0
- package/dist/guaranteed/errors.d.ts +38 -0
- package/dist/guaranteed/errors.js +73 -0
- package/dist/guaranteed/errors.js.map +1 -0
- package/dist/guaranteed/index.d.ts +7 -0
- package/dist/guaranteed/index.js +21 -0
- package/dist/guaranteed/index.js.map +1 -0
- package/dist/guaranteed/request.d.ts +8 -0
- package/dist/guaranteed/request.js +206 -0
- package/dist/guaranteed/request.js.map +1 -0
- package/dist/guaranteed/response.d.ts +12 -0
- package/dist/guaranteed/response.js +98 -0
- package/dist/guaranteed/response.js.map +1 -0
- package/dist/guaranteed/types.d.ts +20 -0
- package/dist/guaranteed/types.js +1 -0
- package/dist/guaranteed/types.js.map +1 -0
- package/dist/index-B8NNnQ8P.d.ts +424 -0
- package/dist/index.cjs +34774 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2462 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +168 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy-sdpub/upgrade.d.ts +7 -0
- package/dist/legacy-sdpub/upgrade.js +795 -0
- package/dist/legacy-sdpub/upgrade.js.map +1 -0
- package/dist/llm/cache.d.ts +13 -0
- package/dist/llm/cache.js +35 -0
- package/dist/llm/cache.js.map +1 -0
- package/dist/llm/client.d.ts +26 -0
- package/dist/llm/client.js +572 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/context.d.ts +22 -0
- package/dist/llm/context.js +78 -0
- package/dist/llm/context.js.map +1 -0
- package/dist/llm/errors.d.ts +7 -0
- package/dist/llm/errors.js +12 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.js +17 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/request-log.d.ts +9 -0
- package/dist/llm/request-log.js +35 -0
- package/dist/llm/request-log.js.map +1 -0
- package/dist/llm/sampling.d.ts +11 -0
- package/dist/llm/sampling.js +67 -0
- package/dist/llm/sampling.js.map +1 -0
- package/dist/llm/types.d.ts +50 -0
- package/dist/llm/types.js +1 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/output/epub/archive.d.ts +9 -0
- package/dist/output/epub/archive.js +81 -0
- package/dist/output/epub/archive.js.map +1 -0
- package/dist/output/epub/book.d.ts +15 -0
- package/dist/output/epub/book.js +76 -0
- package/dist/output/epub/book.js.map +1 -0
- package/dist/output/epub/content.d.ts +9 -0
- package/dist/output/epub/content.js +35 -0
- package/dist/output/epub/content.js.map +1 -0
- package/dist/output/epub/index.d.ts +20 -0
- package/dist/output/epub/index.js +14 -0
- package/dist/output/epub/index.js.map +1 -0
- package/dist/output/epub/model.d.ts +24 -0
- package/dist/output/epub/model.js +1 -0
- package/dist/output/epub/model.js.map +1 -0
- package/dist/output/epub/navigation.d.ts +10 -0
- package/dist/output/epub/navigation.js +39 -0
- package/dist/output/epub/navigation.js.map +1 -0
- package/dist/output/epub/package.d.ts +17 -0
- package/dist/output/epub/package.js +29 -0
- package/dist/output/epub/package.js.map +1 -0
- package/dist/output/epub/shared.d.ts +4 -0
- package/dist/output/epub/shared.js +12 -0
- package/dist/output/epub/shared.js.map +1 -0
- package/dist/output/epub/templates.d.ts +35 -0
- package/dist/output/epub/templates.js +26 -0
- package/dist/output/epub/templates.js.map +1 -0
- package/dist/output/index.d.ts +14 -0
- package/dist/output/index.js +11 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/plain-text.d.ts +18 -0
- package/dist/output/plain-text.js +56 -0
- package/dist/output/plain-text.js.map +1 -0
- package/dist/progress/index.d.ts +3 -0
- package/dist/progress/index.js +14 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/progress/reporter.d.ts +10 -0
- package/dist/progress/reporter.js +79 -0
- package/dist/progress/reporter.js.map +1 -0
- package/dist/progress/tracker.d.ts +37 -0
- package/dist/progress/tracker.js +119 -0
- package/dist/progress/tracker.js.map +1 -0
- package/dist/progress/types.d.ts +28 -0
- package/dist/progress/types.js +1 -0
- package/dist/progress/types.js.map +1 -0
- package/dist/reader/attention/attention.d.ts +39 -0
- package/dist/reader/attention/attention.js +123 -0
- package/dist/reader/attention/attention.js.map +1 -0
- package/dist/reader/attention/index.d.ts +9 -0
- package/dist/reader/attention/index.js +5 -0
- package/dist/reader/attention/index.js.map +1 -0
- package/dist/reader/attention/wave-reflection.d.ts +21 -0
- package/dist/reader/attention/wave-reflection.js +153 -0
- package/dist/reader/attention/wave-reflection.js.map +1 -0
- package/dist/reader/attention/working-memory.d.ts +28 -0
- package/dist/reader/attention/working-memory.js +62 -0
- package/dist/reader/attention/working-memory.js.map +1 -0
- package/dist/reader/chunk-batch/extract.d.ts +13 -0
- package/dist/reader/chunk-batch/extract.js +14 -0
- package/dist/reader/chunk-batch/extract.js.map +1 -0
- package/dist/reader/chunk-batch/extractor.d.ts +17 -0
- package/dist/reader/chunk-batch/extractor.js +337 -0
- package/dist/reader/chunk-batch/extractor.js.map +1 -0
- package/dist/reader/chunk-batch/fragment-projection.d.ts +34 -0
- package/dist/reader/chunk-batch/fragment-projection.js +94 -0
- package/dist/reader/chunk-batch/fragment-projection.js.map +1 -0
- package/dist/reader/chunk-batch/index.d.ts +12 -0
- package/dist/reader/chunk-batch/index.js +13 -0
- package/dist/reader/chunk-batch/index.js.map +1 -0
- package/dist/reader/chunk-batch/language.d.ts +9 -0
- package/dist/reader/chunk-batch/language.js +23 -0
- package/dist/reader/chunk-batch/language.js.map +1 -0
- package/dist/reader/chunk-batch/parser.d.ts +94 -0
- package/dist/reader/chunk-batch/parser.js +640 -0
- package/dist/reader/chunk-batch/parser.js.map +1 -0
- package/dist/reader/chunk-batch/prompt-templates.d.ts +6 -0
- package/dist/reader/chunk-batch/prompt-templates.js +11 -0
- package/dist/reader/chunk-batch/prompt-templates.js.map +1 -0
- package/dist/reader/chunk-batch/types.d.ts +85 -0
- package/dist/reader/chunk-batch/types.js +1 -0
- package/dist/reader/chunk-batch/types.js.map +1 -0
- package/dist/reader/index.d.ts +13 -0
- package/dist/reader/index.js +7 -0
- package/dist/reader/index.js.map +1 -0
- package/dist/reader/reader.d.ts +37 -0
- package/dist/reader/reader.js +82 -0
- package/dist/reader/reader.js.map +1 -0
- package/dist/reader/segment/index.d.ts +2 -0
- package/dist/reader/segment/index.js +5 -0
- package/dist/reader/segment/index.js.map +1 -0
- package/dist/reader/segment/intl-segmenter.d.ts +5 -0
- package/dist/reader/segment/intl-segmenter.js +102 -0
- package/dist/reader/segment/intl-segmenter.js.map +1 -0
- package/dist/reader/segment/segment.d.ts +5 -0
- package/dist/reader/segment/segment.js +9 -0
- package/dist/reader/segment/segment.js.map +1 -0
- package/dist/reader/segment/types.d.ts +14 -0
- package/dist/reader/segment/types.js +1 -0
- package/dist/reader/segment/types.js.map +1 -0
- package/dist/reader/types.d.ts +29 -0
- package/dist/reader/types.js +1 -0
- package/dist/reader/types.js.map +1 -0
- package/dist/serial.d.ts +89 -0
- package/dist/serial.js +476 -0
- package/dist/serial.js.map +1 -0
- package/dist/source/adapter.d.ts +15 -0
- package/dist/source/adapter.js +1 -0
- package/dist/source/adapter.js.map +1 -0
- package/dist/source/epub/archive.d.ts +27 -0
- package/dist/source/epub/archive.js +189 -0
- package/dist/source/epub/archive.js.map +1 -0
- package/dist/source/epub/content.d.ts +22 -0
- package/dist/source/epub/content.js +183 -0
- package/dist/source/epub/content.js.map +1 -0
- package/dist/source/epub/document.d.ts +55 -0
- package/dist/source/epub/document.js +179 -0
- package/dist/source/epub/document.js.map +1 -0
- package/dist/source/epub/index.d.ts +10 -0
- package/dist/source/epub/index.js +6 -0
- package/dist/source/epub/index.js.map +1 -0
- package/dist/source/epub/navigation.d.ts +16 -0
- package/dist/source/epub/navigation.js +215 -0
- package/dist/source/epub/navigation.js.map +1 -0
- package/dist/source/epub/package.d.ts +33 -0
- package/dist/source/epub/package.js +237 -0
- package/dist/source/epub/package.js.map +1 -0
- package/dist/source/epub/xml.d.ts +16 -0
- package/dist/source/epub/xml.js +111 -0
- package/dist/source/epub/xml.js.map +1 -0
- package/dist/source/index.d.ts +12 -0
- package/dist/source/index.js +32 -0
- package/dist/source/index.js.map +1 -0
- package/dist/source/meta.d.ts +30 -0
- package/dist/source/meta.js +22 -0
- package/dist/source/meta.js.map +1 -0
- package/dist/source/plain-text.d.ts +16 -0
- package/dist/source/plain-text.js +86 -0
- package/dist/source/plain-text.js.map +1 -0
- package/dist/source/toc.d.ts +16 -0
- package/dist/source/toc.js +17 -0
- package/dist/source/toc.js.map +1 -0
- package/dist/source/types.d.ts +16 -0
- package/dist/source/types.js +1 -0
- package/dist/source/types.js.map +1 -0
- package/dist/topology/grouping.d.ts +15 -0
- package/dist/topology/grouping.js +18 -0
- package/dist/topology/grouping.js.map +1 -0
- package/dist/topology/index.d.ts +21 -0
- package/dist/topology/index.js +5 -0
- package/dist/topology/index.js.map +1 -0
- package/dist/topology/resource-segmentation.d.ts +13 -0
- package/dist/topology/resource-segmentation.js +111 -0
- package/dist/topology/resource-segmentation.js.map +1 -0
- package/dist/topology/segment-incision.d.ts +18 -0
- package/dist/topology/segment-incision.js +197 -0
- package/dist/topology/segment-incision.js.map +1 -0
- package/dist/topology/snake-detector.d.ts +13 -0
- package/dist/topology/snake-detector.js +520 -0
- package/dist/topology/snake-detector.js.map +1 -0
- package/dist/topology/snake-graph-builder.d.ts +14 -0
- package/dist/topology/snake-graph-builder.js +76 -0
- package/dist/topology/snake-graph-builder.js.map +1 -0
- package/dist/topology/topology.d.ts +29 -0
- package/dist/topology/topology.js +348 -0
- package/dist/topology/topology.js.map +1 -0
- package/dist/topology/weights.d.ts +10 -0
- package/dist/topology/weights.js +84 -0
- package/dist/topology/weights.js.map +1 -0
- package/dist/types-FVIqiLC9.d.cts +24 -0
- package/dist/utils/async-semaphore.d.ts +7 -0
- package/dist/utils/async-semaphore.js +40 -0
- package/dist/utils/async-semaphore.js.map +1 -0
- package/dist/utils/enum.d.ts +5 -0
- package/dist/utils/enum.js +18 -0
- package/dist/utils/enum.js.map +1 -0
- package/dist/utils/hash.d.ts +3 -0
- package/dist/utils/hash.js +132 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/node-error.d.ts +4 -0
- package/dist/utils/node-error.js +59 -0
- package/dist/utils/node-error.js.map +1 -0
- package/dist/wikg/archive-uri.d.ts +1 -0
- package/dist/wikg/archive-uri.js +37 -0
- package/dist/wikg/archive-uri.js.map +1 -0
- package/dist/wikg/archive.d.ts +28 -0
- package/dist/wikg/archive.js +496 -0
- package/dist/wikg/archive.js.map +1 -0
- package/dist/wikg/index.d.ts +31 -0
- package/dist/wikg/index.js +60 -0
- package/dist/wikg/index.js.map +1 -0
- package/dist/wikg/wikg-coordinator.d.ts +45 -0
- package/dist/wikg/wikg-coordinator.js +1687 -0
- package/dist/wikg/wikg-coordinator.js.map +1 -0
- package/dist/wikg/wiki-graph-archive-file.d.ts +42 -0
- package/dist/wikg/wiki-graph-archive-file.js +78 -0
- package/dist/wikg/wiki-graph-archive-file.js.map +1 -0
- package/dist/wikilink/index.d.ts +10 -0
- package/dist/wikilink/index.js +7 -0
- package/dist/wikilink/index.js.map +1 -0
- package/dist/wikilink/relation-discovery.d.ts +31 -0
- package/dist/wikilink/relation-discovery.js +477 -0
- package/dist/wikilink/relation-discovery.js.map +1 -0
- package/dist/wikilink/types.d.ts +23 -0
- package/dist/wikilink/types.js +1 -0
- package/dist/wikilink/types.js.map +1 -0
- package/dist/wikilink/window.d.ts +7 -0
- package/dist/wikilink/window.js +53 -0
- package/dist/wikilink/window.js.map +1 -0
- package/dist/wikimatch/enrichment.d.ts +10 -0
- package/dist/wikimatch/enrichment.js +55 -0
- package/dist/wikimatch/enrichment.js.map +1 -0
- package/dist/wikimatch/index.d.ts +16 -0
- package/dist/wikimatch/index.js +66 -0
- package/dist/wikimatch/index.js.map +1 -0
- package/dist/wikimatch/option-narrowing.d.ts +17 -0
- package/dist/wikimatch/option-narrowing.js +208 -0
- package/dist/wikimatch/option-narrowing.js.map +1 -0
- package/dist/wikimatch/options.d.ts +14 -0
- package/dist/wikimatch/options.js +155 -0
- package/dist/wikimatch/options.js.map +1 -0
- package/dist/wikimatch/policy-judge.d.ts +17 -0
- package/dist/wikimatch/policy-judge.js +430 -0
- package/dist/wikimatch/policy-judge.js.map +1 -0
- package/dist/wikimatch/range-suppression.d.ts +9 -0
- package/dist/wikimatch/range-suppression.js +27 -0
- package/dist/wikimatch/range-suppression.js.map +1 -0
- package/dist/wikimatch/surface-screening.d.ts +16 -0
- package/dist/wikimatch/surface-screening.js +168 -0
- package/dist/wikimatch/surface-screening.js.map +1 -0
- package/dist/wikimatch/surface-window.d.ts +6 -0
- package/dist/wikimatch/surface-window.js +44 -0
- package/dist/wikimatch/surface-window.js.map +1 -0
- package/dist/wikimatch/types.d.ts +151 -0
- package/dist/wikimatch/types.js +1 -0
- package/dist/wikimatch/types.js.map +1 -0
- package/dist/wikimatch/wikispine.d.ts +43 -0
- package/dist/wikimatch/wikispine.js +399 -0
- package/dist/wikimatch/wikispine.js.map +1 -0
- package/dist/wikimatch/window.d.ts +6 -0
- package/dist/wikimatch/window.js +83 -0
- package/dist/wikimatch/window.js.map +1 -0
- package/dist/wikimatch/words.d.ts +16 -0
- package/dist/wikimatch/words.js +66 -0
- package/dist/wikimatch/words.js.map +1 -0
- package/dist/wikipage/cache.d.ts +18 -0
- package/dist/wikipage/cache.js +404 -0
- package/dist/wikipage/cache.js.map +1 -0
- package/dist/wikipage/fetch-log.d.ts +17 -0
- package/dist/wikipage/fetch-log.js +143 -0
- package/dist/wikipage/fetch-log.js.map +1 -0
- package/dist/wikipage/index.d.ts +14 -0
- package/dist/wikipage/index.js +17 -0
- package/dist/wikipage/index.js.map +1 -0
- package/dist/wikipage/normalizer.d.ts +14 -0
- package/dist/wikipage/normalizer.js +147 -0
- package/dist/wikipage/normalizer.js.map +1 -0
- package/dist/wikipage/rate-limiter.d.ts +13 -0
- package/dist/wikipage/rate-limiter.js +84 -0
- package/dist/wikipage/rate-limiter.js.map +1 -0
- package/dist/wikipage/resolver.d.ts +26 -0
- package/dist/wikipage/resolver.js +325 -0
- package/dist/wikipage/resolver.js.map +1 -0
- package/dist/wikipage/types.d.ts +96 -0
- package/dist/wikipage/types.js +1 -0
- package/dist/wikipage/types.js.map +1 -0
- package/dist/wikipage/wikimedia-client.d.ts +48 -0
- package/dist/wikipage/wikimedia-client.js +397 -0
- package/dist/wikipage/wikimedia-client.js.map +1 -0
- package/dist/worker-BgQ0Xl8T.d.cts +181 -0
- package/dist/worker.cjs +5259 -0
- package/dist/worker.cjs.map +1 -0
- package/dist/worker.d.cts +2 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.js +5 -0
- package/dist/worker.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,572 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, statSync } from "fs";
|
|
2
|
+
import { resolve } from "path";
|
|
3
|
+
import { setTimeout as sleep } from "timers/promises";
|
|
4
|
+
import {
|
|
5
|
+
APICallError,
|
|
6
|
+
generateText,
|
|
7
|
+
streamText
|
|
8
|
+
} from "ai";
|
|
9
|
+
import { getLogger } from "../common/logging.js";
|
|
10
|
+
import { createEnv } from "../common/template.js";
|
|
11
|
+
import { AsyncSemaphore } from "../utils/async-semaphore.js";
|
|
12
|
+
import { createHash } from "../utils/hash.js";
|
|
13
|
+
import { formatError } from "../utils/node-error.js";
|
|
14
|
+
import { LLMCache } from "./cache.js";
|
|
15
|
+
import { LLMContext } from "./context.js";
|
|
16
|
+
import { LLMPaymentRequiredError } from "./errors.js";
|
|
17
|
+
import { createRequestLog } from "./request-log.js";
|
|
18
|
+
import { getScopeDefaults, resolveSamplingSetting } from "./sampling.js";
|
|
19
|
+
const DEFAULT_TIMEOUT_MS = 36e4;
|
|
20
|
+
const DEFAULT_CONCURRENT_REQUESTS = 6;
|
|
21
|
+
const ABORT_ERROR_NAMES = /* @__PURE__ */ new Set([
|
|
22
|
+
"AbortError",
|
|
23
|
+
"ResponseAborted",
|
|
24
|
+
"TimeoutError"
|
|
25
|
+
]);
|
|
26
|
+
const RETRYABLE_HTTP_STATUS_CODES = /* @__PURE__ */ new Set([
|
|
27
|
+
408,
|
|
28
|
+
409,
|
|
29
|
+
425,
|
|
30
|
+
429,
|
|
31
|
+
500,
|
|
32
|
+
502,
|
|
33
|
+
503,
|
|
34
|
+
504,
|
|
35
|
+
520,
|
|
36
|
+
522,
|
|
37
|
+
524,
|
|
38
|
+
529
|
|
39
|
+
]);
|
|
40
|
+
const RETRYABLE_ERROR_CODES = /* @__PURE__ */ new Set([
|
|
41
|
+
"ECONNRESET",
|
|
42
|
+
"ECONNREFUSED",
|
|
43
|
+
"EAI_AGAIN",
|
|
44
|
+
"ETIMEDOUT",
|
|
45
|
+
"EPIPE",
|
|
46
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
47
|
+
"UND_ERR_HEADERS_TIMEOUT",
|
|
48
|
+
"UND_ERR_SOCKET"
|
|
49
|
+
]);
|
|
50
|
+
const RETRYABLE_ERROR_KEYWORDS = [
|
|
51
|
+
"connection",
|
|
52
|
+
"terminated",
|
|
53
|
+
"timeout",
|
|
54
|
+
"network",
|
|
55
|
+
"rate limit"
|
|
56
|
+
];
|
|
57
|
+
let contextIdCounter = 0;
|
|
58
|
+
class LLM {
|
|
59
|
+
#cache;
|
|
60
|
+
#lazyRequestLimiter;
|
|
61
|
+
#logDirPath;
|
|
62
|
+
#model;
|
|
63
|
+
#modelProvider;
|
|
64
|
+
#modelId;
|
|
65
|
+
#modelIdentity;
|
|
66
|
+
#onStreamProgress;
|
|
67
|
+
#onTokenUsage;
|
|
68
|
+
#requestLimiter;
|
|
69
|
+
#retryIntervalSeconds;
|
|
70
|
+
#retryTimes;
|
|
71
|
+
#sampling;
|
|
72
|
+
#stream;
|
|
73
|
+
#templateEnvironment;
|
|
74
|
+
#temperature;
|
|
75
|
+
#timeoutMs;
|
|
76
|
+
#topP;
|
|
77
|
+
config;
|
|
78
|
+
constructor(options) {
|
|
79
|
+
const concurrent = options.concurrent ?? DEFAULT_CONCURRENT_REQUESTS;
|
|
80
|
+
const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
81
|
+
const temperature = options.temperature ?? 0.6;
|
|
82
|
+
const topP = options.topP ?? 0.6;
|
|
83
|
+
const sampling = options.sampling;
|
|
84
|
+
const stream = options.stream ?? false;
|
|
85
|
+
const modelInfo = resolveModelInfo(options.model);
|
|
86
|
+
this.config = Object.freeze({
|
|
87
|
+
concurrent,
|
|
88
|
+
modelId: modelInfo.modelId,
|
|
89
|
+
temperature,
|
|
90
|
+
stream,
|
|
91
|
+
timeout,
|
|
92
|
+
topP,
|
|
93
|
+
...modelInfo.provider === void 0 ? {} : { provider: modelInfo.provider },
|
|
94
|
+
...sampling === void 0 ? {} : { sampling }
|
|
95
|
+
});
|
|
96
|
+
this.#cache = createCache(options.cacheDirPath);
|
|
97
|
+
this.#lazyRequestLimiter = new AsyncSemaphore(concurrent);
|
|
98
|
+
this.#logDirPath = ensureDirectoryPath(options.logDirPath);
|
|
99
|
+
this.#model = options.model;
|
|
100
|
+
this.#modelProvider = modelInfo.provider;
|
|
101
|
+
this.#modelId = modelInfo.modelId;
|
|
102
|
+
this.#modelIdentity = modelInfo.identity;
|
|
103
|
+
this.#onStreamProgress = options.onStreamProgress;
|
|
104
|
+
this.#onTokenUsage = options.onTokenUsage;
|
|
105
|
+
this.#requestLimiter = new AsyncSemaphore(concurrent);
|
|
106
|
+
this.#retryIntervalSeconds = options.retryIntervalSeconds ?? 6;
|
|
107
|
+
this.#retryTimes = options.retryTimes ?? 5;
|
|
108
|
+
this.#sampling = sampling;
|
|
109
|
+
this.#stream = stream;
|
|
110
|
+
this.#templateEnvironment = createEnv(options.dataDirPath);
|
|
111
|
+
this.#temperature = temperature;
|
|
112
|
+
this.#timeoutMs = timeout;
|
|
113
|
+
this.#topP = topP;
|
|
114
|
+
}
|
|
115
|
+
context() {
|
|
116
|
+
contextIdCounter += 1;
|
|
117
|
+
const sessionId = contextIdCounter;
|
|
118
|
+
return new LLMContext(
|
|
119
|
+
sessionId,
|
|
120
|
+
async (input) => await this.#requestWithSession({
|
|
121
|
+
...input.options,
|
|
122
|
+
messages: input.messages,
|
|
123
|
+
sessionId,
|
|
124
|
+
...input.logFiles === void 0 ? {} : { logFiles: input.logFiles },
|
|
125
|
+
...input.pendingCacheEntries === void 0 ? {} : { pendingCacheEntries: input.pendingCacheEntries }
|
|
126
|
+
}),
|
|
127
|
+
this.#cache
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
async withContext(operation) {
|
|
131
|
+
return await this.context().run(operation);
|
|
132
|
+
}
|
|
133
|
+
async request(input, options = {}) {
|
|
134
|
+
if (typeof input === "function") {
|
|
135
|
+
return await this.#lazyRequestLimiter.use(
|
|
136
|
+
async () => await input(this.#requestOnce)
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
return await this.#requestOnce(input, options);
|
|
140
|
+
}
|
|
141
|
+
#requestOnce = async (messages, options = {}) => await this.#requestWithSession({
|
|
142
|
+
messages,
|
|
143
|
+
...options
|
|
144
|
+
});
|
|
145
|
+
loadSystemPrompt(templateName, templateContext = {}) {
|
|
146
|
+
return this.#templateEnvironment.render(templateName, templateContext);
|
|
147
|
+
}
|
|
148
|
+
async #requestWithSession(input) {
|
|
149
|
+
const defaultSampling = getScopeDefaults(
|
|
150
|
+
input.scope,
|
|
151
|
+
this.#sampling,
|
|
152
|
+
this.#temperature,
|
|
153
|
+
this.#topP
|
|
154
|
+
);
|
|
155
|
+
const temperature = input.temperature ?? defaultSampling.temperature;
|
|
156
|
+
const topP = input.topP ?? defaultSampling.topP;
|
|
157
|
+
const resolvedTemperature = resolveSamplingSetting(
|
|
158
|
+
temperature,
|
|
159
|
+
"temperature",
|
|
160
|
+
input.retryIndex,
|
|
161
|
+
input.retryMax
|
|
162
|
+
);
|
|
163
|
+
const resolvedTopP = resolveSamplingSetting(
|
|
164
|
+
topP,
|
|
165
|
+
"top_p",
|
|
166
|
+
input.retryIndex,
|
|
167
|
+
input.retryMax
|
|
168
|
+
);
|
|
169
|
+
const useCache = (input.useCache ?? true) && hasVisibleNonSystemContent(input.messages);
|
|
170
|
+
const cacheKey = this.#cache !== void 0 && useCache ? createHash({
|
|
171
|
+
messages: input.messages.map((message) => ({
|
|
172
|
+
content: message.content,
|
|
173
|
+
role: message.role
|
|
174
|
+
})),
|
|
175
|
+
modelId: this.#modelId,
|
|
176
|
+
provider: this.#modelProvider ?? null,
|
|
177
|
+
temperature: resolvedTemperature ?? null,
|
|
178
|
+
topP: resolvedTopP ?? null
|
|
179
|
+
}) : void 0;
|
|
180
|
+
const requestLog = createRequestLog(this.#logDirPath);
|
|
181
|
+
if (requestLog.filePath !== void 0 && input.logFiles !== void 0) {
|
|
182
|
+
input.logFiles.push(requestLog.filePath);
|
|
183
|
+
}
|
|
184
|
+
await requestLog.append(
|
|
185
|
+
formatRequestParameters({
|
|
186
|
+
cacheKey,
|
|
187
|
+
modelId: this.#modelId,
|
|
188
|
+
modelIdentity: this.#modelIdentity,
|
|
189
|
+
modelProvider: this.#modelProvider,
|
|
190
|
+
resolvedTemperature,
|
|
191
|
+
resolvedTopP,
|
|
192
|
+
retryIndex: input.retryIndex,
|
|
193
|
+
retryMax: input.retryMax,
|
|
194
|
+
scope: input.scope,
|
|
195
|
+
sessionId: input.sessionId,
|
|
196
|
+
temperature,
|
|
197
|
+
topP
|
|
198
|
+
})
|
|
199
|
+
);
|
|
200
|
+
await requestLog.append(formatRequestMessages(input.messages));
|
|
201
|
+
if (cacheKey !== void 0 && this.#cache !== void 0 && useCache) {
|
|
202
|
+
const cachedResponse = await this.#cache.read(cacheKey);
|
|
203
|
+
if (cachedResponse !== void 0) {
|
|
204
|
+
getLogger({
|
|
205
|
+
component: "llm",
|
|
206
|
+
scope: input.scope,
|
|
207
|
+
sessionId: input.sessionId
|
|
208
|
+
}).info(
|
|
209
|
+
`[Cache Hit] Using cached response (key: ${cacheKey.slice(0, 12)}...)`
|
|
210
|
+
);
|
|
211
|
+
await requestLog.append(
|
|
212
|
+
`[[Response]] (from cache):
|
|
213
|
+
${cachedResponse}
|
|
214
|
+
|
|
215
|
+
`
|
|
216
|
+
);
|
|
217
|
+
await requestLog.append(formatRequestResultLog("cache-hit"));
|
|
218
|
+
return cachedResponse;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
let response;
|
|
222
|
+
let tokenUsage;
|
|
223
|
+
let lastError;
|
|
224
|
+
for (let attempt = 0; attempt <= this.#retryTimes; attempt += 1) {
|
|
225
|
+
try {
|
|
226
|
+
response = await this.#requestLimiter.use(async () => {
|
|
227
|
+
const generationInput = normalizeGenerationInput({
|
|
228
|
+
maxRetries: 0,
|
|
229
|
+
messages: [...input.messages],
|
|
230
|
+
model: this.#model,
|
|
231
|
+
timeout: this.#timeoutMs
|
|
232
|
+
});
|
|
233
|
+
if (input.signal !== void 0) {
|
|
234
|
+
generationInput.abortSignal = input.signal;
|
|
235
|
+
}
|
|
236
|
+
if (resolvedTemperature !== void 0) {
|
|
237
|
+
generationInput.temperature = resolvedTemperature;
|
|
238
|
+
}
|
|
239
|
+
if (resolvedTopP !== void 0) {
|
|
240
|
+
generationInput.topP = resolvedTopP;
|
|
241
|
+
}
|
|
242
|
+
if (this.#stream) {
|
|
243
|
+
const textChunks = [];
|
|
244
|
+
const result = streamText(generationInput);
|
|
245
|
+
for await (const chunk of result.textStream) {
|
|
246
|
+
textChunks.push(chunk);
|
|
247
|
+
await this.#emitStreamProgress(chunk.length);
|
|
248
|
+
}
|
|
249
|
+
tokenUsage = await result.totalUsage;
|
|
250
|
+
await this.#emitTokenUsage(tokenUsage);
|
|
251
|
+
return textChunks.join("");
|
|
252
|
+
} else {
|
|
253
|
+
const result = await generateText(generationInput);
|
|
254
|
+
tokenUsage = result.usage;
|
|
255
|
+
await this.#emitStreamProgress(result.text.length);
|
|
256
|
+
await this.#emitTokenUsage(tokenUsage);
|
|
257
|
+
return result.text;
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
await requestLog.append(`[[Response]]:
|
|
261
|
+
${response}
|
|
262
|
+
|
|
263
|
+
`);
|
|
264
|
+
break;
|
|
265
|
+
} catch (error) {
|
|
266
|
+
lastError = error;
|
|
267
|
+
if (isPaymentRequiredError(error)) {
|
|
268
|
+
const paymentError = new LLMPaymentRequiredError(void 0, {
|
|
269
|
+
cause: error
|
|
270
|
+
});
|
|
271
|
+
await requestLog.append(
|
|
272
|
+
`[[Error]]:
|
|
273
|
+
${formatError(paymentError)}
|
|
274
|
+
|
|
275
|
+
`
|
|
276
|
+
);
|
|
277
|
+
await requestLog.append(formatRequestResultLog(tokenUsage, error));
|
|
278
|
+
throw paymentError;
|
|
279
|
+
}
|
|
280
|
+
if (!isRetryableError(error)) {
|
|
281
|
+
await requestLog.append(`[[Error]]:
|
|
282
|
+
${formatError(error)}
|
|
283
|
+
|
|
284
|
+
`);
|
|
285
|
+
await requestLog.append(formatRequestResultLog(tokenUsage, error));
|
|
286
|
+
throw error;
|
|
287
|
+
}
|
|
288
|
+
await requestLog.append(
|
|
289
|
+
`[[Warning]]:
|
|
290
|
+
Request failed with connection error, retrying... (${attempt + 1} times)
|
|
291
|
+
|
|
292
|
+
`
|
|
293
|
+
);
|
|
294
|
+
if (attempt < this.#retryTimes && this.#retryIntervalSeconds > 0) {
|
|
295
|
+
await sleep(this.#retryIntervalSeconds * 1e3, void 0, {
|
|
296
|
+
signal: input.signal
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (response === void 0) {
|
|
302
|
+
const failureMessage = lastError === void 0 ? `LLM request failed after ${this.#retryTimes + 1} attempts` : `LLM request failed after ${this.#retryTimes + 1} attempts: ${formatError(lastError)}`;
|
|
303
|
+
await requestLog.append(`[[Error]]:
|
|
304
|
+
${failureMessage}
|
|
305
|
+
|
|
306
|
+
`);
|
|
307
|
+
await requestLog.append(formatRequestResultLog(tokenUsage, lastError));
|
|
308
|
+
throw new Error(failureMessage, {
|
|
309
|
+
...lastError === void 0 ? {} : { cause: lastError }
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
if (cacheKey !== void 0 && this.#cache !== void 0 && useCache) {
|
|
313
|
+
const entry = this.#cache.createEntry(cacheKey, response);
|
|
314
|
+
if (input.sessionId !== void 0 && input.pendingCacheEntries !== void 0) {
|
|
315
|
+
input.pendingCacheEntries.set(entry.cacheKey, entry);
|
|
316
|
+
} else {
|
|
317
|
+
await this.#cache.write(entry);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
await requestLog.append(formatRequestResultLog(tokenUsage));
|
|
321
|
+
return response;
|
|
322
|
+
}
|
|
323
|
+
async #emitStreamProgress(outputCharacters) {
|
|
324
|
+
if (this.#onStreamProgress === void 0) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
try {
|
|
328
|
+
await this.#onStreamProgress({ outputCharacters });
|
|
329
|
+
} catch {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async #emitTokenUsage(usage) {
|
|
334
|
+
if (this.#onTokenUsage === void 0 || usage === void 0) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
try {
|
|
338
|
+
await this.#onTokenUsage({
|
|
339
|
+
...usage.inputTokenDetails.cacheReadTokens === void 0 ? {} : { cacheReadTokens: usage.inputTokenDetails.cacheReadTokens },
|
|
340
|
+
...usage.inputTokens === void 0 ? {} : { inputTokens: usage.inputTokens },
|
|
341
|
+
...usage.outputTokens === void 0 ? {} : { outputTokens: usage.outputTokens }
|
|
342
|
+
});
|
|
343
|
+
} catch {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function normalizeGenerationInput(input) {
|
|
349
|
+
const systemMessages = [];
|
|
350
|
+
let firstNonSystemIndex = 0;
|
|
351
|
+
while (firstNonSystemIndex < input.messages.length) {
|
|
352
|
+
const message = input.messages[firstNonSystemIndex];
|
|
353
|
+
if (message === void 0 || message.role !== "system") {
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
systemMessages.push(message);
|
|
357
|
+
firstNonSystemIndex += 1;
|
|
358
|
+
}
|
|
359
|
+
if (systemMessages.length === 0) {
|
|
360
|
+
return input;
|
|
361
|
+
}
|
|
362
|
+
if (systemMessages.length === 1) {
|
|
363
|
+
const [systemMessage] = systemMessages;
|
|
364
|
+
if (systemMessage === void 0) {
|
|
365
|
+
return input;
|
|
366
|
+
}
|
|
367
|
+
return {
|
|
368
|
+
...input,
|
|
369
|
+
messages: input.messages.slice(firstNonSystemIndex),
|
|
370
|
+
system: systemMessage
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
...input,
|
|
375
|
+
messages: input.messages.slice(firstNonSystemIndex),
|
|
376
|
+
system: systemMessages
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
function ensureDirectoryPath(dirPath) {
|
|
380
|
+
if (dirPath === void 0) {
|
|
381
|
+
return void 0;
|
|
382
|
+
}
|
|
383
|
+
const resolvedDirPath = resolve(dirPath);
|
|
384
|
+
if (!existsSync(resolvedDirPath)) {
|
|
385
|
+
mkdirSync(resolvedDirPath, { recursive: true });
|
|
386
|
+
return resolvedDirPath;
|
|
387
|
+
}
|
|
388
|
+
if (!statSync(resolvedDirPath).isDirectory()) {
|
|
389
|
+
return void 0;
|
|
390
|
+
}
|
|
391
|
+
return resolvedDirPath;
|
|
392
|
+
}
|
|
393
|
+
function createCache(cacheDirPath) {
|
|
394
|
+
const resolvedCacheDirPath = ensureDirectoryPath(cacheDirPath);
|
|
395
|
+
if (resolvedCacheDirPath === void 0) {
|
|
396
|
+
return void 0;
|
|
397
|
+
}
|
|
398
|
+
return new LLMCache(resolvedCacheDirPath);
|
|
399
|
+
}
|
|
400
|
+
function hasVisibleNonSystemContent(messages) {
|
|
401
|
+
return messages.some(
|
|
402
|
+
(message) => message.role !== "system" && (typeof message.content !== "string" || message.content.trim() !== "")
|
|
403
|
+
);
|
|
404
|
+
}
|
|
405
|
+
function formatRequestParameters(input) {
|
|
406
|
+
const lines = [
|
|
407
|
+
"[[Parameters]]:",
|
|
408
|
+
` model=${input.modelIdentity}`,
|
|
409
|
+
` temperature=${String(input.resolvedTemperature)}`,
|
|
410
|
+
` top_p=${String(input.resolvedTopP)}`
|
|
411
|
+
];
|
|
412
|
+
if (input.modelProvider !== void 0) {
|
|
413
|
+
lines.push(` provider=${input.modelProvider}`);
|
|
414
|
+
}
|
|
415
|
+
lines.push(` model_id=${input.modelId}`);
|
|
416
|
+
if (input.scope !== void 0) {
|
|
417
|
+
lines.push(` scope=${input.scope}`);
|
|
418
|
+
}
|
|
419
|
+
if (Array.isArray(input.temperature)) {
|
|
420
|
+
lines.push(` temperature_schedule=${JSON.stringify(input.temperature)}`);
|
|
421
|
+
}
|
|
422
|
+
if (Array.isArray(input.topP)) {
|
|
423
|
+
lines.push(` top_p_schedule=${JSON.stringify(input.topP)}`);
|
|
424
|
+
}
|
|
425
|
+
if (input.retryIndex !== void 0 && input.retryMax !== void 0) {
|
|
426
|
+
lines.push(` retry_progress=${input.retryIndex}/${input.retryMax}`);
|
|
427
|
+
}
|
|
428
|
+
if (input.cacheKey !== void 0) {
|
|
429
|
+
lines.push(` cache_key=${input.cacheKey}`);
|
|
430
|
+
}
|
|
431
|
+
if (input.sessionId !== void 0) {
|
|
432
|
+
lines.push(` session_id=${input.sessionId}`);
|
|
433
|
+
}
|
|
434
|
+
return `${lines.join("\n")}
|
|
435
|
+
|
|
436
|
+
`;
|
|
437
|
+
}
|
|
438
|
+
function formatRequestMessages(messages) {
|
|
439
|
+
const body = messages.map(
|
|
440
|
+
(message) => `${capitalize(message.role)}:
|
|
441
|
+
${formatMessageContent(message.content)}`
|
|
442
|
+
).join("\n\n");
|
|
443
|
+
return `[[Request]]:
|
|
444
|
+
${body}
|
|
445
|
+
|
|
446
|
+
`;
|
|
447
|
+
}
|
|
448
|
+
function formatRequestResultLog(usage, error) {
|
|
449
|
+
return [
|
|
450
|
+
formatRequestUsageLog(usage),
|
|
451
|
+
...error === void 0 ? [] : [formatRequestErrorStackLog(error)]
|
|
452
|
+
].join("");
|
|
453
|
+
}
|
|
454
|
+
function formatRequestUsageLog(usage) {
|
|
455
|
+
if (usage === "cache-hit") {
|
|
456
|
+
return "[[Usage]]:\ncache-hit\n\n";
|
|
457
|
+
}
|
|
458
|
+
return [
|
|
459
|
+
"[[Usage]]:",
|
|
460
|
+
`input: ${formatTokenCount(usage?.inputTokens)}`,
|
|
461
|
+
`cache: ${formatTokenCount(usage?.inputTokenDetails.cacheReadTokens)}`,
|
|
462
|
+
`output: ${formatTokenCount(usage?.outputTokens)}`,
|
|
463
|
+
"",
|
|
464
|
+
""
|
|
465
|
+
].join("\n");
|
|
466
|
+
}
|
|
467
|
+
function formatTokenCount(value) {
|
|
468
|
+
return value === void 0 ? "unavailable" : String(value);
|
|
469
|
+
}
|
|
470
|
+
function formatRequestErrorStackLog(error) {
|
|
471
|
+
return `[[Error Stack]]:
|
|
472
|
+
${formatErrorStack(error)}
|
|
473
|
+
|
|
474
|
+
`;
|
|
475
|
+
}
|
|
476
|
+
function formatErrorStack(error) {
|
|
477
|
+
if (error instanceof Error) {
|
|
478
|
+
return error.stack ?? formatError(error);
|
|
479
|
+
}
|
|
480
|
+
return formatError(error);
|
|
481
|
+
}
|
|
482
|
+
function formatMessageContent(content) {
|
|
483
|
+
if (typeof content === "string") {
|
|
484
|
+
return content;
|
|
485
|
+
}
|
|
486
|
+
const serializedContent = JSON.stringify(content, null, 2);
|
|
487
|
+
if (typeof serializedContent === "string") {
|
|
488
|
+
return serializedContent;
|
|
489
|
+
}
|
|
490
|
+
return "";
|
|
491
|
+
}
|
|
492
|
+
function capitalize(value) {
|
|
493
|
+
if (value.length === 0) {
|
|
494
|
+
return value;
|
|
495
|
+
}
|
|
496
|
+
return `${value[0]?.toUpperCase() ?? ""}${value.slice(1)}`;
|
|
497
|
+
}
|
|
498
|
+
function isRetryableError(error) {
|
|
499
|
+
if (APICallError.isInstance(error)) {
|
|
500
|
+
if (isPaymentRequiredError(error)) {
|
|
501
|
+
return false;
|
|
502
|
+
}
|
|
503
|
+
if (error.isRetryable) {
|
|
504
|
+
return true;
|
|
505
|
+
}
|
|
506
|
+
return isRetryableStatusCode(error.statusCode);
|
|
507
|
+
}
|
|
508
|
+
return !isAbortLikeError(error) && isRetryableTransportError(error);
|
|
509
|
+
}
|
|
510
|
+
function isPaymentRequiredError(error) {
|
|
511
|
+
return APICallError.isInstance(error) && error.statusCode === 402;
|
|
512
|
+
}
|
|
513
|
+
function isRetryableStatusCode(statusCode) {
|
|
514
|
+
return typeof statusCode === "number" && RETRYABLE_HTTP_STATUS_CODES.has(statusCode);
|
|
515
|
+
}
|
|
516
|
+
function isAbortLikeError(error) {
|
|
517
|
+
return someErrorInChain(
|
|
518
|
+
error,
|
|
519
|
+
(currentError) => ABORT_ERROR_NAMES.has(currentError.name)
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
function isRetryableTransportError(error) {
|
|
523
|
+
return someErrorInChain(error, (currentError) => {
|
|
524
|
+
const nodeError = currentError;
|
|
525
|
+
const errorCode = typeof nodeError.code === "string" ? nodeError.code.toUpperCase() : void 0;
|
|
526
|
+
if (errorCode !== void 0 && RETRYABLE_ERROR_CODES.has(errorCode)) {
|
|
527
|
+
return true;
|
|
528
|
+
}
|
|
529
|
+
const errorMessage = currentError.message.toLowerCase();
|
|
530
|
+
return RETRYABLE_ERROR_KEYWORDS.some(
|
|
531
|
+
(keyword) => errorMessage.includes(keyword)
|
|
532
|
+
);
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
function someErrorInChain(error, matcher) {
|
|
536
|
+
const visited = /* @__PURE__ */ new Set();
|
|
537
|
+
let current = error;
|
|
538
|
+
while (current instanceof Error && !visited.has(current)) {
|
|
539
|
+
if (matcher(current)) {
|
|
540
|
+
return true;
|
|
541
|
+
}
|
|
542
|
+
visited.add(current);
|
|
543
|
+
current = current.cause;
|
|
544
|
+
}
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
function resolveModelInfo(model) {
|
|
548
|
+
if (typeof model === "string") {
|
|
549
|
+
return {
|
|
550
|
+
identity: model,
|
|
551
|
+
modelId: model
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
if (hasModelMetadata(model)) {
|
|
555
|
+
return {
|
|
556
|
+
identity: model.provider === void 0 ? model.modelId : `${model.provider}:${model.modelId}`,
|
|
557
|
+
modelId: model.modelId,
|
|
558
|
+
...model.provider === void 0 ? {} : { provider: model.provider }
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
return {
|
|
562
|
+
identity: "unknown-model",
|
|
563
|
+
modelId: "unknown-model"
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
function hasModelMetadata(model) {
|
|
567
|
+
return typeof model === "object" && model !== null && "modelId" in model && typeof model.modelId === "string" && (!("provider" in model) || typeof model.provider === "string");
|
|
568
|
+
}
|
|
569
|
+
export {
|
|
570
|
+
LLM
|
|
571
|
+
};
|
|
572
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/llm/client.ts"],"sourcesContent":["import { existsSync, mkdirSync, statSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { setTimeout as sleep } from \"timers/promises\";\n\nimport {\n APICallError,\n generateText,\n streamText,\n type LanguageModel,\n type LanguageModelUsage,\n type ModelMessage,\n type SystemModelMessage,\n} from \"ai\";\nimport type { Environment } from \"nunjucks\";\n\nimport { getLogger } from \"../common/logging.js\";\nimport { createEnv } from \"../common/template.js\";\nimport { AsyncSemaphore } from \"../utils/async-semaphore.js\";\nimport { createHash } from \"../utils/hash.js\";\nimport { formatError } from \"../utils/node-error.js\";\nimport { LLMCache } from \"./cache.js\";\nimport { LLMContext, type LLMContextRequestInput } from \"./context.js\";\nimport { LLMPaymentRequiredError } from \"./errors.js\";\nimport { createRequestLog } from \"./request-log.js\";\nimport { getScopeDefaults, resolveSamplingSetting } from \"./sampling.js\";\nimport type {\n LLMessage,\n LLMModel,\n LLMOptions,\n LLMLazyRequestOperation,\n LLMRequestOptions,\n LLMRequestFunction,\n LLMStreamProgressCallback,\n LLMTokenUsageCallback,\n SamplingScopeConfig,\n TemperatureSetting,\n} from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 360_000;\nconst DEFAULT_CONCURRENT_REQUESTS = 6;\nconst ABORT_ERROR_NAMES = new Set([\n \"AbortError\",\n \"ResponseAborted\",\n \"TimeoutError\",\n]);\nconst RETRYABLE_HTTP_STATUS_CODES = new Set([\n 408, 409, 425, 429, 500, 502, 503, 504, 520, 522, 524, 529,\n]);\n// undici commonly reports transient transport failures through low-level error\n// codes and generic `terminated` fetch errors instead of retryable HTTP\n// responses. The issues below are representative cases we want to treat as\n// retryable at our LLM boundary:\n// https://github.com/nodejs/undici/issues/1490\n// https://github.com/nodejs/undici/issues/1414\n// https://github.com/nodejs/undici/issues/1531\n// https://github.com/nodejs/undici/issues/1864\n// https://github.com/nodejs/undici/issues/2362\n// https://github.com/nodejs/undici/issues/3410\n// https://github.com/nodejs/undici/issues/4215\nconst RETRYABLE_ERROR_CODES = new Set([\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"EAI_AGAIN\",\n \"ETIMEDOUT\",\n \"EPIPE\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_HEADERS_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n]);\nconst RETRYABLE_ERROR_KEYWORDS = [\n \"connection\",\n \"terminated\",\n \"timeout\",\n \"network\",\n \"rate limit\",\n];\n\nlet contextIdCounter = 0;\n\ntype LLMRequestSessionInput<S extends string> = Omit<\n LLMContextRequestInput<S>,\n \"options\"\n> &\n LLMRequestOptions<S> & {\n sessionId?: number;\n };\n\nexport class LLM<S extends string> {\n readonly #cache: LLMCache | undefined;\n readonly #lazyRequestLimiter: AsyncSemaphore;\n readonly #logDirPath: string | undefined;\n readonly #model: LLMModel;\n readonly #modelProvider: string | undefined;\n readonly #modelId: string;\n readonly #modelIdentity: string;\n readonly #onStreamProgress: LLMStreamProgressCallback | undefined;\n readonly #onTokenUsage: LLMTokenUsageCallback | undefined;\n readonly #requestLimiter: AsyncSemaphore;\n readonly #retryIntervalSeconds: number;\n readonly #retryTimes: number;\n readonly #sampling: SamplingScopeConfig<S> | undefined;\n readonly #stream: boolean;\n readonly #templateEnvironment: Environment;\n readonly #temperature: TemperatureSetting;\n readonly #timeoutMs: number;\n readonly #topP: TemperatureSetting;\n\n public readonly config: Readonly<{\n concurrent: number;\n provider?: string;\n modelId: string;\n sampling?: SamplingScopeConfig<S>;\n stream: boolean;\n timeout: number;\n temperature: TemperatureSetting;\n topP: TemperatureSetting;\n }>;\n\n public constructor(options: LLMOptions<S>) {\n const concurrent = options.concurrent ?? DEFAULT_CONCURRENT_REQUESTS;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n const temperature = options.temperature ?? 0.6;\n const topP = options.topP ?? 0.6;\n const sampling = options.sampling;\n const stream = options.stream ?? false;\n const modelInfo = resolveModelInfo(options.model);\n\n this.config = Object.freeze({\n concurrent,\n modelId: modelInfo.modelId,\n temperature,\n stream,\n timeout,\n topP,\n ...(modelInfo.provider === undefined\n ? {}\n : { provider: modelInfo.provider }),\n ...(sampling === undefined ? {} : { sampling }),\n });\n this.#cache = createCache(options.cacheDirPath);\n this.#lazyRequestLimiter = new AsyncSemaphore(concurrent);\n this.#logDirPath = ensureDirectoryPath(options.logDirPath);\n this.#model = options.model;\n this.#modelProvider = modelInfo.provider;\n this.#modelId = modelInfo.modelId;\n this.#modelIdentity = modelInfo.identity;\n this.#onStreamProgress = options.onStreamProgress;\n this.#onTokenUsage = options.onTokenUsage;\n this.#requestLimiter = new AsyncSemaphore(concurrent);\n this.#retryIntervalSeconds = options.retryIntervalSeconds ?? 6;\n this.#retryTimes = options.retryTimes ?? 5;\n this.#sampling = sampling;\n this.#stream = stream;\n this.#templateEnvironment = createEnv(options.dataDirPath);\n this.#temperature = temperature;\n this.#timeoutMs = timeout;\n this.#topP = topP;\n }\n\n public context(): LLMContext<S> {\n contextIdCounter += 1;\n const sessionId = contextIdCounter;\n\n return new LLMContext(\n sessionId,\n async (input) =>\n await this.#requestWithSession({\n ...input.options,\n messages: input.messages,\n sessionId,\n ...(input.logFiles === undefined ? {} : { logFiles: input.logFiles }),\n ...(input.pendingCacheEntries === undefined\n ? {}\n : { pendingCacheEntries: input.pendingCacheEntries }),\n }),\n this.#cache,\n );\n }\n\n public async withContext<T>(\n operation: (context: LLMContext<S>) => Promise<T>,\n ): Promise<T> {\n return await this.context().run(operation);\n }\n\n public async request(\n messages: readonly LLMessage[],\n options?: LLMRequestOptions<S>,\n ): Promise<string>;\n public async request<T>(operation: LLMLazyRequestOperation<S, T>): Promise<T>;\n public async request<T>(\n input: readonly LLMessage[] | LLMLazyRequestOperation<S, T>,\n options: LLMRequestOptions<S> = {},\n ): Promise<string | T> {\n if (typeof input === \"function\") {\n return await this.#lazyRequestLimiter.use(\n async () => await input(this.#requestOnce),\n );\n }\n\n return await this.#requestOnce(input, options);\n }\n\n readonly #requestOnce: LLMRequestFunction<S> = async (\n messages,\n options = {},\n ) =>\n await this.#requestWithSession({\n messages,\n ...options,\n });\n\n public loadSystemPrompt(\n templateName: string,\n templateContext: Record<string, unknown> = {},\n ): string {\n return this.#templateEnvironment.render(templateName, templateContext);\n }\n\n async #requestWithSession(input: LLMRequestSessionInput<S>): Promise<string> {\n const defaultSampling = getScopeDefaults(\n input.scope,\n this.#sampling,\n this.#temperature,\n this.#topP,\n );\n const temperature = input.temperature ?? defaultSampling.temperature;\n const topP = input.topP ?? defaultSampling.topP;\n const resolvedTemperature = resolveSamplingSetting(\n temperature,\n \"temperature\",\n input.retryIndex,\n input.retryMax,\n );\n const resolvedTopP = resolveSamplingSetting(\n topP,\n \"top_p\",\n input.retryIndex,\n input.retryMax,\n );\n const useCache =\n (input.useCache ?? true) && hasVisibleNonSystemContent(input.messages);\n const cacheKey =\n this.#cache !== undefined && useCache\n ? createHash({\n messages: input.messages.map((message) => ({\n content: message.content,\n role: message.role,\n })),\n modelId: this.#modelId,\n provider: this.#modelProvider ?? null,\n temperature: resolvedTemperature ?? null,\n topP: resolvedTopP ?? null,\n })\n : undefined;\n const requestLog = createRequestLog(this.#logDirPath);\n\n if (requestLog.filePath !== undefined && input.logFiles !== undefined) {\n input.logFiles.push(requestLog.filePath);\n }\n\n await requestLog.append(\n formatRequestParameters({\n cacheKey,\n modelId: this.#modelId,\n modelIdentity: this.#modelIdentity,\n modelProvider: this.#modelProvider,\n resolvedTemperature,\n resolvedTopP,\n retryIndex: input.retryIndex,\n retryMax: input.retryMax,\n scope: input.scope,\n sessionId: input.sessionId,\n temperature,\n topP,\n }),\n );\n await requestLog.append(formatRequestMessages(input.messages));\n\n if (cacheKey !== undefined && this.#cache !== undefined && useCache) {\n const cachedResponse = await this.#cache.read(cacheKey);\n\n if (cachedResponse !== undefined) {\n getLogger({\n component: \"llm\",\n scope: input.scope,\n sessionId: input.sessionId,\n }).info(\n `[Cache Hit] Using cached response (key: ${cacheKey.slice(0, 12)}...)`,\n );\n await requestLog.append(\n `[[Response]] (from cache):\\n${cachedResponse}\\n\\n`,\n );\n await requestLog.append(formatRequestResultLog(\"cache-hit\"));\n return cachedResponse;\n }\n }\n\n let response: string | undefined;\n let tokenUsage: LanguageModelUsage | undefined;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.#retryTimes; attempt += 1) {\n try {\n response = await this.#requestLimiter.use(async () => {\n const generationInput: {\n abortSignal?: AbortSignal;\n maxRetries: number;\n messages: ModelMessage[];\n model: LanguageModel;\n system?: string | SystemModelMessage | SystemModelMessage[];\n temperature?: number;\n timeout?: number;\n topP?: number;\n } = normalizeGenerationInput({\n maxRetries: 0,\n messages: [...input.messages],\n model: this.#model,\n timeout: this.#timeoutMs,\n });\n\n if (input.signal !== undefined) {\n generationInput.abortSignal = input.signal;\n }\n\n if (resolvedTemperature !== undefined) {\n generationInput.temperature = resolvedTemperature;\n }\n\n if (resolvedTopP !== undefined) {\n generationInput.topP = resolvedTopP;\n }\n\n if (this.#stream) {\n const textChunks: string[] = [];\n const result = streamText(generationInput);\n\n for await (const chunk of result.textStream) {\n textChunks.push(chunk);\n await this.#emitStreamProgress(chunk.length);\n }\n tokenUsage = await result.totalUsage;\n await this.#emitTokenUsage(tokenUsage);\n return textChunks.join(\"\");\n } else {\n const result = await generateText(generationInput);\n\n tokenUsage = result.usage;\n await this.#emitStreamProgress(result.text.length);\n await this.#emitTokenUsage(tokenUsage);\n return result.text;\n }\n });\n\n await requestLog.append(`[[Response]]:\\n${response}\\n\\n`);\n break;\n } catch (error) {\n lastError = error;\n\n if (isPaymentRequiredError(error)) {\n const paymentError = new LLMPaymentRequiredError(undefined, {\n cause: error,\n });\n\n await requestLog.append(\n `[[Error]]:\\n${formatError(paymentError)}\\n\\n`,\n );\n await requestLog.append(formatRequestResultLog(tokenUsage, error));\n throw paymentError;\n }\n\n if (!isRetryableError(error)) {\n await requestLog.append(`[[Error]]:\\n${formatError(error)}\\n\\n`);\n await requestLog.append(formatRequestResultLog(tokenUsage, error));\n throw error;\n }\n\n await requestLog.append(\n `[[Warning]]:\\nRequest failed with connection error, retrying... (${attempt + 1} times)\\n\\n`,\n );\n\n if (attempt < this.#retryTimes && this.#retryIntervalSeconds > 0) {\n await sleep(this.#retryIntervalSeconds * 1000, undefined, {\n signal: input.signal,\n });\n }\n }\n }\n\n if (response === undefined) {\n const failureMessage =\n lastError === undefined\n ? `LLM request failed after ${this.#retryTimes + 1} attempts`\n : `LLM request failed after ${this.#retryTimes + 1} attempts: ${formatError(lastError)}`;\n\n await requestLog.append(`[[Error]]:\\n${failureMessage}\\n\\n`);\n await requestLog.append(formatRequestResultLog(tokenUsage, lastError));\n\n throw new Error(failureMessage, {\n ...(lastError === undefined ? {} : { cause: lastError }),\n });\n }\n\n if (cacheKey !== undefined && this.#cache !== undefined && useCache) {\n const entry = this.#cache.createEntry(cacheKey, response);\n\n if (\n input.sessionId !== undefined &&\n input.pendingCacheEntries !== undefined\n ) {\n input.pendingCacheEntries.set(entry.cacheKey, entry);\n } else {\n await this.#cache.write(entry);\n }\n }\n\n await requestLog.append(formatRequestResultLog(tokenUsage));\n return response;\n }\n\n async #emitStreamProgress(outputCharacters: number): Promise<void> {\n if (this.#onStreamProgress === undefined) {\n return;\n }\n\n try {\n await this.#onStreamProgress({ outputCharacters });\n } catch {\n return;\n }\n }\n\n async #emitTokenUsage(usage: LanguageModelUsage | undefined): Promise<void> {\n if (this.#onTokenUsage === undefined || usage === undefined) {\n return;\n }\n\n try {\n await this.#onTokenUsage({\n ...(usage.inputTokenDetails.cacheReadTokens === undefined\n ? {}\n : { cacheReadTokens: usage.inputTokenDetails.cacheReadTokens }),\n ...(usage.inputTokens === undefined\n ? {}\n : { inputTokens: usage.inputTokens }),\n ...(usage.outputTokens === undefined\n ? {}\n : { outputTokens: usage.outputTokens }),\n });\n } catch {\n return;\n }\n }\n}\n\nfunction normalizeGenerationInput(input: {\n maxRetries: number;\n messages: ModelMessage[];\n model: LanguageModel;\n timeout: number;\n}): {\n maxRetries: number;\n messages: ModelMessage[];\n model: LanguageModel;\n system?: string | SystemModelMessage | SystemModelMessage[];\n timeout: number;\n} {\n const systemMessages: SystemModelMessage[] = [];\n let firstNonSystemIndex = 0;\n\n while (firstNonSystemIndex < input.messages.length) {\n const message = input.messages[firstNonSystemIndex];\n\n if (message === undefined || message.role !== \"system\") {\n break;\n }\n\n systemMessages.push(message);\n firstNonSystemIndex += 1;\n }\n\n if (systemMessages.length === 0) {\n return input;\n }\n\n if (systemMessages.length === 1) {\n const [systemMessage] = systemMessages;\n\n if (systemMessage === undefined) {\n return input;\n }\n\n return {\n ...input,\n messages: input.messages.slice(firstNonSystemIndex),\n system: systemMessage,\n };\n }\n\n return {\n ...input,\n messages: input.messages.slice(firstNonSystemIndex),\n system: systemMessages,\n };\n}\n\nfunction ensureDirectoryPath(dirPath?: string): string | undefined {\n if (dirPath === undefined) {\n return undefined;\n }\n\n const resolvedDirPath = resolve(dirPath);\n\n if (!existsSync(resolvedDirPath)) {\n mkdirSync(resolvedDirPath, { recursive: true });\n return resolvedDirPath;\n }\n\n if (!statSync(resolvedDirPath).isDirectory()) {\n return undefined;\n }\n\n return resolvedDirPath;\n}\n\nfunction createCache(cacheDirPath?: string): LLMCache | undefined {\n const resolvedCacheDirPath = ensureDirectoryPath(cacheDirPath);\n\n if (resolvedCacheDirPath === undefined) {\n return undefined;\n }\n\n return new LLMCache(resolvedCacheDirPath);\n}\n\nfunction hasVisibleNonSystemContent(messages: readonly LLMessage[]): boolean {\n return messages.some(\n (message) =>\n message.role !== \"system\" &&\n (typeof message.content !== \"string\" || message.content.trim() !== \"\"),\n );\n}\n\nfunction formatRequestParameters(input: {\n cacheKey?: string | undefined;\n modelId: string;\n modelIdentity: string;\n modelProvider?: string | undefined;\n resolvedTemperature: number | undefined;\n resolvedTopP: number | undefined;\n retryIndex?: number | undefined;\n retryMax?: number | undefined;\n scope?: string | undefined;\n sessionId?: number | undefined;\n temperature: TemperatureSetting;\n topP: TemperatureSetting;\n}): string {\n const lines = [\n \"[[Parameters]]:\",\n `\\tmodel=${input.modelIdentity}`,\n `\\ttemperature=${String(input.resolvedTemperature)}`,\n `\\ttop_p=${String(input.resolvedTopP)}`,\n ];\n\n if (input.modelProvider !== undefined) {\n lines.push(`\\tprovider=${input.modelProvider}`);\n }\n\n lines.push(`\\tmodel_id=${input.modelId}`);\n\n if (input.scope !== undefined) {\n lines.push(`\\tscope=${input.scope}`);\n }\n\n if (Array.isArray(input.temperature)) {\n lines.push(`\\ttemperature_schedule=${JSON.stringify(input.temperature)}`);\n }\n\n if (Array.isArray(input.topP)) {\n lines.push(`\\ttop_p_schedule=${JSON.stringify(input.topP)}`);\n }\n\n if (input.retryIndex !== undefined && input.retryMax !== undefined) {\n lines.push(`\\tretry_progress=${input.retryIndex}/${input.retryMax}`);\n }\n\n if (input.cacheKey !== undefined) {\n lines.push(`\\tcache_key=${input.cacheKey}`);\n }\n\n if (input.sessionId !== undefined) {\n lines.push(`\\tsession_id=${input.sessionId}`);\n }\n\n return `${lines.join(\"\\n\")}\\n\\n`;\n}\n\nfunction formatRequestMessages(messages: readonly LLMessage[]): string {\n const body = messages\n .map(\n (message) =>\n `${capitalize(message.role)}:\\n${formatMessageContent(message.content)}`,\n )\n .join(\"\\n\\n\");\n\n return `[[Request]]:\\n${body}\\n\\n`;\n}\n\nfunction formatRequestResultLog(\n usage: LanguageModelUsage | \"cache-hit\" | undefined,\n error?: unknown,\n): string {\n return [\n formatRequestUsageLog(usage),\n ...(error === undefined ? [] : [formatRequestErrorStackLog(error)]),\n ].join(\"\");\n}\n\nfunction formatRequestUsageLog(\n usage: LanguageModelUsage | \"cache-hit\" | undefined,\n): string {\n if (usage === \"cache-hit\") {\n return \"[[Usage]]:\\ncache-hit\\n\\n\";\n }\n\n return [\n \"[[Usage]]:\",\n `input: ${formatTokenCount(usage?.inputTokens)}`,\n `cache: ${formatTokenCount(usage?.inputTokenDetails.cacheReadTokens)}`,\n `output: ${formatTokenCount(usage?.outputTokens)}`,\n \"\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatTokenCount(value: number | undefined): string {\n return value === undefined ? \"unavailable\" : String(value);\n}\n\nfunction formatRequestErrorStackLog(error: unknown): string {\n return `[[Error Stack]]:\\n${formatErrorStack(error)}\\n\\n`;\n}\n\nfunction formatErrorStack(error: unknown): string {\n if (error instanceof Error) {\n return error.stack ?? formatError(error);\n }\n\n return formatError(error);\n}\n\nfunction formatMessageContent(content: LLMessage[\"content\"]): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n const serializedContent = JSON.stringify(content, null, 2);\n\n if (typeof serializedContent === \"string\") {\n return serializedContent;\n }\n\n return \"\";\n}\n\nfunction capitalize(value: string): string {\n if (value.length === 0) {\n return value;\n }\n\n return `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction isRetryableError(error: unknown): boolean {\n if (APICallError.isInstance(error)) {\n if (isPaymentRequiredError(error)) {\n return false;\n }\n\n if (error.isRetryable) {\n return true;\n }\n\n return isRetryableStatusCode(error.statusCode);\n }\n\n return !isAbortLikeError(error) && isRetryableTransportError(error);\n}\n\nfunction isPaymentRequiredError(error: unknown): boolean {\n return APICallError.isInstance(error) && error.statusCode === 402;\n}\n\nfunction isRetryableStatusCode(statusCode: number | undefined): boolean {\n return (\n typeof statusCode === \"number\" &&\n RETRYABLE_HTTP_STATUS_CODES.has(statusCode)\n );\n}\n\nfunction isAbortLikeError(error: unknown): boolean {\n return someErrorInChain(error, (currentError) =>\n ABORT_ERROR_NAMES.has(currentError.name),\n );\n}\n\nfunction isRetryableTransportError(error: unknown): boolean {\n return someErrorInChain(error, (currentError) => {\n const nodeError = currentError as NodeJS.ErrnoException;\n const errorCode =\n typeof nodeError.code === \"string\"\n ? nodeError.code.toUpperCase()\n : undefined;\n\n if (errorCode !== undefined && RETRYABLE_ERROR_CODES.has(errorCode)) {\n return true;\n }\n\n const errorMessage = currentError.message.toLowerCase();\n\n return RETRYABLE_ERROR_KEYWORDS.some((keyword) =>\n errorMessage.includes(keyword),\n );\n });\n}\n\nfunction someErrorInChain(\n error: unknown,\n matcher: (error: Error) => boolean,\n): boolean {\n const visited = new Set<unknown>();\n let current: unknown = error;\n\n while (current instanceof Error && !visited.has(current)) {\n if (matcher(current)) {\n return true;\n }\n\n visited.add(current);\n current = current.cause;\n }\n\n return false;\n}\n\nfunction resolveModelInfo(model: LLMModel): {\n readonly identity: string;\n readonly modelId: string;\n readonly provider?: string;\n} {\n if (typeof model === \"string\") {\n return {\n identity: model,\n modelId: model,\n };\n }\n\n if (hasModelMetadata(model)) {\n return {\n identity:\n model.provider === undefined\n ? model.modelId\n : `${model.provider}:${model.modelId}`,\n modelId: model.modelId,\n ...(model.provider === undefined ? {} : { provider: model.provider }),\n };\n }\n\n return {\n identity: \"unknown-model\",\n modelId: \"unknown-model\",\n };\n}\n\nfunction hasModelMetadata(\n model: LLMModel,\n): model is LLMModel & { modelId: string; provider?: string } {\n return (\n typeof model === \"object\" &&\n model !== null &&\n \"modelId\" in model &&\n typeof model.modelId === \"string\" &&\n (!(\"provider\" in model) || typeof model.provider === \"string\")\n );\n}\n"],"mappings":"AAAA,SAAS,YAAY,WAAW,gBAAgB;AAChD,SAAS,eAAe;AACxB,SAAS,cAAc,aAAa;AAEpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AAGP,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AACzB,SAAS,kBAA+C;AACxD,SAAS,+BAA+B;AACxC,SAAS,wBAAwB;AACjC,SAAS,kBAAkB,8BAA8B;AAczD,MAAM,qBAAqB;AAC3B,MAAM,8BAA8B;AACpC,MAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,MAAM,8BAA8B,oBAAI,IAAI;AAAA,EAC1C;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AACzD,CAAC;AAYD,MAAM,wBAAwB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,MAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI,mBAAmB;AAUhB,MAAM,IAAsB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEO;AAAA,EAWT,YAAY,SAAwB;AACzC,UAAM,aAAa,QAAQ,cAAc;AACzC,UAAM,UAAU,QAAQ,WAAW;AACnC,UAAM,cAAc,QAAQ,eAAe;AAC3C,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,WAAW,QAAQ;AACzB,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,YAAY,iBAAiB,QAAQ,KAAK;AAEhD,SAAK,SAAS,OAAO,OAAO;AAAA,MAC1B;AAAA,MACA,SAAS,UAAU;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,UAAU,aAAa,SACvB,CAAC,IACD,EAAE,UAAU,UAAU,SAAS;AAAA,MACnC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC/C,CAAC;AACD,SAAK,SAAS,YAAY,QAAQ,YAAY;AAC9C,SAAK,sBAAsB,IAAI,eAAe,UAAU;AACxD,SAAK,cAAc,oBAAoB,QAAQ,UAAU;AACzD,SAAK,SAAS,QAAQ;AACtB,SAAK,iBAAiB,UAAU;AAChC,SAAK,WAAW,UAAU;AAC1B,SAAK,iBAAiB,UAAU;AAChC,SAAK,oBAAoB,QAAQ;AACjC,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,kBAAkB,IAAI,eAAe,UAAU;AACpD,SAAK,wBAAwB,QAAQ,wBAAwB;AAC7D,SAAK,cAAc,QAAQ,cAAc;AACzC,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,uBAAuB,UAAU,QAAQ,WAAW;AACzD,SAAK,eAAe;AACpB,SAAK,aAAa;AAClB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,UAAyB;AAC9B,wBAAoB;AACpB,UAAM,YAAY;AAElB,WAAO,IAAI;AAAA,MACT;AAAA,MACA,OAAO,UACL,MAAM,KAAK,oBAAoB;AAAA,QAC7B,GAAG,MAAM;AAAA,QACT,UAAU,MAAM;AAAA,QAChB;AAAA,QACA,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,QACnE,GAAI,MAAM,wBAAwB,SAC9B,CAAC,IACD,EAAE,qBAAqB,MAAM,oBAAoB;AAAA,MACvD,CAAC;AAAA,MACH,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAa,YACX,WACY;AACZ,WAAO,MAAM,KAAK,QAAQ,EAAE,IAAI,SAAS;AAAA,EAC3C;AAAA,EAOA,MAAa,QACX,OACA,UAAgC,CAAC,GACZ;AACrB,QAAI,OAAO,UAAU,YAAY;AAC/B,aAAO,MAAM,KAAK,oBAAoB;AAAA,QACpC,YAAY,MAAM,MAAM,KAAK,YAAY;AAAA,MAC3C;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,aAAa,OAAO,OAAO;AAAA,EAC/C;AAAA,EAES,eAAsC,OAC7C,UACA,UAAU,CAAC,MAEX,MAAM,KAAK,oBAAoB;AAAA,IAC7B;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AAAA,EAEI,iBACL,cACA,kBAA2C,CAAC,GACpC;AACR,WAAO,KAAK,qBAAqB,OAAO,cAAc,eAAe;AAAA,EACvE;AAAA,EAEA,MAAM,oBAAoB,OAAmD;AAC3E,UAAM,kBAAkB;AAAA,MACtB,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,UAAM,cAAc,MAAM,eAAe,gBAAgB;AACzD,UAAM,OAAO,MAAM,QAAQ,gBAAgB;AAC3C,UAAM,sBAAsB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,UAAM,YACH,MAAM,YAAY,SAAS,2BAA2B,MAAM,QAAQ;AACvE,UAAM,WACJ,KAAK,WAAW,UAAa,WACzB,WAAW;AAAA,MACT,UAAU,MAAM,SAAS,IAAI,CAAC,aAAa;AAAA,QACzC,SAAS,QAAQ;AAAA,QACjB,MAAM,QAAQ;AAAA,MAChB,EAAE;AAAA,MACF,SAAS,KAAK;AAAA,MACd,UAAU,KAAK,kBAAkB;AAAA,MACjC,aAAa,uBAAuB;AAAA,MACpC,MAAM,gBAAgB;AAAA,IACxB,CAAC,IACD;AACN,UAAM,aAAa,iBAAiB,KAAK,WAAW;AAEpD,QAAI,WAAW,aAAa,UAAa,MAAM,aAAa,QAAW;AACrE,YAAM,SAAS,KAAK,WAAW,QAAQ;AAAA,IACzC;AAEA,UAAM,WAAW;AAAA,MACf,wBAAwB;AAAA,QACtB;AAAA,QACA,SAAS,KAAK;AAAA,QACd,eAAe,KAAK;AAAA,QACpB,eAAe,KAAK;AAAA,QACpB;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,WAAW,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,WAAW,OAAO,sBAAsB,MAAM,QAAQ,CAAC;AAE7D,QAAI,aAAa,UAAa,KAAK,WAAW,UAAa,UAAU;AACnE,YAAM,iBAAiB,MAAM,KAAK,OAAO,KAAK,QAAQ;AAEtD,UAAI,mBAAmB,QAAW;AAChC,kBAAU;AAAA,UACR,WAAW;AAAA,UACX,OAAO,MAAM;AAAA,UACb,WAAW,MAAM;AAAA,QACnB,CAAC,EAAE;AAAA,UACD,2CAA2C,SAAS,MAAM,GAAG,EAAE,CAAC;AAAA,QAClE;AACA,cAAM,WAAW;AAAA,UACf;AAAA,EAA+B,cAAc;AAAA;AAAA;AAAA,QAC/C;AACA,cAAM,WAAW,OAAO,uBAAuB,WAAW,CAAC;AAC3D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,KAAK,aAAa,WAAW,GAAG;AAC/D,UAAI;AACF,mBAAW,MAAM,KAAK,gBAAgB,IAAI,YAAY;AACpD,gBAAM,kBASF,yBAAyB;AAAA,YAC3B,YAAY;AAAA,YACZ,UAAU,CAAC,GAAG,MAAM,QAAQ;AAAA,YAC5B,OAAO,KAAK;AAAA,YACZ,SAAS,KAAK;AAAA,UAChB,CAAC;AAED,cAAI,MAAM,WAAW,QAAW;AAC9B,4BAAgB,cAAc,MAAM;AAAA,UACtC;AAEA,cAAI,wBAAwB,QAAW;AACrC,4BAAgB,cAAc;AAAA,UAChC;AAEA,cAAI,iBAAiB,QAAW;AAC9B,4BAAgB,OAAO;AAAA,UACzB;AAEA,cAAI,KAAK,SAAS;AAChB,kBAAM,aAAuB,CAAC;AAC9B,kBAAM,SAAS,WAAW,eAAe;AAEzC,6BAAiB,SAAS,OAAO,YAAY;AAC3C,yBAAW,KAAK,KAAK;AACrB,oBAAM,KAAK,oBAAoB,MAAM,MAAM;AAAA,YAC7C;AACA,yBAAa,MAAM,OAAO;AAC1B,kBAAM,KAAK,gBAAgB,UAAU;AACrC,mBAAO,WAAW,KAAK,EAAE;AAAA,UAC3B,OAAO;AACL,kBAAM,SAAS,MAAM,aAAa,eAAe;AAEjD,yBAAa,OAAO;AACpB,kBAAM,KAAK,oBAAoB,OAAO,KAAK,MAAM;AACjD,kBAAM,KAAK,gBAAgB,UAAU;AACrC,mBAAO,OAAO;AAAA,UAChB;AAAA,QACF,CAAC;AAED,cAAM,WAAW,OAAO;AAAA,EAAkB,QAAQ;AAAA;AAAA,CAAM;AACxD;AAAA,MACF,SAAS,OAAO;AACd,oBAAY;AAEZ,YAAI,uBAAuB,KAAK,GAAG;AACjC,gBAAM,eAAe,IAAI,wBAAwB,QAAW;AAAA,YAC1D,OAAO;AAAA,UACT,CAAC;AAED,gBAAM,WAAW;AAAA,YACf;AAAA,EAAe,YAAY,YAAY,CAAC;AAAA;AAAA;AAAA,UAC1C;AACA,gBAAM,WAAW,OAAO,uBAAuB,YAAY,KAAK,CAAC;AACjE,gBAAM;AAAA,QACR;AAEA,YAAI,CAAC,iBAAiB,KAAK,GAAG;AAC5B,gBAAM,WAAW,OAAO;AAAA,EAAe,YAAY,KAAK,CAAC;AAAA;AAAA,CAAM;AAC/D,gBAAM,WAAW,OAAO,uBAAuB,YAAY,KAAK,CAAC;AACjE,gBAAM;AAAA,QACR;AAEA,cAAM,WAAW;AAAA,UACf;AAAA,qDAAoE,UAAU,CAAC;AAAA;AAAA;AAAA,QACjF;AAEA,YAAI,UAAU,KAAK,eAAe,KAAK,wBAAwB,GAAG;AAChE,gBAAM,MAAM,KAAK,wBAAwB,KAAM,QAAW;AAAA,YACxD,QAAQ,MAAM;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,QAAW;AAC1B,YAAM,iBACJ,cAAc,SACV,4BAA4B,KAAK,cAAc,CAAC,cAChD,4BAA4B,KAAK,cAAc,CAAC,cAAc,YAAY,SAAS,CAAC;AAE1F,YAAM,WAAW,OAAO;AAAA,EAAe,cAAc;AAAA;AAAA,CAAM;AAC3D,YAAM,WAAW,OAAO,uBAAuB,YAAY,SAAS,CAAC;AAErE,YAAM,IAAI,MAAM,gBAAgB;AAAA,QAC9B,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,OAAO,UAAU;AAAA,MACxD,CAAC;AAAA,IACH;AAEA,QAAI,aAAa,UAAa,KAAK,WAAW,UAAa,UAAU;AACnE,YAAM,QAAQ,KAAK,OAAO,YAAY,UAAU,QAAQ;AAExD,UACE,MAAM,cAAc,UACpB,MAAM,wBAAwB,QAC9B;AACA,cAAM,oBAAoB,IAAI,MAAM,UAAU,KAAK;AAAA,MACrD,OAAO;AACL,cAAM,KAAK,OAAO,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,uBAAuB,UAAU,CAAC;AAC1D,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,oBAAoB,kBAAyC;AACjE,QAAI,KAAK,sBAAsB,QAAW;AACxC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,kBAAkB,EAAE,iBAAiB,CAAC;AAAA,IACnD,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,OAAsD;AAC1E,QAAI,KAAK,kBAAkB,UAAa,UAAU,QAAW;AAC3D;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,cAAc;AAAA,QACvB,GAAI,MAAM,kBAAkB,oBAAoB,SAC5C,CAAC,IACD,EAAE,iBAAiB,MAAM,kBAAkB,gBAAgB;AAAA,QAC/D,GAAI,MAAM,gBAAgB,SACtB,CAAC,IACD,EAAE,aAAa,MAAM,YAAY;AAAA,QACrC,GAAI,MAAM,iBAAiB,SACvB,CAAC,IACD,EAAE,cAAc,MAAM,aAAa;AAAA,MACzC,CAAC;AAAA,IACH,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,OAWhC;AACA,QAAM,iBAAuC,CAAC;AAC9C,MAAI,sBAAsB;AAE1B,SAAO,sBAAsB,MAAM,SAAS,QAAQ;AAClD,UAAM,UAAU,MAAM,SAAS,mBAAmB;AAElD,QAAI,YAAY,UAAa,QAAQ,SAAS,UAAU;AACtD;AAAA,IACF;AAEA,mBAAe,KAAK,OAAO;AAC3B,2BAAuB;AAAA,EACzB;AAEA,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,WAAW,GAAG;AAC/B,UAAM,CAAC,aAAa,IAAI;AAExB,QAAI,kBAAkB,QAAW;AAC/B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,MAAM,SAAS,MAAM,mBAAmB;AAAA,MAClD,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,MAAM,SAAS,MAAM,mBAAmB;AAAA,IAClD,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,oBAAoB,SAAsC;AACjE,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,QAAQ,OAAO;AAEvC,MAAI,CAAC,WAAW,eAAe,GAAG;AAChC,cAAU,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAC9C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,eAAe,EAAE,YAAY,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,cAA6C;AAChE,QAAM,uBAAuB,oBAAoB,YAAY;AAE7D,MAAI,yBAAyB,QAAW;AACtC,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,SAAS,oBAAoB;AAC1C;AAEA,SAAS,2BAA2B,UAAyC;AAC3E,SAAO,SAAS;AAAA,IACd,CAAC,YACC,QAAQ,SAAS,aAChB,OAAO,QAAQ,YAAY,YAAY,QAAQ,QAAQ,KAAK,MAAM;AAAA,EACvE;AACF;AAEA,SAAS,wBAAwB,OAatB;AACT,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,UAAW,MAAM,aAAa;AAAA,IAC9B,gBAAiB,OAAO,MAAM,mBAAmB,CAAC;AAAA,IAClD,UAAW,OAAO,MAAM,YAAY,CAAC;AAAA,EACvC;AAEA,MAAI,MAAM,kBAAkB,QAAW;AACrC,UAAM,KAAK,aAAc,MAAM,aAAa,EAAE;AAAA,EAChD;AAEA,QAAM,KAAK,aAAc,MAAM,OAAO,EAAE;AAExC,MAAI,MAAM,UAAU,QAAW;AAC7B,UAAM,KAAK,UAAW,MAAM,KAAK,EAAE;AAAA,EACrC;AAEA,MAAI,MAAM,QAAQ,MAAM,WAAW,GAAG;AACpC,UAAM,KAAK,yBAA0B,KAAK,UAAU,MAAM,WAAW,CAAC,EAAE;AAAA,EAC1E;AAEA,MAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC7B,UAAM,KAAK,mBAAoB,KAAK,UAAU,MAAM,IAAI,CAAC,EAAE;AAAA,EAC7D;AAEA,MAAI,MAAM,eAAe,UAAa,MAAM,aAAa,QAAW;AAClE,UAAM,KAAK,mBAAoB,MAAM,UAAU,IAAI,MAAM,QAAQ,EAAE;AAAA,EACrE;AAEA,MAAI,MAAM,aAAa,QAAW;AAChC,UAAM,KAAK,cAAe,MAAM,QAAQ,EAAE;AAAA,EAC5C;AAEA,MAAI,MAAM,cAAc,QAAW;AACjC,UAAM,KAAK,eAAgB,MAAM,SAAS,EAAE;AAAA,EAC9C;AAEA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AAC5B;AAEA,SAAS,sBAAsB,UAAwC;AACrE,QAAM,OAAO,SACV;AAAA,IACC,CAAC,YACC,GAAG,WAAW,QAAQ,IAAI,CAAC;AAAA,EAAM,qBAAqB,QAAQ,OAAO,CAAC;AAAA,EAC1E,EACC,KAAK,MAAM;AAEd,SAAO;AAAA,EAAiB,IAAI;AAAA;AAAA;AAC9B;AAEA,SAAS,uBACP,OACA,OACQ;AACR,SAAO;AAAA,IACL,sBAAsB,KAAK;AAAA,IAC3B,GAAI,UAAU,SAAY,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC;AAAA,EACnE,EAAE,KAAK,EAAE;AACX;AAEA,SAAS,sBACP,OACQ;AACR,MAAI,UAAU,aAAa;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,iBAAiB,OAAO,WAAW,CAAC;AAAA,IAC9C,UAAU,iBAAiB,OAAO,kBAAkB,eAAe,CAAC;AAAA,IACpE,WAAW,iBAAiB,OAAO,YAAY,CAAC;AAAA,IAChD;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,iBAAiB,OAAmC;AAC3D,SAAO,UAAU,SAAY,gBAAgB,OAAO,KAAK;AAC3D;AAEA,SAAS,2BAA2B,OAAwB;AAC1D,SAAO;AAAA,EAAqB,iBAAiB,KAAK,CAAC;AAAA;AAAA;AACrD;AAEA,SAAS,iBAAiB,OAAwB;AAChD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM,SAAS,YAAY,KAAK;AAAA,EACzC;AAEA,SAAO,YAAY,KAAK;AAC1B;AAEA,SAAS,qBAAqB,SAAuC;AACnE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,KAAK,UAAU,SAAS,MAAM,CAAC;AAEzD,MAAI,OAAO,sBAAsB,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAuB;AACzC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC;AAC1D;AAEA,SAAS,iBAAiB,OAAyB;AACjD,MAAI,aAAa,WAAW,KAAK,GAAG;AAClC,QAAI,uBAAuB,KAAK,GAAG;AACjC,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,aAAa;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,sBAAsB,MAAM,UAAU;AAAA,EAC/C;AAEA,SAAO,CAAC,iBAAiB,KAAK,KAAK,0BAA0B,KAAK;AACpE;AAEA,SAAS,uBAAuB,OAAyB;AACvD,SAAO,aAAa,WAAW,KAAK,KAAK,MAAM,eAAe;AAChE;AAEA,SAAS,sBAAsB,YAAyC;AACtE,SACE,OAAO,eAAe,YACtB,4BAA4B,IAAI,UAAU;AAE9C;AAEA,SAAS,iBAAiB,OAAyB;AACjD,SAAO;AAAA,IAAiB;AAAA,IAAO,CAAC,iBAC9B,kBAAkB,IAAI,aAAa,IAAI;AAAA,EACzC;AACF;AAEA,SAAS,0BAA0B,OAAyB;AAC1D,SAAO,iBAAiB,OAAO,CAAC,iBAAiB;AAC/C,UAAM,YAAY;AAClB,UAAM,YACJ,OAAO,UAAU,SAAS,WACtB,UAAU,KAAK,YAAY,IAC3B;AAEN,QAAI,cAAc,UAAa,sBAAsB,IAAI,SAAS,GAAG;AACnE,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,aAAa,QAAQ,YAAY;AAEtD,WAAO,yBAAyB;AAAA,MAAK,CAAC,YACpC,aAAa,SAAS,OAAO;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;AAEA,SAAS,iBACP,OACA,SACS;AACT,QAAM,UAAU,oBAAI,IAAa;AACjC,MAAI,UAAmB;AAEvB,SAAO,mBAAmB,SAAS,CAAC,QAAQ,IAAI,OAAO,GAAG;AACxD,QAAI,QAAQ,OAAO,GAAG;AACpB,aAAO;AAAA,IACT;AAEA,YAAQ,IAAI,OAAO;AACnB,cAAU,QAAQ;AAAA,EACpB;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAIxB;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,iBAAiB,KAAK,GAAG;AAC3B,WAAO;AAAA,MACL,UACE,MAAM,aAAa,SACf,MAAM,UACN,GAAG,MAAM,QAAQ,IAAI,MAAM,OAAO;AAAA,MACxC,SAAS,MAAM;AAAA,MACf,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,IACrE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AACF;AAEA,SAAS,iBACP,OAC4D;AAC5D,SACE,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,OAAO,MAAM,YAAY,aACxB,EAAE,cAAc,UAAU,OAAO,MAAM,aAAa;AAEzD;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PendingCacheEntry, LLMCache } from './cache.js';
|
|
2
|
+
import { LLMessage, LLMRequestOptions } from './types.js';
|
|
3
|
+
import 'ai';
|
|
4
|
+
|
|
5
|
+
interface LLMContextRequestInput<S extends string> {
|
|
6
|
+
messages: readonly LLMessage[];
|
|
7
|
+
options: LLMRequestOptions<S>;
|
|
8
|
+
pendingCacheEntries?: Map<string, PendingCacheEntry>;
|
|
9
|
+
logFiles?: string[];
|
|
10
|
+
}
|
|
11
|
+
type LLMContextRequest<S extends string> = (input: LLMContextRequestInput<S>) => Promise<string>;
|
|
12
|
+
declare class LLMContext<S extends string> {
|
|
13
|
+
#private;
|
|
14
|
+
readonly sessionId: number;
|
|
15
|
+
constructor(sessionId: number, requestFn: LLMContextRequest<S>, cache?: LLMCache);
|
|
16
|
+
request(messages: readonly LLMessage[], options?: LLMRequestOptions<S>): Promise<string>;
|
|
17
|
+
commit(): Promise<void>;
|
|
18
|
+
rollback(): Promise<void>;
|
|
19
|
+
run<T>(operation: (context: LLMContext<S>) => Promise<T>): Promise<T>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { LLMContext, type LLMContextRequestInput };
|