@gguf/coder 0.2.9 → 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/.editorconfig +16 -0
- package/.env.example +63 -0
- package/.gitattributes +1 -0
- package/.semgrepignore +19 -0
- package/coder-dummy-file.ts +52 -0
- package/coder.config.example.json +59 -0
- package/coder.config.json +13 -0
- package/color_picker.html +36 -0
- package/dist/tools/execute-bash.js +3 -3
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/fetch-url.js +3 -3
- package/dist/tools/fetch-url.js.map +1 -1
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +1 -1
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/lsp-get-diagnostics.js +1 -1
- package/dist/tools/lsp-get-diagnostics.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +6 -6
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/search-file-contents.d.ts.map +1 -1
- package/dist/tools/search-file-contents.js +1 -1
- package/dist/tools/search-file-contents.js.map +1 -1
- package/dist/tools/string-replace.js +11 -11
- package/dist/tools/string-replace.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +3 -3
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/write-file.js +4 -4
- package/dist/tools/write-file.js.map +1 -1
- package/dist/utils/tool-result-display.d.ts.map +1 -1
- package/dist/utils/tool-result-display.js +3 -3
- package/dist/utils/tool-result-display.js.map +1 -1
- package/package.json +2 -14
- package/scripts/extract-changelog.js +73 -0
- package/scripts/fetch-models.js +143 -0
- package/scripts/test.sh +40 -0
- package/scripts/update-homebrew-formula.sh +125 -0
- package/scripts/update-nix-version.sh +157 -0
- package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
- package/source/ai-sdk-client/AISDKClient.ts +155 -0
- package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
- package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
- package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
- package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
- package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
- package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
- package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
- package/source/ai-sdk-client/converters/message-converter.ts +113 -0
- package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
- package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
- package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
- package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
- package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
- package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
- package/source/ai-sdk-client/index.ts +7 -0
- package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
- package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
- package/source/ai-sdk-client/types.ts +9 -0
- package/source/ai-sdk-client-empty-message.spec.ts +141 -0
- package/source/ai-sdk-client-error-handling.spec.ts +186 -0
- package/source/ai-sdk-client-maxretries.spec.ts +114 -0
- package/source/ai-sdk-client-preparestep.spec.ts +279 -0
- package/source/app/App.spec.tsx +32 -0
- package/source/app/App.tsx +480 -0
- package/source/app/components/AppContainer.spec.tsx +96 -0
- package/source/app/components/AppContainer.tsx +56 -0
- package/source/app/components/ChatInterface.spec.tsx +163 -0
- package/source/app/components/ChatInterface.tsx +144 -0
- package/source/app/components/ModalSelectors.spec.tsx +141 -0
- package/source/app/components/ModalSelectors.tsx +135 -0
- package/source/app/helpers.spec.ts +97 -0
- package/source/app/helpers.ts +63 -0
- package/source/app/index.ts +4 -0
- package/source/app/types.ts +39 -0
- package/source/app/utils/appUtils.ts +294 -0
- package/source/app/utils/conversationState.ts +310 -0
- package/source/app.spec.tsx +244 -0
- package/source/cli.spec.ts +73 -0
- package/source/cli.tsx +51 -0
- package/source/client-factory.spec.ts +48 -0
- package/source/client-factory.ts +178 -0
- package/source/command-parser.spec.ts +127 -0
- package/source/command-parser.ts +36 -0
- package/source/commands/checkpoint.spec.tsx +277 -0
- package/source/commands/checkpoint.tsx +366 -0
- package/source/commands/clear.tsx +22 -0
- package/source/commands/custom-commands.tsx +121 -0
- package/source/commands/exit.ts +21 -0
- package/source/commands/export.spec.tsx +131 -0
- package/source/commands/export.tsx +79 -0
- package/source/commands/help.tsx +120 -0
- package/source/commands/index.ts +17 -0
- package/source/commands/init.tsx +339 -0
- package/source/commands/lsp-command.spec.tsx +281 -0
- package/source/commands/lsp.tsx +120 -0
- package/source/commands/mcp-command.spec.tsx +313 -0
- package/source/commands/mcp.tsx +162 -0
- package/source/commands/model-database.spec.tsx +758 -0
- package/source/commands/model-database.tsx +418 -0
- package/source/commands/model.ts +12 -0
- package/source/commands/provider.ts +12 -0
- package/source/commands/setup-config.tsx +16 -0
- package/source/commands/simple-commands.spec.tsx +175 -0
- package/source/commands/status.ts +12 -0
- package/source/commands/theme.ts +12 -0
- package/source/commands/update.spec.tsx +261 -0
- package/source/commands/update.tsx +201 -0
- package/source/commands/usage.spec.tsx +495 -0
- package/source/commands/usage.tsx +100 -0
- package/source/commands.spec.ts +436 -0
- package/source/commands.ts +83 -0
- package/source/components/assistant-message.spec.tsx +796 -0
- package/source/components/assistant-message.tsx +34 -0
- package/source/components/bash-execution-indicator.tsx +21 -0
- package/source/components/cancelling-indicator.tsx +16 -0
- package/source/components/chat-queue.spec.tsx +83 -0
- package/source/components/chat-queue.tsx +36 -0
- package/source/components/checkpoint-display.spec.tsx +219 -0
- package/source/components/checkpoint-display.tsx +126 -0
- package/source/components/checkpoint-selector.spec.tsx +173 -0
- package/source/components/checkpoint-selector.tsx +173 -0
- package/source/components/development-mode-indicator.spec.tsx +268 -0
- package/source/components/development-mode-indicator.tsx +38 -0
- package/source/components/message-box.spec.tsx +427 -0
- package/source/components/message-box.tsx +87 -0
- package/source/components/model-selector.tsx +132 -0
- package/source/components/provider-selector.tsx +75 -0
- package/source/components/random-spinner.tsx +19 -0
- package/source/components/security-disclaimer.tsx +73 -0
- package/source/components/status-connection-display.spec.tsx +133 -0
- package/source/components/status.tsx +267 -0
- package/source/components/theme-selector.tsx +126 -0
- package/source/components/tool-confirmation.tsx +190 -0
- package/source/components/tool-execution-indicator.tsx +33 -0
- package/source/components/tool-message.tsx +85 -0
- package/source/components/ui/titled-box.spec.tsx +207 -0
- package/source/components/ui/titled-box.tsx +57 -0
- package/source/components/usage/progress-bar.spec.tsx +398 -0
- package/source/components/usage/progress-bar.tsx +30 -0
- package/source/components/usage/usage-display.spec.tsx +780 -0
- package/source/components/usage/usage-display.tsx +291 -0
- package/source/components/user-input.spec.tsx +327 -0
- package/source/components/user-input.tsx +533 -0
- package/source/components/user-message.spec.tsx +230 -0
- package/source/components/user-message.tsx +84 -0
- package/source/components/welcome-message.tsx +76 -0
- package/source/config/env-substitution.ts +65 -0
- package/source/config/index.spec.ts +171 -0
- package/source/config/index.ts +154 -0
- package/source/config/paths.spec.ts +241 -0
- package/source/config/paths.ts +55 -0
- package/source/config/preferences.ts +51 -0
- package/source/config/themes.ts +315 -0
- package/source/constants.ts +130 -0
- package/source/context/mode-context.spec.ts +79 -0
- package/source/context/mode-context.ts +24 -0
- package/source/custom-commands/executor.spec.ts +142 -0
- package/source/custom-commands/executor.ts +64 -0
- package/source/custom-commands/loader.spec.ts +314 -0
- package/source/custom-commands/loader.ts +153 -0
- package/source/custom-commands/parser.ts +196 -0
- package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
- package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
- package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
- package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
- package/source/hooks/chat-handler/index.ts +12 -0
- package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
- package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
- package/source/hooks/chat-handler/types.ts +38 -0
- package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
- package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
- package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
- package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
- package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
- package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
- package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
- package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
- package/source/hooks/useAppHandlers.tsx +291 -0
- package/source/hooks/useAppInitialization.tsx +422 -0
- package/source/hooks/useAppState.tsx +311 -0
- package/source/hooks/useDirectoryTrust.tsx +98 -0
- package/source/hooks/useInputState.ts +414 -0
- package/source/hooks/useModeHandlers.tsx +302 -0
- package/source/hooks/useNonInteractiveMode.ts +140 -0
- package/source/hooks/useTerminalWidth.tsx +81 -0
- package/source/hooks/useTheme.ts +18 -0
- package/source/hooks/useToolHandler.tsx +349 -0
- package/source/hooks/useUIState.ts +61 -0
- package/source/init/agents-template-generator.ts +421 -0
- package/source/init/existing-rules-extractor.ts +319 -0
- package/source/init/file-scanner.spec.ts +227 -0
- package/source/init/file-scanner.ts +238 -0
- package/source/init/framework-detector.ts +382 -0
- package/source/init/language-detector.ts +269 -0
- package/source/init/project-analyzer.spec.ts +231 -0
- package/source/init/project-analyzer.ts +458 -0
- package/source/lsp/index.ts +31 -0
- package/source/lsp/lsp-client.spec.ts +508 -0
- package/source/lsp/lsp-client.ts +487 -0
- package/source/lsp/lsp-manager.spec.ts +477 -0
- package/source/lsp/lsp-manager.ts +419 -0
- package/source/lsp/protocol.spec.ts +502 -0
- package/source/lsp/protocol.ts +360 -0
- package/source/lsp/server-discovery.spec.ts +654 -0
- package/source/lsp/server-discovery.ts +515 -0
- package/source/markdown-parser/html-entities.spec.ts +88 -0
- package/source/markdown-parser/html-entities.ts +45 -0
- package/source/markdown-parser/index.spec.ts +281 -0
- package/source/markdown-parser/index.ts +126 -0
- package/source/markdown-parser/table-parser.spec.ts +133 -0
- package/source/markdown-parser/table-parser.ts +114 -0
- package/source/markdown-parser/utils.spec.ts +70 -0
- package/source/markdown-parser/utils.ts +13 -0
- package/source/mcp/mcp-client.spec.ts +81 -0
- package/source/mcp/mcp-client.ts +625 -0
- package/source/mcp/transport-factory.spec.ts +406 -0
- package/source/mcp/transport-factory.ts +312 -0
- package/source/message-handler.ts +67 -0
- package/source/model-database/database-engine.spec.ts +494 -0
- package/source/model-database/database-engine.ts +50 -0
- package/source/model-database/model-database.spec.ts +363 -0
- package/source/model-database/model-database.ts +91 -0
- package/source/model-database/model-engine.spec.ts +447 -0
- package/source/model-database/model-engine.ts +65 -0
- package/source/model-database/model-fetcher.spec.ts +583 -0
- package/source/model-database/model-fetcher.ts +330 -0
- package/source/models/index.ts +1 -0
- package/source/models/models-cache.spec.ts +214 -0
- package/source/models/models-cache.ts +78 -0
- package/source/models/models-dev-client.spec.ts +379 -0
- package/source/models/models-dev-client.ts +329 -0
- package/source/models/models-types.ts +68 -0
- package/source/prompt-history.ts +155 -0
- package/source/security/command-injection.spec.ts +240 -0
- package/source/services/checkpoint-manager.spec.ts +523 -0
- package/source/services/checkpoint-manager.ts +466 -0
- package/source/services/file-snapshot.spec.ts +569 -0
- package/source/services/file-snapshot.ts +220 -0
- package/source/test-utils/render-with-theme.tsx +48 -0
- package/source/tokenization/index.ts +1 -0
- package/source/tokenization/tokenizer-factory.spec.ts +170 -0
- package/source/tokenization/tokenizer-factory.ts +125 -0
- package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
- package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
- package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
- package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
- package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
- package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
- package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
- package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
- package/source/tool-calling/index.ts +5 -0
- package/source/tool-calling/json-parser.spec.ts +639 -0
- package/source/tool-calling/json-parser.ts +247 -0
- package/source/tool-calling/tool-parser.spec.ts +395 -0
- package/source/tool-calling/tool-parser.ts +120 -0
- package/source/tool-calling/xml-parser.spec.ts +662 -0
- package/source/tool-calling/xml-parser.ts +289 -0
- package/source/tools/execute-bash.spec.tsx +353 -0
- package/source/tools/execute-bash.tsx +219 -0
- package/source/tools/execute-function.spec.ts +130 -0
- package/source/tools/fetch-url.spec.tsx +342 -0
- package/source/tools/fetch-url.tsx +172 -0
- package/source/tools/find-files.spec.tsx +924 -0
- package/source/tools/find-files.tsx +293 -0
- package/source/tools/index.ts +102 -0
- package/source/tools/lsp-get-diagnostics.tsx +192 -0
- package/source/tools/needs-approval.spec.ts +282 -0
- package/source/tools/read-file.spec.tsx +801 -0
- package/source/tools/read-file.tsx +387 -0
- package/source/tools/search-file-contents.spec.tsx +1273 -0
- package/source/tools/search-file-contents.tsx +293 -0
- package/source/tools/string-replace.spec.tsx +730 -0
- package/source/tools/string-replace.tsx +548 -0
- package/source/tools/tool-manager.ts +210 -0
- package/source/tools/tool-registry.spec.ts +415 -0
- package/source/tools/tool-registry.ts +228 -0
- package/source/tools/web-search.tsx +223 -0
- package/source/tools/write-file.spec.tsx +559 -0
- package/source/tools/write-file.tsx +228 -0
- package/source/types/app.ts +37 -0
- package/source/types/checkpoint.ts +48 -0
- package/source/types/commands.ts +46 -0
- package/source/types/components.ts +27 -0
- package/source/types/config.ts +103 -0
- package/source/types/core-connection-status.spec.ts +67 -0
- package/source/types/core.ts +181 -0
- package/source/types/hooks.ts +50 -0
- package/source/types/index.ts +12 -0
- package/source/types/markdown-parser.ts +11 -0
- package/source/types/mcp.ts +52 -0
- package/source/types/system.ts +16 -0
- package/source/types/tokenization.ts +41 -0
- package/source/types/ui.ts +40 -0
- package/source/types/usage.ts +58 -0
- package/source/types/utils.ts +16 -0
- package/source/usage/calculator.spec.ts +385 -0
- package/source/usage/calculator.ts +104 -0
- package/source/usage/storage.spec.ts +703 -0
- package/source/usage/storage.ts +238 -0
- package/source/usage/tracker.spec.ts +456 -0
- package/source/usage/tracker.ts +102 -0
- package/source/utils/atomic-deletion.spec.ts +194 -0
- package/source/utils/atomic-deletion.ts +127 -0
- package/source/utils/bounded-map.spec.ts +300 -0
- package/source/utils/bounded-map.ts +193 -0
- package/source/utils/checkpoint-utils.spec.ts +222 -0
- package/source/utils/checkpoint-utils.ts +92 -0
- package/source/utils/error-formatter.spec.ts +169 -0
- package/source/utils/error-formatter.ts +194 -0
- package/source/utils/file-autocomplete.spec.ts +173 -0
- package/source/utils/file-autocomplete.ts +196 -0
- package/source/utils/file-cache.spec.ts +309 -0
- package/source/utils/file-cache.ts +195 -0
- package/source/utils/file-content-loader.spec.ts +180 -0
- package/source/utils/file-content-loader.ts +179 -0
- package/source/utils/file-mention-handler.spec.ts +261 -0
- package/source/utils/file-mention-handler.ts +84 -0
- package/source/utils/file-mention-parser.spec.ts +182 -0
- package/source/utils/file-mention-parser.ts +170 -0
- package/source/utils/fuzzy-matching.spec.ts +149 -0
- package/source/utils/fuzzy-matching.ts +146 -0
- package/source/utils/indentation-normalizer.spec.ts +216 -0
- package/source/utils/indentation-normalizer.ts +76 -0
- package/source/utils/installation-detector.spec.ts +178 -0
- package/source/utils/installation-detector.ts +153 -0
- package/source/utils/logging/config.spec.ts +311 -0
- package/source/utils/logging/config.ts +210 -0
- package/source/utils/logging/console-facade.spec.ts +184 -0
- package/source/utils/logging/console-facade.ts +384 -0
- package/source/utils/logging/correlation.spec.ts +679 -0
- package/source/utils/logging/correlation.ts +474 -0
- package/source/utils/logging/formatters.spec.ts +464 -0
- package/source/utils/logging/formatters.ts +207 -0
- package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
- package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
- package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
- package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
- package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
- package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
- package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
- package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
- package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
- package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
- package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
- package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
- package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
- package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
- package/source/utils/logging/health-monitor/index.ts +15 -0
- package/source/utils/logging/health-monitor/instances.ts +48 -0
- package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
- package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
- package/source/utils/logging/health-monitor/types.ts +126 -0
- package/source/utils/logging/index.spec.ts +284 -0
- package/source/utils/logging/index.ts +236 -0
- package/source/utils/logging/integration.spec.ts +441 -0
- package/source/utils/logging/log-method-factory.spec.ts +573 -0
- package/source/utils/logging/log-method-factory.ts +233 -0
- package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
- package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
- package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
- package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
- package/source/utils/logging/log-query/index.ts +23 -0
- package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
- package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
- package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
- package/source/utils/logging/log-query/query/query-builder.ts +151 -0
- package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
- package/source/utils/logging/log-query/query/query-engine.ts +45 -0
- package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
- package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
- package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
- package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
- package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
- package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
- package/source/utils/logging/log-query/types.ts +163 -0
- package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
- package/source/utils/logging/log-query/utils/helpers.ts +72 -0
- package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
- package/source/utils/logging/log-query/utils/sorting.ts +61 -0
- package/source/utils/logging/logger-provider.spec.ts +262 -0
- package/source/utils/logging/logger-provider.ts +362 -0
- package/source/utils/logging/performance.spec.ts +209 -0
- package/source/utils/logging/performance.ts +757 -0
- package/source/utils/logging/pino-logger.spec.ts +425 -0
- package/source/utils/logging/pino-logger.ts +514 -0
- package/source/utils/logging/redaction.spec.ts +490 -0
- package/source/utils/logging/redaction.ts +267 -0
- package/source/utils/logging/request-tracker.spec.ts +1198 -0
- package/source/utils/logging/request-tracker.ts +803 -0
- package/source/utils/logging/transports.spec.ts +505 -0
- package/source/utils/logging/transports.ts +305 -0
- package/source/utils/logging/types.ts +216 -0
- package/source/utils/message-builder.spec.ts +179 -0
- package/source/utils/message-builder.ts +101 -0
- package/source/utils/message-queue.tsx +486 -0
- package/source/utils/paste-detection.spec.ts +69 -0
- package/source/utils/paste-detection.ts +124 -0
- package/source/utils/paste-roundtrip.spec.ts +442 -0
- package/source/utils/paste-utils.spec.ts +128 -0
- package/source/utils/paste-utils.ts +52 -0
- package/source/utils/programming-language-helper.spec.ts +74 -0
- package/source/utils/programming-language-helper.ts +32 -0
- package/source/utils/prompt-assembly.spec.ts +221 -0
- package/source/utils/prompt-processor.ts +173 -0
- package/source/utils/tool-args-parser.spec.ts +136 -0
- package/source/utils/tool-args-parser.ts +54 -0
- package/source/utils/tool-cancellation.spec.ts +230 -0
- package/source/utils/tool-cancellation.ts +28 -0
- package/source/utils/tool-result-display.spec.tsx +469 -0
- package/source/utils/tool-result-display.tsx +90 -0
- package/source/utils/update-checker.spec.ts +383 -0
- package/source/utils/update-checker.ts +183 -0
- package/source/wizard/config-wizard.spec.tsx +103 -0
- package/source/wizard/config-wizard.tsx +382 -0
- package/source/wizard/steps/location-step.spec.tsx +186 -0
- package/source/wizard/steps/location-step.tsx +147 -0
- package/source/wizard/steps/mcp-step.spec.tsx +607 -0
- package/source/wizard/steps/mcp-step.tsx +632 -0
- package/source/wizard/steps/provider-step.spec.tsx +342 -0
- package/source/wizard/steps/provider-step.tsx +957 -0
- package/source/wizard/steps/summary-step.spec.tsx +749 -0
- package/source/wizard/steps/summary-step.tsx +228 -0
- package/source/wizard/templates/mcp-templates.spec.ts +613 -0
- package/source/wizard/templates/mcp-templates.ts +570 -0
- package/source/wizard/templates/provider-templates.spec.ts +152 -0
- package/source/wizard/templates/provider-templates.ts +485 -0
- package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
- package/source/wizard/utils/fetch-cloud-models.ts +223 -0
- package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
- package/source/wizard/utils/fetch-local-models.ts +192 -0
- package/source/wizard/validation-array.spec.ts +264 -0
- package/source/wizard/validation.spec.ts +373 -0
- package/source/wizard/validation.ts +232 -0
- package/source/app/prompts/main-prompt.md +0 -122
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for llama-tokenizer.ts
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {Message} from '@/types/core.js';
|
|
6
|
+
import test from 'ava';
|
|
7
|
+
import {LlamaTokenizer} from './llama-tokenizer.js';
|
|
8
|
+
|
|
9
|
+
console.log(`\nllama-tokenizer.spec.ts`);
|
|
10
|
+
|
|
11
|
+
test('LlamaTokenizer encodes simple text', t => {
|
|
12
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
13
|
+
const count = tokenizer.encode('Hello, world!');
|
|
14
|
+
|
|
15
|
+
// Should return a positive token count
|
|
16
|
+
t.true(count > 0);
|
|
17
|
+
t.true(count < 10);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('LlamaTokenizer encodes empty string', t => {
|
|
21
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
22
|
+
const count = tokenizer.encode('');
|
|
23
|
+
|
|
24
|
+
t.is(count, 0);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('LlamaTokenizer encodes longer text', t => {
|
|
28
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
29
|
+
const text =
|
|
30
|
+
'This is a longer piece of text that should have more tokens than a simple hello world.';
|
|
31
|
+
const count = tokenizer.encode(text);
|
|
32
|
+
|
|
33
|
+
// Should have significantly more tokens
|
|
34
|
+
t.true(count > 10);
|
|
35
|
+
t.true(count < 50);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('LlamaTokenizer defaults to llama when no model specified', t => {
|
|
39
|
+
const tokenizer = new LlamaTokenizer();
|
|
40
|
+
|
|
41
|
+
t.is(tokenizer.getName(), 'llama-llama');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('LlamaTokenizer getName returns correct format', t => {
|
|
45
|
+
const tokenizer = new LlamaTokenizer('llama-3-70b');
|
|
46
|
+
|
|
47
|
+
t.is(tokenizer.getName(), 'llama-llama-3-70b');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('LlamaTokenizer countTokens for user message', t => {
|
|
51
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
52
|
+
const message: Message = {
|
|
53
|
+
role: 'user',
|
|
54
|
+
content: 'Hello, how are you?',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const count = tokenizer.countTokens(message);
|
|
58
|
+
|
|
59
|
+
// Should include content tokens + role tokens + overhead
|
|
60
|
+
t.true(count > 5);
|
|
61
|
+
t.true(count < 25);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('LlamaTokenizer countTokens for assistant message', t => {
|
|
65
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
66
|
+
const message: Message = {
|
|
67
|
+
role: 'assistant',
|
|
68
|
+
content: 'I am doing well, thank you!',
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const count = tokenizer.countTokens(message);
|
|
72
|
+
|
|
73
|
+
t.true(count > 5);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('LlamaTokenizer countTokens for system message', t => {
|
|
77
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
78
|
+
const message: Message = {
|
|
79
|
+
role: 'system',
|
|
80
|
+
content: 'You are a helpful assistant.',
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const count = tokenizer.countTokens(message);
|
|
84
|
+
|
|
85
|
+
t.true(count > 5);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test('LlamaTokenizer countTokens handles empty content', t => {
|
|
89
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
90
|
+
const message: Message = {
|
|
91
|
+
role: 'user',
|
|
92
|
+
content: '',
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const count = tokenizer.countTokens(message);
|
|
96
|
+
|
|
97
|
+
// Should still have overhead for role and message structure
|
|
98
|
+
t.true(count >= 6);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test('LlamaTokenizer countTokens handles missing content', t => {
|
|
102
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
103
|
+
const message: Message = {
|
|
104
|
+
role: 'user',
|
|
105
|
+
} as Message;
|
|
106
|
+
|
|
107
|
+
const count = tokenizer.countTokens(message);
|
|
108
|
+
|
|
109
|
+
// Should handle gracefully
|
|
110
|
+
t.true(count >= 0);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('LlamaTokenizer countTokens includes message overhead', t => {
|
|
114
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
115
|
+
const shortMessage: Message = {
|
|
116
|
+
role: 'user',
|
|
117
|
+
content: 'Hi',
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const count = tokenizer.countTokens(shortMessage);
|
|
121
|
+
const contentOnly = tokenizer.encode('Hi');
|
|
122
|
+
const roleOnly = tokenizer.encode('user');
|
|
123
|
+
|
|
124
|
+
// Total should be more than just content + role due to overhead
|
|
125
|
+
t.true(count > contentOnly + roleOnly);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('LlamaTokenizer handles special characters', t => {
|
|
129
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
130
|
+
const text = '你好世界 🌍 Привет мир';
|
|
131
|
+
const count = tokenizer.encode(text);
|
|
132
|
+
|
|
133
|
+
t.true(count > 0);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test('LlamaTokenizer handles code snippets', t => {
|
|
137
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
138
|
+
const code = `
|
|
139
|
+
function hello() {
|
|
140
|
+
console.log("Hello, world!");
|
|
141
|
+
}
|
|
142
|
+
`;
|
|
143
|
+
const count = tokenizer.encode(code);
|
|
144
|
+
|
|
145
|
+
t.true(count > 10);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('LlamaTokenizer works with mistral model', t => {
|
|
149
|
+
const tokenizer = new LlamaTokenizer('mistral-7b');
|
|
150
|
+
const count = tokenizer.encode('Hello, world!');
|
|
151
|
+
|
|
152
|
+
t.true(count > 0);
|
|
153
|
+
t.is(tokenizer.getName(), 'llama-mistral-7b');
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test('LlamaTokenizer works with qwen model', t => {
|
|
157
|
+
const tokenizer = new LlamaTokenizer('qwen-2.5');
|
|
158
|
+
const count = tokenizer.encode('Hello, world!');
|
|
159
|
+
|
|
160
|
+
t.true(count > 0);
|
|
161
|
+
t.is(tokenizer.getName(), 'llama-qwen-2.5');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test('LlamaTokenizer works with codellama model', t => {
|
|
165
|
+
const tokenizer = new LlamaTokenizer('codellama-7b');
|
|
166
|
+
const count = tokenizer.encode('Hello, world!');
|
|
167
|
+
|
|
168
|
+
t.true(count > 0);
|
|
169
|
+
t.is(tokenizer.getName(), 'llama-codellama-7b');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('LlamaTokenizer handles long messages', t => {
|
|
173
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
174
|
+
const longText = 'Hello '.repeat(1000);
|
|
175
|
+
const message: Message = {
|
|
176
|
+
role: 'user',
|
|
177
|
+
content: longText,
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const count = tokenizer.countTokens(message);
|
|
181
|
+
|
|
182
|
+
// Should handle long text without crashing
|
|
183
|
+
t.true(count > 1000);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test('LlamaTokenizer uses fallback on encoding error', t => {
|
|
187
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
188
|
+
|
|
189
|
+
// The fallback should kick in for any edge cases
|
|
190
|
+
// Testing with normal text should still work
|
|
191
|
+
const count = tokenizer.encode('Normal text');
|
|
192
|
+
|
|
193
|
+
t.true(count > 0);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test('LlamaTokenizer countTokens with tool message', t => {
|
|
197
|
+
const tokenizer = new LlamaTokenizer('llama-3-8b');
|
|
198
|
+
const message: Message = {
|
|
199
|
+
role: 'tool',
|
|
200
|
+
content: 'Tool result here',
|
|
201
|
+
tool_call_id: '123',
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const count = tokenizer.countTokens(message);
|
|
205
|
+
|
|
206
|
+
// Should handle tool messages
|
|
207
|
+
t.true(count > 0);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test('LlamaTokenizer handles deepseek model', t => {
|
|
211
|
+
const tokenizer = new LlamaTokenizer('deepseek-coder-33b');
|
|
212
|
+
const count = tokenizer.encode('const x = 42;');
|
|
213
|
+
|
|
214
|
+
t.true(count > 0);
|
|
215
|
+
t.is(tokenizer.getName(), 'llama-deepseek-coder-33b');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('LlamaTokenizer handles mixtral model', t => {
|
|
219
|
+
const tokenizer = new LlamaTokenizer('mixtral-8x7b');
|
|
220
|
+
const count = tokenizer.encode('Hello, world!');
|
|
221
|
+
|
|
222
|
+
t.true(count > 0);
|
|
223
|
+
t.is(tokenizer.getName(), 'llama-mixtral-8x7b');
|
|
224
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Llama tokenizer for local models
|
|
3
|
+
* Uses llama-tokenizer-js package
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {Message} from '@/types/core';
|
|
7
|
+
import llamaTokenizer from 'llama-tokenizer-js';
|
|
8
|
+
import type {Tokenizer} from '../../types/tokenization';
|
|
9
|
+
|
|
10
|
+
export class LlamaTokenizer implements Tokenizer {
|
|
11
|
+
private modelName: string;
|
|
12
|
+
|
|
13
|
+
constructor(modelId?: string) {
|
|
14
|
+
this.modelName = modelId || 'llama';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
encode(text: string): number {
|
|
18
|
+
try {
|
|
19
|
+
const tokens = llamaTokenizer.encode(text);
|
|
20
|
+
return tokens.length;
|
|
21
|
+
} catch {
|
|
22
|
+
// Fallback to character-based estimation if tokenization fails
|
|
23
|
+
return Math.ceil(text.length / 4);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
countTokens(message: Message): number {
|
|
28
|
+
const content = message.content || '';
|
|
29
|
+
const role = message.role || '';
|
|
30
|
+
|
|
31
|
+
// Llama format: <|start_header_id|>role<|end_header_id|>content<|eot_id|>
|
|
32
|
+
// Approximate overhead for message formatting
|
|
33
|
+
const messageOverhead = 6;
|
|
34
|
+
|
|
35
|
+
return this.encode(content) + this.encode(role) + messageOverhead;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
getName(): string {
|
|
39
|
+
return `llama-${this.modelName}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for openai-tokenizer.ts
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {Message} from '@/types/core.js';
|
|
6
|
+
import test from 'ava';
|
|
7
|
+
import {OpenAITokenizer} from './openai-tokenizer.js';
|
|
8
|
+
|
|
9
|
+
console.log(`\nopenai-tokenizer.spec.ts`);
|
|
10
|
+
|
|
11
|
+
test('OpenAITokenizer encodes simple text', t => {
|
|
12
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
13
|
+
const count = tokenizer.encode('Hello, world!');
|
|
14
|
+
|
|
15
|
+
// "Hello, world!" should tokenize to around 4 tokens
|
|
16
|
+
t.true(count > 0);
|
|
17
|
+
t.true(count < 10);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('OpenAITokenizer encodes empty string', t => {
|
|
21
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
22
|
+
const count = tokenizer.encode('');
|
|
23
|
+
|
|
24
|
+
t.is(count, 0);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('OpenAITokenizer encodes longer text', t => {
|
|
28
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
29
|
+
const text =
|
|
30
|
+
'This is a longer piece of text that should have more tokens than a simple hello world.';
|
|
31
|
+
const count = tokenizer.encode(text);
|
|
32
|
+
|
|
33
|
+
// Should have significantly more tokens
|
|
34
|
+
t.true(count > 10);
|
|
35
|
+
t.true(count < 50);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('OpenAITokenizer uses fallback encoding for unsupported model', t => {
|
|
39
|
+
const tokenizer = new OpenAITokenizer('unknown-model-xyz');
|
|
40
|
+
const count = tokenizer.encode('Hello, world!');
|
|
41
|
+
|
|
42
|
+
// Should still return a count using fallback
|
|
43
|
+
t.true(count > 0);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('OpenAITokenizer defaults to gpt-4 when no model specified', t => {
|
|
47
|
+
const tokenizer = new OpenAITokenizer();
|
|
48
|
+
|
|
49
|
+
t.is(tokenizer.getName(), 'openai-gpt-4');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('OpenAITokenizer getName returns correct format', t => {
|
|
53
|
+
const tokenizer = new OpenAITokenizer('gpt-3.5-turbo');
|
|
54
|
+
|
|
55
|
+
t.is(tokenizer.getName(), 'openai-gpt-3.5-turbo');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('OpenAITokenizer countTokens for user message', t => {
|
|
59
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
60
|
+
const message: Message = {
|
|
61
|
+
role: 'user',
|
|
62
|
+
content: 'Hello, how are you?',
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const count = tokenizer.countTokens(message);
|
|
66
|
+
|
|
67
|
+
// Should include content tokens + role tokens + overhead
|
|
68
|
+
t.true(count > 5);
|
|
69
|
+
t.true(count < 20);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('OpenAITokenizer countTokens for assistant message', t => {
|
|
73
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
74
|
+
const message: Message = {
|
|
75
|
+
role: 'assistant',
|
|
76
|
+
content: 'I am doing well, thank you!',
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const count = tokenizer.countTokens(message);
|
|
80
|
+
|
|
81
|
+
t.true(count > 5);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('OpenAITokenizer countTokens for system message', t => {
|
|
85
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
86
|
+
const message: Message = {
|
|
87
|
+
role: 'system',
|
|
88
|
+
content: 'You are a helpful assistant.',
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const count = tokenizer.countTokens(message);
|
|
92
|
+
|
|
93
|
+
t.true(count > 5);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('OpenAITokenizer countTokens handles empty content', t => {
|
|
97
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
98
|
+
const message: Message = {
|
|
99
|
+
role: 'user',
|
|
100
|
+
content: '',
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const count = tokenizer.countTokens(message);
|
|
104
|
+
|
|
105
|
+
// Should still have overhead for role and message structure
|
|
106
|
+
t.true(count >= 4);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('OpenAITokenizer countTokens handles missing content', t => {
|
|
110
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
111
|
+
const message: Message = {
|
|
112
|
+
role: 'user',
|
|
113
|
+
} as Message;
|
|
114
|
+
|
|
115
|
+
const count = tokenizer.countTokens(message);
|
|
116
|
+
|
|
117
|
+
// Should handle gracefully
|
|
118
|
+
t.true(count >= 0);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test('OpenAITokenizer countTokens includes message overhead', t => {
|
|
122
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
123
|
+
const shortMessage: Message = {
|
|
124
|
+
role: 'user',
|
|
125
|
+
content: 'Hi',
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const count = tokenizer.countTokens(shortMessage);
|
|
129
|
+
const contentOnly = tokenizer.encode('Hi');
|
|
130
|
+
const roleOnly = tokenizer.encode('user');
|
|
131
|
+
|
|
132
|
+
// Total should be more than just content + role due to overhead
|
|
133
|
+
t.true(count > contentOnly + roleOnly);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test('OpenAITokenizer free method exists', t => {
|
|
137
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
138
|
+
|
|
139
|
+
t.notThrows(() => {
|
|
140
|
+
tokenizer.free();
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('OpenAITokenizer handles special characters', t => {
|
|
145
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
146
|
+
const text = '你好世界 🌍 Привет мир';
|
|
147
|
+
const count = tokenizer.encode(text);
|
|
148
|
+
|
|
149
|
+
t.true(count > 0);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('OpenAITokenizer handles code snippets', t => {
|
|
153
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
154
|
+
const code = `
|
|
155
|
+
function hello() {
|
|
156
|
+
console.log("Hello, world!");
|
|
157
|
+
}
|
|
158
|
+
`;
|
|
159
|
+
const count = tokenizer.encode(code);
|
|
160
|
+
|
|
161
|
+
t.true(count > 10);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test('OpenAITokenizer works with gpt-3.5-turbo model', t => {
|
|
165
|
+
const tokenizer = new OpenAITokenizer('gpt-3.5-turbo');
|
|
166
|
+
const count = tokenizer.encode('Hello, world!');
|
|
167
|
+
|
|
168
|
+
t.true(count > 0);
|
|
169
|
+
t.is(tokenizer.getName(), 'openai-gpt-3.5-turbo');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('OpenAITokenizer handles long messages', t => {
|
|
173
|
+
const tokenizer = new OpenAITokenizer('gpt-4');
|
|
174
|
+
const longText = 'Hello '.repeat(1000);
|
|
175
|
+
const message: Message = {
|
|
176
|
+
role: 'user',
|
|
177
|
+
content: longText,
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const count = tokenizer.countTokens(message);
|
|
181
|
+
|
|
182
|
+
// Should handle long text without crashing
|
|
183
|
+
t.true(count > 1000);
|
|
184
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI tokenizer using tiktoken
|
|
3
|
+
* Supports GPT-3.5, GPT-4, and other OpenAI models
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {Message} from '@/types/core';
|
|
7
|
+
import {type TiktokenModel, encoding_for_model, get_encoding} from 'tiktoken';
|
|
8
|
+
import type {Tokenizer} from '../../types/tokenization';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* OpenAI tokenizer using tiktoken for accurate token counting
|
|
12
|
+
*/
|
|
13
|
+
export class OpenAITokenizer implements Tokenizer {
|
|
14
|
+
private encoding: ReturnType<typeof get_encoding>;
|
|
15
|
+
private modelName: string;
|
|
16
|
+
|
|
17
|
+
constructor(modelId?: string) {
|
|
18
|
+
this.modelName = modelId || 'gpt-4';
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
this.encoding = encoding_for_model(modelId as TiktokenModel);
|
|
22
|
+
} catch {
|
|
23
|
+
this.encoding = get_encoding('cl100k_base');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
encode(text: string): number {
|
|
28
|
+
try {
|
|
29
|
+
const tokens = this.encoding.encode(text);
|
|
30
|
+
return tokens.length;
|
|
31
|
+
} catch {
|
|
32
|
+
return Math.ceil(text.length / 4);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
countTokens(message: Message): number {
|
|
37
|
+
const content = message.content || '';
|
|
38
|
+
const role = message.role || '';
|
|
39
|
+
|
|
40
|
+
// OpenAI format: each message has overhead for role markers
|
|
41
|
+
// <|im_start|>role\ncontent<|im_end|>
|
|
42
|
+
const messageOverhead = 4; // Approximate overhead per message
|
|
43
|
+
|
|
44
|
+
return this.encode(content) + this.encode(role) + messageOverhead;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
getName(): string {
|
|
48
|
+
return `openai-${this.modelName}`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Clean up encoding resources
|
|
53
|
+
*/
|
|
54
|
+
free(): void {
|
|
55
|
+
this.encoding.free();
|
|
56
|
+
}
|
|
57
|
+
}
|