@gguf/coder 0.3.1 → 0.3.2
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/package.json +2 -2
- package/pnpm-workspace.yaml +15 -0
- package/color_picker.html +0 -36
- package/scripts/extract-changelog.js +0 -73
- package/scripts/fetch-models.js +0 -143
- package/scripts/test.sh +0 -40
- package/scripts/update-homebrew-formula.sh +0 -125
- package/scripts/update-nix-version.sh +0 -157
- package/source/ai-sdk-client/AISDKClient.spec.ts +0 -117
- package/source/ai-sdk-client/AISDKClient.ts +0 -155
- package/source/ai-sdk-client/chat/chat-handler.spec.ts +0 -121
- package/source/ai-sdk-client/chat/chat-handler.ts +0 -276
- package/source/ai-sdk-client/chat/streaming-handler.spec.ts +0 -173
- package/source/ai-sdk-client/chat/streaming-handler.ts +0 -110
- package/source/ai-sdk-client/chat/tool-processor.spec.ts +0 -92
- package/source/ai-sdk-client/chat/tool-processor.ts +0 -70
- package/source/ai-sdk-client/converters/message-converter.spec.ts +0 -220
- package/source/ai-sdk-client/converters/message-converter.ts +0 -113
- package/source/ai-sdk-client/converters/tool-converter.spec.ts +0 -90
- package/source/ai-sdk-client/converters/tool-converter.ts +0 -46
- package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +0 -55
- package/source/ai-sdk-client/error-handling/error-extractor.ts +0 -15
- package/source/ai-sdk-client/error-handling/error-parser.spec.ts +0 -169
- package/source/ai-sdk-client/error-handling/error-parser.ts +0 -161
- package/source/ai-sdk-client/index.ts +0 -7
- package/source/ai-sdk-client/providers/provider-factory.spec.ts +0 -71
- package/source/ai-sdk-client/providers/provider-factory.ts +0 -41
- package/source/ai-sdk-client/types.ts +0 -9
- package/source/ai-sdk-client-empty-message.spec.ts +0 -141
- package/source/ai-sdk-client-error-handling.spec.ts +0 -186
- package/source/ai-sdk-client-maxretries.spec.ts +0 -114
- package/source/ai-sdk-client-preparestep.spec.ts +0 -279
- package/source/app/App.spec.tsx +0 -32
- package/source/app/App.tsx +0 -480
- package/source/app/components/AppContainer.spec.tsx +0 -96
- package/source/app/components/AppContainer.tsx +0 -56
- package/source/app/components/ChatInterface.spec.tsx +0 -163
- package/source/app/components/ChatInterface.tsx +0 -144
- package/source/app/components/ModalSelectors.spec.tsx +0 -141
- package/source/app/components/ModalSelectors.tsx +0 -135
- package/source/app/helpers.spec.ts +0 -97
- package/source/app/helpers.ts +0 -63
- package/source/app/index.ts +0 -4
- package/source/app/types.ts +0 -39
- package/source/app/utils/appUtils.ts +0 -294
- package/source/app/utils/conversationState.ts +0 -310
- package/source/app.spec.tsx +0 -244
- package/source/cli.spec.ts +0 -73
- package/source/cli.tsx +0 -51
- package/source/client-factory.spec.ts +0 -48
- package/source/client-factory.ts +0 -178
- package/source/command-parser.spec.ts +0 -127
- package/source/command-parser.ts +0 -36
- package/source/commands/checkpoint.spec.tsx +0 -277
- package/source/commands/checkpoint.tsx +0 -366
- package/source/commands/clear.tsx +0 -22
- package/source/commands/custom-commands.tsx +0 -121
- package/source/commands/exit.ts +0 -21
- package/source/commands/export.spec.tsx +0 -131
- package/source/commands/export.tsx +0 -79
- package/source/commands/help.tsx +0 -120
- package/source/commands/index.ts +0 -17
- package/source/commands/init.tsx +0 -339
- package/source/commands/lsp-command.spec.tsx +0 -281
- package/source/commands/lsp.tsx +0 -120
- package/source/commands/mcp-command.spec.tsx +0 -313
- package/source/commands/mcp.tsx +0 -162
- package/source/commands/model-database.spec.tsx +0 -758
- package/source/commands/model-database.tsx +0 -418
- package/source/commands/model.ts +0 -12
- package/source/commands/provider.ts +0 -12
- package/source/commands/setup-config.tsx +0 -16
- package/source/commands/simple-commands.spec.tsx +0 -175
- package/source/commands/status.ts +0 -12
- package/source/commands/theme.ts +0 -12
- package/source/commands/update.spec.tsx +0 -261
- package/source/commands/update.tsx +0 -201
- package/source/commands/usage.spec.tsx +0 -495
- package/source/commands/usage.tsx +0 -100
- package/source/commands.spec.ts +0 -436
- package/source/commands.ts +0 -83
- package/source/components/assistant-message.spec.tsx +0 -796
- package/source/components/assistant-message.tsx +0 -34
- package/source/components/bash-execution-indicator.tsx +0 -21
- package/source/components/cancelling-indicator.tsx +0 -16
- package/source/components/chat-queue.spec.tsx +0 -83
- package/source/components/chat-queue.tsx +0 -36
- package/source/components/checkpoint-display.spec.tsx +0 -219
- package/source/components/checkpoint-display.tsx +0 -126
- package/source/components/checkpoint-selector.spec.tsx +0 -173
- package/source/components/checkpoint-selector.tsx +0 -173
- package/source/components/development-mode-indicator.spec.tsx +0 -268
- package/source/components/development-mode-indicator.tsx +0 -38
- package/source/components/message-box.spec.tsx +0 -427
- package/source/components/message-box.tsx +0 -87
- package/source/components/model-selector.tsx +0 -132
- package/source/components/provider-selector.tsx +0 -75
- package/source/components/random-spinner.tsx +0 -19
- package/source/components/security-disclaimer.tsx +0 -73
- package/source/components/status-connection-display.spec.tsx +0 -133
- package/source/components/status.tsx +0 -267
- package/source/components/theme-selector.tsx +0 -126
- package/source/components/tool-confirmation.tsx +0 -190
- package/source/components/tool-execution-indicator.tsx +0 -33
- package/source/components/tool-message.tsx +0 -85
- package/source/components/ui/titled-box.spec.tsx +0 -207
- package/source/components/ui/titled-box.tsx +0 -57
- package/source/components/usage/progress-bar.spec.tsx +0 -398
- package/source/components/usage/progress-bar.tsx +0 -30
- package/source/components/usage/usage-display.spec.tsx +0 -780
- package/source/components/usage/usage-display.tsx +0 -291
- package/source/components/user-input.spec.tsx +0 -327
- package/source/components/user-input.tsx +0 -533
- package/source/components/user-message.spec.tsx +0 -230
- package/source/components/user-message.tsx +0 -84
- package/source/components/welcome-message.tsx +0 -76
- package/source/config/env-substitution.ts +0 -65
- package/source/config/index.spec.ts +0 -171
- package/source/config/index.ts +0 -154
- package/source/config/paths.spec.ts +0 -241
- package/source/config/paths.ts +0 -55
- package/source/config/preferences.ts +0 -51
- package/source/config/themes.ts +0 -315
- package/source/constants.ts +0 -130
- package/source/context/mode-context.spec.ts +0 -79
- package/source/context/mode-context.ts +0 -24
- package/source/custom-commands/executor.spec.ts +0 -142
- package/source/custom-commands/executor.ts +0 -64
- package/source/custom-commands/loader.spec.ts +0 -314
- package/source/custom-commands/loader.ts +0 -153
- package/source/custom-commands/parser.ts +0 -196
- package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +0 -39
- package/source/hooks/chat-handler/conversation/conversation-loop.tsx +0 -511
- package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +0 -50
- package/source/hooks/chat-handler/conversation/tool-executor.tsx +0 -109
- package/source/hooks/chat-handler/index.ts +0 -12
- package/source/hooks/chat-handler/state/streaming-state.spec.ts +0 -26
- package/source/hooks/chat-handler/state/streaming-state.ts +0 -19
- package/source/hooks/chat-handler/types.ts +0 -38
- package/source/hooks/chat-handler/useChatHandler.spec.tsx +0 -321
- package/source/hooks/chat-handler/useChatHandler.tsx +0 -194
- package/source/hooks/chat-handler/utils/context-checker.spec.ts +0 -60
- package/source/hooks/chat-handler/utils/context-checker.tsx +0 -73
- package/source/hooks/chat-handler/utils/message-helpers.spec.ts +0 -42
- package/source/hooks/chat-handler/utils/message-helpers.tsx +0 -36
- package/source/hooks/chat-handler/utils/tool-filters.spec.ts +0 -109
- package/source/hooks/chat-handler/utils/tool-filters.ts +0 -64
- package/source/hooks/useAppHandlers.tsx +0 -291
- package/source/hooks/useAppInitialization.tsx +0 -422
- package/source/hooks/useAppState.tsx +0 -311
- package/source/hooks/useDirectoryTrust.tsx +0 -98
- package/source/hooks/useInputState.ts +0 -414
- package/source/hooks/useModeHandlers.tsx +0 -302
- package/source/hooks/useNonInteractiveMode.ts +0 -140
- package/source/hooks/useTerminalWidth.tsx +0 -81
- package/source/hooks/useTheme.ts +0 -18
- package/source/hooks/useToolHandler.tsx +0 -349
- package/source/hooks/useUIState.ts +0 -61
- package/source/init/agents-template-generator.ts +0 -421
- package/source/init/existing-rules-extractor.ts +0 -319
- package/source/init/file-scanner.spec.ts +0 -227
- package/source/init/file-scanner.ts +0 -238
- package/source/init/framework-detector.ts +0 -382
- package/source/init/language-detector.ts +0 -269
- package/source/init/project-analyzer.spec.ts +0 -231
- package/source/init/project-analyzer.ts +0 -458
- package/source/lsp/index.ts +0 -31
- package/source/lsp/lsp-client.spec.ts +0 -508
- package/source/lsp/lsp-client.ts +0 -487
- package/source/lsp/lsp-manager.spec.ts +0 -477
- package/source/lsp/lsp-manager.ts +0 -419
- package/source/lsp/protocol.spec.ts +0 -502
- package/source/lsp/protocol.ts +0 -360
- package/source/lsp/server-discovery.spec.ts +0 -654
- package/source/lsp/server-discovery.ts +0 -515
- package/source/markdown-parser/html-entities.spec.ts +0 -88
- package/source/markdown-parser/html-entities.ts +0 -45
- package/source/markdown-parser/index.spec.ts +0 -281
- package/source/markdown-parser/index.ts +0 -126
- package/source/markdown-parser/table-parser.spec.ts +0 -133
- package/source/markdown-parser/table-parser.ts +0 -114
- package/source/markdown-parser/utils.spec.ts +0 -70
- package/source/markdown-parser/utils.ts +0 -13
- package/source/mcp/mcp-client.spec.ts +0 -81
- package/source/mcp/mcp-client.ts +0 -625
- package/source/mcp/transport-factory.spec.ts +0 -406
- package/source/mcp/transport-factory.ts +0 -312
- package/source/message-handler.ts +0 -67
- package/source/model-database/database-engine.spec.ts +0 -494
- package/source/model-database/database-engine.ts +0 -50
- package/source/model-database/model-database.spec.ts +0 -363
- package/source/model-database/model-database.ts +0 -91
- package/source/model-database/model-engine.spec.ts +0 -447
- package/source/model-database/model-engine.ts +0 -65
- package/source/model-database/model-fetcher.spec.ts +0 -583
- package/source/model-database/model-fetcher.ts +0 -330
- package/source/models/index.ts +0 -1
- package/source/models/models-cache.spec.ts +0 -214
- package/source/models/models-cache.ts +0 -78
- package/source/models/models-dev-client.spec.ts +0 -379
- package/source/models/models-dev-client.ts +0 -329
- package/source/models/models-types.ts +0 -68
- package/source/prompt-history.ts +0 -155
- package/source/security/command-injection.spec.ts +0 -240
- package/source/services/checkpoint-manager.spec.ts +0 -523
- package/source/services/checkpoint-manager.ts +0 -466
- package/source/services/file-snapshot.spec.ts +0 -569
- package/source/services/file-snapshot.ts +0 -220
- package/source/test-utils/render-with-theme.tsx +0 -48
- package/source/tokenization/index.ts +0 -1
- package/source/tokenization/tokenizer-factory.spec.ts +0 -170
- package/source/tokenization/tokenizer-factory.ts +0 -125
- package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +0 -200
- package/source/tokenization/tokenizers/anthropic-tokenizer.ts +0 -43
- package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +0 -236
- package/source/tokenization/tokenizers/fallback-tokenizer.ts +0 -26
- package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +0 -224
- package/source/tokenization/tokenizers/llama-tokenizer.ts +0 -41
- package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +0 -184
- package/source/tokenization/tokenizers/openai-tokenizer.ts +0 -57
- package/source/tool-calling/index.ts +0 -5
- package/source/tool-calling/json-parser.spec.ts +0 -639
- package/source/tool-calling/json-parser.ts +0 -247
- package/source/tool-calling/tool-parser.spec.ts +0 -395
- package/source/tool-calling/tool-parser.ts +0 -120
- package/source/tool-calling/xml-parser.spec.ts +0 -662
- package/source/tool-calling/xml-parser.ts +0 -289
- package/source/tools/execute-bash.spec.tsx +0 -353
- package/source/tools/execute-bash.tsx +0 -219
- package/source/tools/execute-function.spec.ts +0 -130
- package/source/tools/fetch-url.spec.tsx +0 -342
- package/source/tools/fetch-url.tsx +0 -172
- package/source/tools/find-files.spec.tsx +0 -924
- package/source/tools/find-files.tsx +0 -293
- package/source/tools/index.ts +0 -102
- package/source/tools/lsp-get-diagnostics.tsx +0 -192
- package/source/tools/needs-approval.spec.ts +0 -282
- package/source/tools/read-file.spec.tsx +0 -801
- package/source/tools/read-file.tsx +0 -387
- package/source/tools/search-file-contents.spec.tsx +0 -1273
- package/source/tools/search-file-contents.tsx +0 -293
- package/source/tools/string-replace.spec.tsx +0 -730
- package/source/tools/string-replace.tsx +0 -548
- package/source/tools/tool-manager.ts +0 -210
- package/source/tools/tool-registry.spec.ts +0 -415
- package/source/tools/tool-registry.ts +0 -228
- package/source/tools/web-search.tsx +0 -223
- package/source/tools/write-file.spec.tsx +0 -559
- package/source/tools/write-file.tsx +0 -228
- package/source/types/app.ts +0 -37
- package/source/types/checkpoint.ts +0 -48
- package/source/types/commands.ts +0 -46
- package/source/types/components.ts +0 -27
- package/source/types/config.ts +0 -103
- package/source/types/core-connection-status.spec.ts +0 -67
- package/source/types/core.ts +0 -181
- package/source/types/hooks.ts +0 -50
- package/source/types/index.ts +0 -12
- package/source/types/markdown-parser.ts +0 -11
- package/source/types/mcp.ts +0 -52
- package/source/types/system.ts +0 -16
- package/source/types/tokenization.ts +0 -41
- package/source/types/ui.ts +0 -40
- package/source/types/usage.ts +0 -58
- package/source/types/utils.ts +0 -16
- package/source/usage/calculator.spec.ts +0 -385
- package/source/usage/calculator.ts +0 -104
- package/source/usage/storage.spec.ts +0 -703
- package/source/usage/storage.ts +0 -238
- package/source/usage/tracker.spec.ts +0 -456
- package/source/usage/tracker.ts +0 -102
- package/source/utils/atomic-deletion.spec.ts +0 -194
- package/source/utils/atomic-deletion.ts +0 -127
- package/source/utils/bounded-map.spec.ts +0 -300
- package/source/utils/bounded-map.ts +0 -193
- package/source/utils/checkpoint-utils.spec.ts +0 -222
- package/source/utils/checkpoint-utils.ts +0 -92
- package/source/utils/error-formatter.spec.ts +0 -169
- package/source/utils/error-formatter.ts +0 -194
- package/source/utils/file-autocomplete.spec.ts +0 -173
- package/source/utils/file-autocomplete.ts +0 -196
- package/source/utils/file-cache.spec.ts +0 -309
- package/source/utils/file-cache.ts +0 -195
- package/source/utils/file-content-loader.spec.ts +0 -180
- package/source/utils/file-content-loader.ts +0 -179
- package/source/utils/file-mention-handler.spec.ts +0 -261
- package/source/utils/file-mention-handler.ts +0 -84
- package/source/utils/file-mention-parser.spec.ts +0 -182
- package/source/utils/file-mention-parser.ts +0 -170
- package/source/utils/fuzzy-matching.spec.ts +0 -149
- package/source/utils/fuzzy-matching.ts +0 -146
- package/source/utils/indentation-normalizer.spec.ts +0 -216
- package/source/utils/indentation-normalizer.ts +0 -76
- package/source/utils/installation-detector.spec.ts +0 -178
- package/source/utils/installation-detector.ts +0 -153
- package/source/utils/logging/config.spec.ts +0 -311
- package/source/utils/logging/config.ts +0 -210
- package/source/utils/logging/console-facade.spec.ts +0 -184
- package/source/utils/logging/console-facade.ts +0 -384
- package/source/utils/logging/correlation.spec.ts +0 -679
- package/source/utils/logging/correlation.ts +0 -474
- package/source/utils/logging/formatters.spec.ts +0 -464
- package/source/utils/logging/formatters.ts +0 -207
- package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +0 -93
- package/source/utils/logging/health-monitor/alerts/alert-manager.ts +0 -79
- package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +0 -56
- package/source/utils/logging/health-monitor/checks/configuration-check.ts +0 -43
- package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +0 -56
- package/source/utils/logging/health-monitor/checks/logging-check.ts +0 -58
- package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +0 -100
- package/source/utils/logging/health-monitor/checks/memory-check.ts +0 -78
- package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +0 -56
- package/source/utils/logging/health-monitor/checks/performance-check.ts +0 -56
- package/source/utils/logging/health-monitor/checks/request-check.spec.ts +0 -56
- package/source/utils/logging/health-monitor/checks/request-check.ts +0 -76
- package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +0 -70
- package/source/utils/logging/health-monitor/core/health-check-runner.ts +0 -138
- package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +0 -58
- package/source/utils/logging/health-monitor/core/health-monitor.ts +0 -344
- package/source/utils/logging/health-monitor/core/scoring.spec.ts +0 -65
- package/source/utils/logging/health-monitor/core/scoring.ts +0 -91
- package/source/utils/logging/health-monitor/index.ts +0 -15
- package/source/utils/logging/health-monitor/instances.ts +0 -48
- package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +0 -141
- package/source/utils/logging/health-monitor/middleware/http-middleware.ts +0 -75
- package/source/utils/logging/health-monitor/types.ts +0 -126
- package/source/utils/logging/index.spec.ts +0 -284
- package/source/utils/logging/index.ts +0 -236
- package/source/utils/logging/integration.spec.ts +0 -441
- package/source/utils/logging/log-method-factory.spec.ts +0 -573
- package/source/utils/logging/log-method-factory.ts +0 -233
- package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +0 -277
- package/source/utils/logging/log-query/aggregation/aggregator.ts +0 -159
- package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +0 -159
- package/source/utils/logging/log-query/aggregation/facet-generator.ts +0 -47
- package/source/utils/logging/log-query/index.ts +0 -23
- package/source/utils/logging/log-query/query/filter-predicates.spec.ts +0 -247
- package/source/utils/logging/log-query/query/filter-predicates.ts +0 -154
- package/source/utils/logging/log-query/query/query-builder.spec.ts +0 -182
- package/source/utils/logging/log-query/query/query-builder.ts +0 -151
- package/source/utils/logging/log-query/query/query-engine.spec.ts +0 -214
- package/source/utils/logging/log-query/query/query-engine.ts +0 -45
- package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +0 -143
- package/source/utils/logging/log-query/storage/circular-buffer.ts +0 -75
- package/source/utils/logging/log-query/storage/index-manager.spec.ts +0 -150
- package/source/utils/logging/log-query/storage/index-manager.ts +0 -71
- package/source/utils/logging/log-query/storage/log-storage.spec.ts +0 -257
- package/source/utils/logging/log-query/storage/log-storage.ts +0 -80
- package/source/utils/logging/log-query/types.ts +0 -163
- package/source/utils/logging/log-query/utils/helpers.spec.ts +0 -263
- package/source/utils/logging/log-query/utils/helpers.ts +0 -72
- package/source/utils/logging/log-query/utils/sorting.spec.ts +0 -182
- package/source/utils/logging/log-query/utils/sorting.ts +0 -61
- package/source/utils/logging/logger-provider.spec.ts +0 -262
- package/source/utils/logging/logger-provider.ts +0 -362
- package/source/utils/logging/performance.spec.ts +0 -209
- package/source/utils/logging/performance.ts +0 -757
- package/source/utils/logging/pino-logger.spec.ts +0 -425
- package/source/utils/logging/pino-logger.ts +0 -514
- package/source/utils/logging/redaction.spec.ts +0 -490
- package/source/utils/logging/redaction.ts +0 -267
- package/source/utils/logging/request-tracker.spec.ts +0 -1198
- package/source/utils/logging/request-tracker.ts +0 -803
- package/source/utils/logging/transports.spec.ts +0 -505
- package/source/utils/logging/transports.ts +0 -305
- package/source/utils/logging/types.ts +0 -216
- package/source/utils/message-builder.spec.ts +0 -179
- package/source/utils/message-builder.ts +0 -101
- package/source/utils/message-queue.tsx +0 -486
- package/source/utils/paste-detection.spec.ts +0 -69
- package/source/utils/paste-detection.ts +0 -124
- package/source/utils/paste-roundtrip.spec.ts +0 -442
- package/source/utils/paste-utils.spec.ts +0 -128
- package/source/utils/paste-utils.ts +0 -52
- package/source/utils/programming-language-helper.spec.ts +0 -74
- package/source/utils/programming-language-helper.ts +0 -32
- package/source/utils/prompt-assembly.spec.ts +0 -221
- package/source/utils/prompt-processor.ts +0 -173
- package/source/utils/tool-args-parser.spec.ts +0 -136
- package/source/utils/tool-args-parser.ts +0 -54
- package/source/utils/tool-cancellation.spec.ts +0 -230
- package/source/utils/tool-cancellation.ts +0 -28
- package/source/utils/tool-result-display.spec.tsx +0 -469
- package/source/utils/tool-result-display.tsx +0 -90
- package/source/utils/update-checker.spec.ts +0 -383
- package/source/utils/update-checker.ts +0 -183
- package/source/wizard/config-wizard.spec.tsx +0 -103
- package/source/wizard/config-wizard.tsx +0 -382
- package/source/wizard/steps/location-step.spec.tsx +0 -186
- package/source/wizard/steps/location-step.tsx +0 -147
- package/source/wizard/steps/mcp-step.spec.tsx +0 -607
- package/source/wizard/steps/mcp-step.tsx +0 -632
- package/source/wizard/steps/provider-step.spec.tsx +0 -342
- package/source/wizard/steps/provider-step.tsx +0 -957
- package/source/wizard/steps/summary-step.spec.tsx +0 -749
- package/source/wizard/steps/summary-step.tsx +0 -228
- package/source/wizard/templates/mcp-templates.spec.ts +0 -613
- package/source/wizard/templates/mcp-templates.ts +0 -570
- package/source/wizard/templates/provider-templates.spec.ts +0 -152
- package/source/wizard/templates/provider-templates.ts +0 -485
- package/source/wizard/utils/fetch-cloud-models.spec.ts +0 -428
- package/source/wizard/utils/fetch-cloud-models.ts +0 -223
- package/source/wizard/utils/fetch-local-models.spec.ts +0 -297
- package/source/wizard/utils/fetch-local-models.ts +0 -192
- package/source/wizard/validation-array.spec.ts +0 -264
- package/source/wizard/validation.spec.ts +0 -373
- package/source/wizard/validation.ts +0 -232
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import type {AIProviderConfig} from '@/types/index';
|
|
3
|
-
import {Agent} from 'undici';
|
|
4
|
-
import {createProvider} from './provider-factory.js';
|
|
5
|
-
|
|
6
|
-
test('createProvider creates provider with basic config', t => {
|
|
7
|
-
const config: AIProviderConfig = {
|
|
8
|
-
name: 'TestProvider',
|
|
9
|
-
type: 'openai',
|
|
10
|
-
models: ['test-model'],
|
|
11
|
-
config: {
|
|
12
|
-
baseURL: 'https://api.test.com',
|
|
13
|
-
apiKey: 'test-key',
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const agent = new Agent();
|
|
18
|
-
const provider = createProvider(config, agent);
|
|
19
|
-
|
|
20
|
-
t.truthy(provider);
|
|
21
|
-
t.is(typeof provider, 'function');
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test('createProvider adds OpenRouter headers for openrouter provider', t => {
|
|
25
|
-
const config: AIProviderConfig = {
|
|
26
|
-
name: 'OpenRouter',
|
|
27
|
-
type: 'openai',
|
|
28
|
-
models: ['test-model'],
|
|
29
|
-
config: {
|
|
30
|
-
baseURL: 'https://openrouter.ai/api/v1',
|
|
31
|
-
apiKey: 'test-key',
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const agent = new Agent();
|
|
36
|
-
const provider = createProvider(config, agent);
|
|
37
|
-
|
|
38
|
-
t.truthy(provider);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('createProvider handles provider with no API key', t => {
|
|
42
|
-
const config: AIProviderConfig = {
|
|
43
|
-
name: 'TestProvider',
|
|
44
|
-
type: 'openai',
|
|
45
|
-
models: ['test-model'],
|
|
46
|
-
config: {
|
|
47
|
-
baseURL: 'https://api.test.com',
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const agent = new Agent();
|
|
52
|
-
const provider = createProvider(config, agent);
|
|
53
|
-
|
|
54
|
-
t.truthy(provider);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test('createProvider handles provider with no baseURL', t => {
|
|
58
|
-
const config: AIProviderConfig = {
|
|
59
|
-
name: 'TestProvider',
|
|
60
|
-
type: 'openai',
|
|
61
|
-
models: ['test-model'],
|
|
62
|
-
config: {
|
|
63
|
-
apiKey: 'test-key',
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const agent = new Agent();
|
|
68
|
-
const provider = createProvider(config, agent);
|
|
69
|
-
|
|
70
|
-
t.truthy(provider);
|
|
71
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type {AIProviderConfig} from '@/types/index';
|
|
2
|
-
import {createOpenAICompatible} from '@ai-sdk/openai-compatible';
|
|
3
|
-
import {type Agent, fetch as undiciFetch} from 'undici';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Creates an OpenAI-compatible provider with custom fetch using undici
|
|
7
|
-
*/
|
|
8
|
-
export function createProvider(
|
|
9
|
-
providerConfig: AIProviderConfig,
|
|
10
|
-
undiciAgent: Agent,
|
|
11
|
-
): ReturnType<typeof createOpenAICompatible> {
|
|
12
|
-
const {config} = providerConfig;
|
|
13
|
-
|
|
14
|
-
// Custom fetch using undici
|
|
15
|
-
const customFetch = (
|
|
16
|
-
url: string | URL | Request,
|
|
17
|
-
options?: RequestInit,
|
|
18
|
-
): Promise<Response> => {
|
|
19
|
-
// Type cast to string | URL since undici's fetch accepts these types
|
|
20
|
-
// Request objects are converted to URL internally by the fetch spec
|
|
21
|
-
return undiciFetch(url as string | URL, {
|
|
22
|
-
...options,
|
|
23
|
-
dispatcher: undiciAgent,
|
|
24
|
-
}) as Promise<Response>;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
// Add OpenRouter-specific headers for app attribution
|
|
28
|
-
const headers: Record<string, string> = {};
|
|
29
|
-
if (providerConfig.name.toLowerCase() === 'openrouter') {
|
|
30
|
-
headers['HTTP-Referer'] = 'https://github.com/Nano-Collective/coder';
|
|
31
|
-
headers['X-Title'] = 'Coder';
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return createOpenAICompatible({
|
|
35
|
-
name: providerConfig.name,
|
|
36
|
-
baseURL: config.baseURL ?? '',
|
|
37
|
-
apiKey: config.apiKey ?? 'dummy-key',
|
|
38
|
-
fetch: customFetch,
|
|
39
|
-
headers,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Message type used for testing the empty assistant message filter.
|
|
3
|
-
* This is a simplified version of the AI SDK's internal message format.
|
|
4
|
-
*/
|
|
5
|
-
export interface TestableMessage {
|
|
6
|
-
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
7
|
-
content: string | unknown[];
|
|
8
|
-
toolCalls?: unknown[];
|
|
9
|
-
}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import {isEmptyAssistantMessage, type TestableMessage} from '@/ai-sdk-client';
|
|
3
|
-
|
|
4
|
-
// Tests for isEmptyAssistantMessage function
|
|
5
|
-
// This function is used to filter out empty assistant messages that would cause API errors:
|
|
6
|
-
// "400 Bad Request: Assistant message must have either content or tool_calls, but not none."
|
|
7
|
-
|
|
8
|
-
// ============================================================================
|
|
9
|
-
// Non-assistant messages should never be considered empty
|
|
10
|
-
// ============================================================================
|
|
11
|
-
|
|
12
|
-
test('isEmptyAssistantMessage - user message is not empty', t => {
|
|
13
|
-
const message: TestableMessage = {
|
|
14
|
-
role: 'user',
|
|
15
|
-
content: '',
|
|
16
|
-
};
|
|
17
|
-
t.false(isEmptyAssistantMessage(message));
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
test('isEmptyAssistantMessage - system message is not empty', t => {
|
|
21
|
-
const message: TestableMessage = {
|
|
22
|
-
role: 'system',
|
|
23
|
-
content: '',
|
|
24
|
-
};
|
|
25
|
-
t.false(isEmptyAssistantMessage(message));
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test('isEmptyAssistantMessage - tool message is not empty', t => {
|
|
29
|
-
const message: TestableMessage = {
|
|
30
|
-
role: 'tool',
|
|
31
|
-
content: '',
|
|
32
|
-
};
|
|
33
|
-
t.false(isEmptyAssistantMessage(message));
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// ============================================================================
|
|
37
|
-
// Empty assistant messages (should be filtered out)
|
|
38
|
-
// ============================================================================
|
|
39
|
-
|
|
40
|
-
test('isEmptyAssistantMessage - assistant with empty string content is empty', t => {
|
|
41
|
-
const message: TestableMessage = {
|
|
42
|
-
role: 'assistant',
|
|
43
|
-
content: '',
|
|
44
|
-
};
|
|
45
|
-
t.true(isEmptyAssistantMessage(message));
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test('isEmptyAssistantMessage - assistant with whitespace-only content is empty', t => {
|
|
49
|
-
const message: TestableMessage = {
|
|
50
|
-
role: 'assistant',
|
|
51
|
-
content: ' \n\t ',
|
|
52
|
-
};
|
|
53
|
-
t.true(isEmptyAssistantMessage(message));
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test('isEmptyAssistantMessage - assistant with empty array content is empty', t => {
|
|
57
|
-
const message: TestableMessage = {
|
|
58
|
-
role: 'assistant',
|
|
59
|
-
content: [],
|
|
60
|
-
};
|
|
61
|
-
t.true(isEmptyAssistantMessage(message));
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test('isEmptyAssistantMessage - assistant with empty content and empty toolCalls is empty', t => {
|
|
65
|
-
const message: TestableMessage = {
|
|
66
|
-
role: 'assistant',
|
|
67
|
-
content: '',
|
|
68
|
-
toolCalls: [],
|
|
69
|
-
};
|
|
70
|
-
t.true(isEmptyAssistantMessage(message));
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
test('isEmptyAssistantMessage - assistant with undefined toolCalls is empty', t => {
|
|
74
|
-
const message: TestableMessage = {
|
|
75
|
-
role: 'assistant',
|
|
76
|
-
content: '',
|
|
77
|
-
toolCalls: undefined,
|
|
78
|
-
};
|
|
79
|
-
t.true(isEmptyAssistantMessage(message));
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// ============================================================================
|
|
83
|
-
// Valid assistant messages (should NOT be filtered out)
|
|
84
|
-
// ============================================================================
|
|
85
|
-
|
|
86
|
-
test('isEmptyAssistantMessage - assistant with text content is not empty', t => {
|
|
87
|
-
const message: TestableMessage = {
|
|
88
|
-
role: 'assistant',
|
|
89
|
-
content: 'Hello, how can I help you?',
|
|
90
|
-
};
|
|
91
|
-
t.false(isEmptyAssistantMessage(message));
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
test('isEmptyAssistantMessage - assistant with single character content is not empty', t => {
|
|
95
|
-
const message: TestableMessage = {
|
|
96
|
-
role: 'assistant',
|
|
97
|
-
content: 'a',
|
|
98
|
-
};
|
|
99
|
-
t.false(isEmptyAssistantMessage(message));
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test('isEmptyAssistantMessage - assistant with array content is not empty', t => {
|
|
103
|
-
const message: TestableMessage = {
|
|
104
|
-
role: 'assistant',
|
|
105
|
-
content: [{type: 'text', text: 'Hello'}],
|
|
106
|
-
};
|
|
107
|
-
t.false(isEmptyAssistantMessage(message));
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test('isEmptyAssistantMessage - assistant with toolCalls is not empty', t => {
|
|
111
|
-
const message: TestableMessage = {
|
|
112
|
-
role: 'assistant',
|
|
113
|
-
content: '',
|
|
114
|
-
toolCalls: [
|
|
115
|
-
{toolName: 'read_file', toolCallId: '123', input: {path: 'test.txt'}},
|
|
116
|
-
],
|
|
117
|
-
};
|
|
118
|
-
t.false(isEmptyAssistantMessage(message));
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
test('isEmptyAssistantMessage - assistant with content and toolCalls is not empty', t => {
|
|
122
|
-
const message: TestableMessage = {
|
|
123
|
-
role: 'assistant',
|
|
124
|
-
content: 'Let me read that file for you.',
|
|
125
|
-
toolCalls: [
|
|
126
|
-
{toolName: 'read_file', toolCallId: '123', input: {path: 'test.txt'}},
|
|
127
|
-
],
|
|
128
|
-
};
|
|
129
|
-
t.false(isEmptyAssistantMessage(message));
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
test('isEmptyAssistantMessage - assistant with whitespace content but toolCalls is not empty', t => {
|
|
133
|
-
const message: TestableMessage = {
|
|
134
|
-
role: 'assistant',
|
|
135
|
-
content: ' ',
|
|
136
|
-
toolCalls: [
|
|
137
|
-
{toolName: 'read_file', toolCallId: '123', input: {path: 'test.txt'}},
|
|
138
|
-
],
|
|
139
|
-
};
|
|
140
|
-
t.false(isEmptyAssistantMessage(message));
|
|
141
|
-
});
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import {parseAPIError} from '@/ai-sdk-client';
|
|
3
|
-
|
|
4
|
-
// Tests for parseAPIError function
|
|
5
|
-
// Now using the actual exported function instead of a duplicated copy
|
|
6
|
-
|
|
7
|
-
test('parseAPIError - handles Ollama unmarshal error from issue #87', t => {
|
|
8
|
-
const error = new Error(
|
|
9
|
-
"RetryError [AI_RetryError]: Failed after 3 attempts. Last error: unmarshal: invalid character '{' after top-level value",
|
|
10
|
-
);
|
|
11
|
-
|
|
12
|
-
const result = parseAPIError(error);
|
|
13
|
-
|
|
14
|
-
t.true(result.includes('Ollama server error'));
|
|
15
|
-
t.true(result.includes('malformed JSON'));
|
|
16
|
-
t.true(result.includes('Restart Ollama'));
|
|
17
|
-
t.true(result.includes('Re-pull the model'));
|
|
18
|
-
t.true(result.includes('Check Ollama logs'));
|
|
19
|
-
t.true(result.includes('Try a different model'));
|
|
20
|
-
t.true(result.includes('Original error:'));
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test('parseAPIError - handles unmarshal error without retry wrapper', t => {
|
|
24
|
-
const error = new Error(
|
|
25
|
-
"unmarshal: invalid character '{' after top-level value",
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
const result = parseAPIError(error);
|
|
29
|
-
|
|
30
|
-
t.true(result.includes('Ollama server error'));
|
|
31
|
-
t.true(result.includes('malformed JSON'));
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
test('parseAPIError - handles 500 error with invalid character (status code takes precedence)', t => {
|
|
35
|
-
// This test verifies that HTTP status codes are parsed FIRST,
|
|
36
|
-
// so a 500 error with "invalid character" in the message is treated
|
|
37
|
-
// as a server error, not an Ollama-specific error
|
|
38
|
-
const error = new Error(
|
|
39
|
-
"500 Internal Server Error: invalid character 'x' after top-level value",
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
const result = parseAPIError(error);
|
|
43
|
-
|
|
44
|
-
// Status code parsing takes precedence over Ollama-specific pattern matching
|
|
45
|
-
t.is(result, "Server error: invalid character 'x' after top-level value");
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test('parseAPIError - handles 500 error without JSON parsing issue', t => {
|
|
49
|
-
const error = new Error(
|
|
50
|
-
'500 Internal Server Error: database connection failed',
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
const result = parseAPIError(error);
|
|
54
|
-
|
|
55
|
-
t.is(result, 'Server error: database connection failed');
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test('parseAPIError - handles 404 error', t => {
|
|
59
|
-
const error = new Error('404 Not Found: model not available');
|
|
60
|
-
|
|
61
|
-
const result = parseAPIError(error);
|
|
62
|
-
|
|
63
|
-
t.is(
|
|
64
|
-
result,
|
|
65
|
-
'Model not found: The requested model may not exist or is unavailable',
|
|
66
|
-
);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('parseAPIError - handles connection refused', t => {
|
|
70
|
-
const error = new Error('ECONNREFUSED: Connection refused');
|
|
71
|
-
|
|
72
|
-
const result = parseAPIError(error);
|
|
73
|
-
|
|
74
|
-
t.is(result, 'Connection failed: Unable to reach the model server');
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test('parseAPIError - handles timeout error', t => {
|
|
78
|
-
const error = new Error('Request timeout: ETIMEDOUT');
|
|
79
|
-
|
|
80
|
-
const result = parseAPIError(error);
|
|
81
|
-
|
|
82
|
-
t.is(result, 'Request timed out: The model took too long to respond');
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
test('parseAPIError - handles non-Error objects', t => {
|
|
86
|
-
const result = parseAPIError('string error');
|
|
87
|
-
|
|
88
|
-
t.is(result, 'An unknown error occurred while communicating with the model');
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test('parseAPIError - handles context length errors', t => {
|
|
92
|
-
const error = new Error('context length exceeded');
|
|
93
|
-
|
|
94
|
-
const result = parseAPIError(error);
|
|
95
|
-
|
|
96
|
-
// Use exact assertion instead of OR condition
|
|
97
|
-
t.is(
|
|
98
|
-
result,
|
|
99
|
-
'Context too large: Please reduce the conversation length or message size',
|
|
100
|
-
);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test('parseAPIError - handles too many tokens errors', t => {
|
|
104
|
-
const error = new Error('too many tokens in the request');
|
|
105
|
-
|
|
106
|
-
const result = parseAPIError(error);
|
|
107
|
-
|
|
108
|
-
t.is(
|
|
109
|
-
result,
|
|
110
|
-
'Context too large: Please reduce the conversation length or message size',
|
|
111
|
-
);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
test('parseAPIError - handles 400 with context length in message', t => {
|
|
115
|
-
const error = new Error('400 Bad Request: context length exceeded');
|
|
116
|
-
|
|
117
|
-
const result = parseAPIError(error);
|
|
118
|
-
|
|
119
|
-
// The 400 status code pattern matches first, so we get the full message
|
|
120
|
-
t.is(result, 'Bad request: context length exceeded');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test('parseAPIError - handles 401 authentication error', t => {
|
|
124
|
-
const error = new Error('401 Unauthorized: Invalid API key');
|
|
125
|
-
|
|
126
|
-
const result = parseAPIError(error);
|
|
127
|
-
|
|
128
|
-
t.is(result, 'Authentication failed: Invalid API key or credentials');
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
test('parseAPIError - handles 403 forbidden error', t => {
|
|
132
|
-
const error = new Error('403 Forbidden: Access denied');
|
|
133
|
-
|
|
134
|
-
const result = parseAPIError(error);
|
|
135
|
-
|
|
136
|
-
t.is(result, 'Access forbidden: Check your API permissions');
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
test('parseAPIError - handles 429 rate limit error', t => {
|
|
140
|
-
const error = new Error('429 Too Many Requests: Rate limit exceeded');
|
|
141
|
-
|
|
142
|
-
const result = parseAPIError(error);
|
|
143
|
-
|
|
144
|
-
t.is(
|
|
145
|
-
result,
|
|
146
|
-
'Rate limit exceeded: Too many requests. Please wait and try again',
|
|
147
|
-
);
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test('parseAPIError - handles 502 bad gateway error', t => {
|
|
151
|
-
const error = new Error('502 Bad Gateway: upstream error');
|
|
152
|
-
|
|
153
|
-
const result = parseAPIError(error);
|
|
154
|
-
|
|
155
|
-
t.is(result, 'Server error: upstream error');
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
test('parseAPIError - handles 503 service unavailable error', t => {
|
|
159
|
-
const error = new Error('503 Service Unavailable: server overloaded');
|
|
160
|
-
|
|
161
|
-
const result = parseAPIError(error);
|
|
162
|
-
|
|
163
|
-
t.is(result, 'Server error: server overloaded');
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
test('parseAPIError - handles reduce tokens message', t => {
|
|
167
|
-
const error = new Error('Please reduce the number of tokens in your request');
|
|
168
|
-
|
|
169
|
-
const result = parseAPIError(error);
|
|
170
|
-
|
|
171
|
-
t.is(
|
|
172
|
-
result,
|
|
173
|
-
'Too many tokens: Please shorten your message or clear conversation history',
|
|
174
|
-
);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
test('parseAPIError - cleans up unknown errors', t => {
|
|
178
|
-
const error = new Error(
|
|
179
|
-
'Error: Something unexpected happened\nWith more details',
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
const result = parseAPIError(error);
|
|
183
|
-
|
|
184
|
-
// Should strip "Error: " prefix and only return first line
|
|
185
|
-
t.is(result, 'Something unexpected happened');
|
|
186
|
-
});
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import {AISDKClient} from '@/ai-sdk-client';
|
|
3
|
-
import type {AIProviderConfig} from '@/types/config';
|
|
4
|
-
|
|
5
|
-
// Tests for maxRetries configuration
|
|
6
|
-
// Now tests actual AISDKClient instantiation and behavior
|
|
7
|
-
|
|
8
|
-
test('AISDKClient - maxRetries defaults to 2 when not specified', t => {
|
|
9
|
-
const config: AIProviderConfig = {
|
|
10
|
-
name: 'TestProvider',
|
|
11
|
-
type: 'openai-compatible',
|
|
12
|
-
models: ['test-model'],
|
|
13
|
-
config: {
|
|
14
|
-
baseURL: 'http://localhost:11434/v1',
|
|
15
|
-
apiKey: 'test-key',
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const client = new AISDKClient(config);
|
|
20
|
-
|
|
21
|
-
// Verify the client's internal maxRetries is set to default of 2
|
|
22
|
-
t.is(client.getMaxRetries(), 2);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test('AISDKClient - maxRetries respects custom value', t => {
|
|
26
|
-
const config: AIProviderConfig = {
|
|
27
|
-
name: 'TestProvider',
|
|
28
|
-
type: 'openai-compatible',
|
|
29
|
-
models: ['test-model'],
|
|
30
|
-
maxRetries: 5,
|
|
31
|
-
config: {
|
|
32
|
-
baseURL: 'http://localhost:11434/v1',
|
|
33
|
-
apiKey: 'test-key',
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const client = new AISDKClient(config);
|
|
38
|
-
|
|
39
|
-
// Verify the client uses the custom maxRetries value
|
|
40
|
-
t.is(client.getMaxRetries(), 5);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('AISDKClient - maxRetries can be set to 0 to disable retries', t => {
|
|
44
|
-
// Important: This test verifies that 0 is treated as a valid value,
|
|
45
|
-
// not as falsy (which would incorrectly default to 2)
|
|
46
|
-
const config: AIProviderConfig = {
|
|
47
|
-
name: 'TestProvider',
|
|
48
|
-
type: 'openai-compatible',
|
|
49
|
-
models: ['test-model'],
|
|
50
|
-
maxRetries: 0,
|
|
51
|
-
config: {
|
|
52
|
-
baseURL: 'http://localhost:11434/v1',
|
|
53
|
-
apiKey: 'test-key',
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const client = new AISDKClient(config);
|
|
58
|
-
|
|
59
|
-
// Verify that 0 is respected (nullish coalescing handles this correctly)
|
|
60
|
-
t.is(client.getMaxRetries(), 0);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test('AISDKClient - maxRetries handles value of 1', t => {
|
|
64
|
-
const config: AIProviderConfig = {
|
|
65
|
-
name: 'TestProvider',
|
|
66
|
-
type: 'openai-compatible',
|
|
67
|
-
models: ['test-model'],
|
|
68
|
-
maxRetries: 1,
|
|
69
|
-
config: {
|
|
70
|
-
baseURL: 'http://localhost:11434/v1',
|
|
71
|
-
apiKey: 'test-key',
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
const client = new AISDKClient(config);
|
|
76
|
-
|
|
77
|
-
t.is(client.getMaxRetries(), 1);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('AIProviderConfig type - includes maxRetries in interface', t => {
|
|
81
|
-
// Compile-time test that maxRetries is part of the interface
|
|
82
|
-
const config: AIProviderConfig = {
|
|
83
|
-
name: 'TestProvider',
|
|
84
|
-
type: 'openai-compatible',
|
|
85
|
-
models: ['test-model'],
|
|
86
|
-
maxRetries: 3,
|
|
87
|
-
config: {
|
|
88
|
-
baseURL: 'http://localhost:11434/v1',
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
// TypeScript should not complain about maxRetries property
|
|
93
|
-
t.is(typeof config.maxRetries, 'number');
|
|
94
|
-
t.true('maxRetries' in config);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
test('AISDKClient - undefined maxRetries uses default', t => {
|
|
98
|
-
// Explicitly set to undefined to test fallback behavior
|
|
99
|
-
const config: AIProviderConfig = {
|
|
100
|
-
name: 'TestProvider',
|
|
101
|
-
type: 'openai-compatible',
|
|
102
|
-
models: ['test-model'],
|
|
103
|
-
maxRetries: undefined,
|
|
104
|
-
config: {
|
|
105
|
-
baseURL: 'http://localhost:11434/v1',
|
|
106
|
-
apiKey: 'test-key',
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const client = new AISDKClient(config);
|
|
111
|
-
|
|
112
|
-
// Verify undefined falls back to default of 2
|
|
113
|
-
t.is(client.getMaxRetries(), 2);
|
|
114
|
-
});
|