@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,117 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import type {AIProviderConfig} from '@/types/index';
|
|
3
|
-
import {AISDKClient} from './AISDKClient.js';
|
|
4
|
-
|
|
5
|
-
test('AISDKClient constructor initializes with config', t => {
|
|
6
|
-
const config: AIProviderConfig = {
|
|
7
|
-
name: 'TestProvider',
|
|
8
|
-
type: 'openai',
|
|
9
|
-
models: ['test-model-1', 'test-model-2'],
|
|
10
|
-
config: {
|
|
11
|
-
baseURL: 'https://api.test.com',
|
|
12
|
-
apiKey: 'test-key',
|
|
13
|
-
},
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const client = new AISDKClient(config);
|
|
17
|
-
|
|
18
|
-
t.is(client.getCurrentModel(), 'test-model-1');
|
|
19
|
-
t.is(client.getContextSize(), 0); // Not yet loaded
|
|
20
|
-
t.is(client.getMaxRetries(), 2); // Default value
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test('AISDKClient.create returns a Promise', async t => {
|
|
24
|
-
const config: AIProviderConfig = {
|
|
25
|
-
name: 'TestProvider',
|
|
26
|
-
type: 'openai',
|
|
27
|
-
models: ['test-model'],
|
|
28
|
-
config: {
|
|
29
|
-
baseURL: 'https://api.test.com',
|
|
30
|
-
apiKey: 'test-key',
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const client = await AISDKClient.create(config);
|
|
35
|
-
|
|
36
|
-
t.truthy(client);
|
|
37
|
-
t.true(client instanceof AISDKClient);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test('AISDKClient setModel updates current model', t => {
|
|
41
|
-
const config: AIProviderConfig = {
|
|
42
|
-
name: 'TestProvider',
|
|
43
|
-
type: 'openai',
|
|
44
|
-
models: ['model-1', 'model-2'],
|
|
45
|
-
config: {
|
|
46
|
-
baseURL: 'https://api.test.com',
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const client = new AISDKClient(config);
|
|
51
|
-
t.is(client.getCurrentModel(), 'model-1');
|
|
52
|
-
|
|
53
|
-
client.setModel('model-2');
|
|
54
|
-
t.is(client.getCurrentModel(), 'model-2');
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test('AISDKClient getAvailableModels returns models array', async t => {
|
|
58
|
-
const config: AIProviderConfig = {
|
|
59
|
-
name: 'TestProvider',
|
|
60
|
-
type: 'openai',
|
|
61
|
-
models: ['model-1', 'model-2', 'model-3'],
|
|
62
|
-
config: {
|
|
63
|
-
baseURL: 'https://api.test.com',
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const client = new AISDKClient(config);
|
|
68
|
-
const models = await client.getAvailableModels();
|
|
69
|
-
|
|
70
|
-
t.deepEqual(models, ['model-1', 'model-2', 'model-3']);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
test('AISDKClient clearContext resolves successfully', async t => {
|
|
74
|
-
const config: AIProviderConfig = {
|
|
75
|
-
name: 'TestProvider',
|
|
76
|
-
type: 'openai',
|
|
77
|
-
models: ['test-model'],
|
|
78
|
-
config: {
|
|
79
|
-
baseURL: 'https://api.test.com',
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const client = new AISDKClient(config);
|
|
84
|
-
|
|
85
|
-
await t.notThrowsAsync(async () => {
|
|
86
|
-
await client.clearContext();
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test('AISDKClient uses custom maxRetries from config', t => {
|
|
91
|
-
const config: AIProviderConfig = {
|
|
92
|
-
name: 'TestProvider',
|
|
93
|
-
type: 'openai',
|
|
94
|
-
models: ['test-model'],
|
|
95
|
-
maxRetries: 5,
|
|
96
|
-
config: {
|
|
97
|
-
baseURL: 'https://api.test.com',
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
const client = new AISDKClient(config);
|
|
102
|
-
t.is(client.getMaxRetries(), 5);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test('AISDKClient handles config without models', t => {
|
|
106
|
-
const config: AIProviderConfig = {
|
|
107
|
-
name: 'TestProvider',
|
|
108
|
-
type: 'openai',
|
|
109
|
-
models: [],
|
|
110
|
-
config: {
|
|
111
|
-
baseURL: 'https://api.test.com',
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
const client = new AISDKClient(config);
|
|
116
|
-
t.is(client.getCurrentModel(), '');
|
|
117
|
-
});
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import {TIMEOUT_SOCKET_DEFAULT_MS} from '@/constants';
|
|
2
|
-
import {getModelContextLimit} from '@/models/index.js';
|
|
3
|
-
import type {
|
|
4
|
-
AIProviderConfig,
|
|
5
|
-
AISDKCoreTool,
|
|
6
|
-
LLMChatResponse,
|
|
7
|
-
LLMClient,
|
|
8
|
-
Message,
|
|
9
|
-
StreamCallbacks,
|
|
10
|
-
} from '@/types/index';
|
|
11
|
-
import {getLogger} from '@/utils/logging';
|
|
12
|
-
import {createOpenAICompatible} from '@ai-sdk/openai-compatible';
|
|
13
|
-
import type {LanguageModel} from 'ai';
|
|
14
|
-
import {Agent} from 'undici';
|
|
15
|
-
import {handleChat} from './chat/chat-handler.js';
|
|
16
|
-
import {createProvider} from './providers/provider-factory.js';
|
|
17
|
-
|
|
18
|
-
export class AISDKClient implements LLMClient {
|
|
19
|
-
private provider: ReturnType<typeof createOpenAICompatible>;
|
|
20
|
-
private currentModel: string;
|
|
21
|
-
private availableModels: string[];
|
|
22
|
-
private providerConfig: AIProviderConfig;
|
|
23
|
-
private undiciAgent: Agent;
|
|
24
|
-
private cachedContextSize: number;
|
|
25
|
-
private maxRetries: number;
|
|
26
|
-
|
|
27
|
-
constructor(providerConfig: AIProviderConfig) {
|
|
28
|
-
const logger = getLogger();
|
|
29
|
-
|
|
30
|
-
this.providerConfig = providerConfig;
|
|
31
|
-
this.availableModels = providerConfig.models;
|
|
32
|
-
this.currentModel = providerConfig.models[0] || '';
|
|
33
|
-
this.cachedContextSize = 0;
|
|
34
|
-
// Default to 2 retries (same as AI SDK default), or use configured value
|
|
35
|
-
this.maxRetries = providerConfig.maxRetries ?? 2;
|
|
36
|
-
|
|
37
|
-
logger.info('AI SDK client initializing', {
|
|
38
|
-
models: this.availableModels,
|
|
39
|
-
defaultModel: this.currentModel,
|
|
40
|
-
provider: providerConfig.name || 'unknown',
|
|
41
|
-
baseUrl: providerConfig.config.baseURL ? '[REDACTED]' : undefined,
|
|
42
|
-
maxRetries: this.maxRetries,
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
const {connectionPool} = this.providerConfig;
|
|
46
|
-
const {requestTimeout, socketTimeout} = this.providerConfig;
|
|
47
|
-
const effectiveSocketTimeout = socketTimeout ?? requestTimeout;
|
|
48
|
-
const resolvedSocketTimeout =
|
|
49
|
-
effectiveSocketTimeout === -1
|
|
50
|
-
? 0
|
|
51
|
-
: (effectiveSocketTimeout ?? TIMEOUT_SOCKET_DEFAULT_MS);
|
|
52
|
-
|
|
53
|
-
this.undiciAgent = new Agent({
|
|
54
|
-
connect: {
|
|
55
|
-
timeout: resolvedSocketTimeout,
|
|
56
|
-
},
|
|
57
|
-
bodyTimeout: resolvedSocketTimeout,
|
|
58
|
-
headersTimeout: resolvedSocketTimeout,
|
|
59
|
-
keepAliveTimeout: connectionPool?.idleTimeout,
|
|
60
|
-
keepAliveMaxTimeout: connectionPool?.cumulativeMaxIdleTimeout,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
this.provider = createProvider(this.providerConfig, this.undiciAgent);
|
|
64
|
-
|
|
65
|
-
// Fetch context size asynchronously (don't block construction)
|
|
66
|
-
void this.updateContextSize();
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Fetch and cache context size from models.dev
|
|
71
|
-
*/
|
|
72
|
-
private async updateContextSize(): Promise<void> {
|
|
73
|
-
try {
|
|
74
|
-
const contextSize = await getModelContextLimit(this.currentModel);
|
|
75
|
-
this.cachedContextSize = contextSize || 0;
|
|
76
|
-
} catch {
|
|
77
|
-
// Silently fail - context size will remain 0
|
|
78
|
-
this.cachedContextSize = 0;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
static create(providerConfig: AIProviderConfig): Promise<AISDKClient> {
|
|
83
|
-
const client = new AISDKClient(providerConfig);
|
|
84
|
-
return Promise.resolve(client);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
setModel(model: string): void {
|
|
88
|
-
const logger = getLogger();
|
|
89
|
-
const previousModel = this.currentModel;
|
|
90
|
-
|
|
91
|
-
this.currentModel = model;
|
|
92
|
-
|
|
93
|
-
logger.info('Model changed', {
|
|
94
|
-
previousModel,
|
|
95
|
-
newModel: model,
|
|
96
|
-
provider: this.providerConfig.name,
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// Update context size when model changes
|
|
100
|
-
void this.updateContextSize();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
getCurrentModel(): string {
|
|
104
|
-
return this.currentModel;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
getContextSize(): number {
|
|
108
|
-
return this.cachedContextSize;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
getMaxRetries(): number {
|
|
112
|
-
return this.maxRetries;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
getAvailableModels(): Promise<string[]> {
|
|
116
|
-
return Promise.resolve(this.availableModels);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Stream chat with real-time token updates
|
|
121
|
-
*/
|
|
122
|
-
async chat(
|
|
123
|
-
messages: Message[],
|
|
124
|
-
tools: Record<string, AISDKCoreTool>,
|
|
125
|
-
callbacks: StreamCallbacks,
|
|
126
|
-
signal?: AbortSignal,
|
|
127
|
-
): Promise<LLMChatResponse> {
|
|
128
|
-
// Get the language model instance from the provider
|
|
129
|
-
const model = this.provider(this.currentModel) as unknown as LanguageModel;
|
|
130
|
-
|
|
131
|
-
// Delegate to chat handler
|
|
132
|
-
return await handleChat({
|
|
133
|
-
model,
|
|
134
|
-
currentModel: this.currentModel,
|
|
135
|
-
providerConfig: this.providerConfig,
|
|
136
|
-
messages,
|
|
137
|
-
tools,
|
|
138
|
-
callbacks,
|
|
139
|
-
signal,
|
|
140
|
-
maxRetries: this.maxRetries,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
clearContext(): Promise<void> {
|
|
145
|
-
const logger = getLogger();
|
|
146
|
-
|
|
147
|
-
logger.debug('AI SDK client context cleared', {
|
|
148
|
-
model: this.currentModel,
|
|
149
|
-
provider: this.providerConfig.name,
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
// No internal state to clear
|
|
153
|
-
return Promise.resolve();
|
|
154
|
-
}
|
|
155
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import type {
|
|
3
|
-
AIProviderConfig,
|
|
4
|
-
AISDKCoreTool,
|
|
5
|
-
Message,
|
|
6
|
-
StreamCallbacks,
|
|
7
|
-
} from '@/types/index';
|
|
8
|
-
import type {LanguageModel} from 'ai';
|
|
9
|
-
import type {ChatHandlerParams} from './chat-handler.js';
|
|
10
|
-
|
|
11
|
-
// Note: This file contains basic structure tests
|
|
12
|
-
// Full integration tests would require mocking the AI SDK's generateText function
|
|
13
|
-
// which is complex and better tested through the full AISDKClient
|
|
14
|
-
|
|
15
|
-
test('ChatHandlerParams has correct structure', t => {
|
|
16
|
-
const params: ChatHandlerParams = {
|
|
17
|
-
model: {} as LanguageModel,
|
|
18
|
-
currentModel: 'test-model',
|
|
19
|
-
providerConfig: {
|
|
20
|
-
name: 'TestProvider',
|
|
21
|
-
type: 'openai',
|
|
22
|
-
models: ['test-model'],
|
|
23
|
-
config: {
|
|
24
|
-
baseURL: 'https://api.test.com',
|
|
25
|
-
apiKey: 'test-key',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
messages: [],
|
|
29
|
-
tools: {},
|
|
30
|
-
callbacks: {},
|
|
31
|
-
maxRetries: 2,
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
t.is(params.currentModel, 'test-model');
|
|
35
|
-
t.is(params.providerConfig.name, 'TestProvider');
|
|
36
|
-
t.deepEqual(params.messages, []);
|
|
37
|
-
t.deepEqual(params.tools, {});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test('ChatHandlerParams accepts optional signal', t => {
|
|
41
|
-
const controller = new AbortController();
|
|
42
|
-
const params: ChatHandlerParams = {
|
|
43
|
-
model: {} as LanguageModel,
|
|
44
|
-
currentModel: 'test-model',
|
|
45
|
-
providerConfig: {
|
|
46
|
-
name: 'TestProvider',
|
|
47
|
-
type: 'openai',
|
|
48
|
-
models: ['test-model'],
|
|
49
|
-
config: {
|
|
50
|
-
baseURL: 'https://api.test.com',
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
messages: [],
|
|
54
|
-
tools: {},
|
|
55
|
-
callbacks: {},
|
|
56
|
-
signal: controller.signal,
|
|
57
|
-
maxRetries: 2,
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
t.is(params.signal, controller.signal);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test('ChatHandlerParams accepts messages and tools', t => {
|
|
64
|
-
const messages: Message[] = [
|
|
65
|
-
{role: 'user', content: 'Hello'},
|
|
66
|
-
];
|
|
67
|
-
const tools: Record<string, AISDKCoreTool> = {
|
|
68
|
-
test_tool: {} as AISDKCoreTool,
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const params: ChatHandlerParams = {
|
|
72
|
-
model: {} as LanguageModel,
|
|
73
|
-
currentModel: 'test-model',
|
|
74
|
-
providerConfig: {
|
|
75
|
-
name: 'TestProvider',
|
|
76
|
-
type: 'openai',
|
|
77
|
-
models: ['test-model'],
|
|
78
|
-
config: {
|
|
79
|
-
baseURL: 'https://api.test.com',
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
messages,
|
|
83
|
-
tools,
|
|
84
|
-
callbacks: {},
|
|
85
|
-
maxRetries: 2,
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
t.is(params.messages.length, 1);
|
|
89
|
-
t.is(Object.keys(params.tools).length, 1);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test('ChatHandlerParams accepts callbacks', t => {
|
|
93
|
-
const callbacks: StreamCallbacks = {
|
|
94
|
-
onToken: () => {},
|
|
95
|
-
onToolCall: () => {},
|
|
96
|
-
onToolExecuted: () => {},
|
|
97
|
-
onFinish: () => {},
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
const params: ChatHandlerParams = {
|
|
101
|
-
model: {} as LanguageModel,
|
|
102
|
-
currentModel: 'test-model',
|
|
103
|
-
providerConfig: {
|
|
104
|
-
name: 'TestProvider',
|
|
105
|
-
type: 'openai',
|
|
106
|
-
models: ['test-model'],
|
|
107
|
-
config: {
|
|
108
|
-
baseURL: 'https://api.test.com',
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
messages: [],
|
|
112
|
-
tools: {},
|
|
113
|
-
callbacks,
|
|
114
|
-
maxRetries: 2,
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
t.truthy(params.callbacks.onToken);
|
|
118
|
-
t.truthy(params.callbacks.onToolCall);
|
|
119
|
-
t.truthy(params.callbacks.onToolExecuted);
|
|
120
|
-
t.truthy(params.callbacks.onFinish);
|
|
121
|
-
});
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import {MAX_TOOL_STEPS} from '@/constants';
|
|
2
|
-
import type {
|
|
3
|
-
AIProviderConfig,
|
|
4
|
-
AISDKCoreTool,
|
|
5
|
-
LLMChatResponse,
|
|
6
|
-
Message,
|
|
7
|
-
StreamCallbacks,
|
|
8
|
-
ToolCall,
|
|
9
|
-
} from '@/types/index';
|
|
10
|
-
import {
|
|
11
|
-
endMetrics,
|
|
12
|
-
formatMemoryUsage,
|
|
13
|
-
generateCorrelationId,
|
|
14
|
-
getCorrelationId,
|
|
15
|
-
getLogger,
|
|
16
|
-
startMetrics,
|
|
17
|
-
withNewCorrelationContext,
|
|
18
|
-
} from '@/utils/logging';
|
|
19
|
-
import type {LanguageModel} from 'ai';
|
|
20
|
-
import {generateText, stepCountIs} from 'ai';
|
|
21
|
-
import {convertToModelMessages} from '../converters/message-converter.js';
|
|
22
|
-
import {
|
|
23
|
-
convertAISDKToolCalls,
|
|
24
|
-
getToolResultOutput,
|
|
25
|
-
} from '../converters/tool-converter.js';
|
|
26
|
-
import {extractRootError} from '../error-handling/error-extractor.js';
|
|
27
|
-
import {parseAPIError} from '../error-handling/error-parser.js';
|
|
28
|
-
import {
|
|
29
|
-
createOnStepFinishHandler,
|
|
30
|
-
createPrepareStepHandler,
|
|
31
|
-
} from './streaming-handler.js';
|
|
32
|
-
import {processXMLToolCalls} from './tool-processor.js';
|
|
33
|
-
|
|
34
|
-
export interface ChatHandlerParams {
|
|
35
|
-
model: LanguageModel;
|
|
36
|
-
currentModel: string;
|
|
37
|
-
providerConfig: AIProviderConfig;
|
|
38
|
-
messages: Message[];
|
|
39
|
-
tools: Record<string, AISDKCoreTool>;
|
|
40
|
-
callbacks: StreamCallbacks;
|
|
41
|
-
signal?: AbortSignal;
|
|
42
|
-
maxRetries: number;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Main chat handler - orchestrates the entire chat flow
|
|
47
|
-
*/
|
|
48
|
-
export async function handleChat(
|
|
49
|
-
params: ChatHandlerParams,
|
|
50
|
-
): Promise<LLMChatResponse> {
|
|
51
|
-
const {
|
|
52
|
-
model,
|
|
53
|
-
currentModel,
|
|
54
|
-
providerConfig,
|
|
55
|
-
messages,
|
|
56
|
-
tools,
|
|
57
|
-
callbacks,
|
|
58
|
-
signal,
|
|
59
|
-
maxRetries,
|
|
60
|
-
} = params;
|
|
61
|
-
const logger = getLogger();
|
|
62
|
-
|
|
63
|
-
// Check if already aborted before starting
|
|
64
|
-
if (signal?.aborted) {
|
|
65
|
-
logger.debug('Chat request already aborted');
|
|
66
|
-
throw new Error('Operation was cancelled');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Start performance tracking
|
|
70
|
-
const metrics = startMetrics();
|
|
71
|
-
const correlationId = getCorrelationId() || generateCorrelationId();
|
|
72
|
-
|
|
73
|
-
logger.info('Chat request starting', {
|
|
74
|
-
model: currentModel,
|
|
75
|
-
messageCount: messages.length,
|
|
76
|
-
toolCount: Object.keys(tools).length,
|
|
77
|
-
correlationId,
|
|
78
|
-
provider: providerConfig.name,
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
return await withNewCorrelationContext(async _context => {
|
|
82
|
-
try {
|
|
83
|
-
// Tools are already in AI SDK format - use directly
|
|
84
|
-
const aiTools = Object.keys(tools).length > 0 ? tools : undefined;
|
|
85
|
-
|
|
86
|
-
// Convert messages to AI SDK v5 ModelMessage format
|
|
87
|
-
const modelMessages = convertToModelMessages(messages);
|
|
88
|
-
|
|
89
|
-
logger.debug('AI SDK request prepared', {
|
|
90
|
-
messageCount: modelMessages.length,
|
|
91
|
-
hasTools: !!aiTools,
|
|
92
|
-
toolCount: aiTools ? Object.keys(aiTools).length : 0,
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
// Tools with needsApproval: false auto-execute in the loop
|
|
96
|
-
// Tools with needsApproval: true cause interruptions for manual approval
|
|
97
|
-
// stopWhen controls when the tool loop stops (max MAX_TOOL_STEPS steps)
|
|
98
|
-
const result = await generateText({
|
|
99
|
-
model,
|
|
100
|
-
messages: modelMessages,
|
|
101
|
-
tools: aiTools,
|
|
102
|
-
abortSignal: signal,
|
|
103
|
-
maxRetries,
|
|
104
|
-
stopWhen: stepCountIs(MAX_TOOL_STEPS), // Allow up to MAX_TOOL_STEPS tool execution steps
|
|
105
|
-
// Can be used to add custom logging, metrics, or step tracking
|
|
106
|
-
onStepFinish: createOnStepFinishHandler(callbacks),
|
|
107
|
-
prepareStep: createPrepareStepHandler(),
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
// Get the full text from the result
|
|
111
|
-
const fullText = result.text;
|
|
112
|
-
|
|
113
|
-
logger.debug('AI SDK response received', {
|
|
114
|
-
responseLength: fullText.length,
|
|
115
|
-
hasToolCalls: !!(result.toolCalls && result.toolCalls.length > 0),
|
|
116
|
-
toolCallCount: result.toolCalls?.length || 0,
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
// Send the complete text to the callback
|
|
120
|
-
if (fullText) {
|
|
121
|
-
callbacks.onToken?.(fullText);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Get tool calls from result
|
|
125
|
-
const toolCallsResult = result.toolCalls;
|
|
126
|
-
|
|
127
|
-
// Extract auto-executed assistant messages and tool results from steps
|
|
128
|
-
// These need to be added to the messages array so usage tracking can count them
|
|
129
|
-
const autoExecutedMessages: Array<Message> = [];
|
|
130
|
-
const steps = result.steps;
|
|
131
|
-
for (const step of steps) {
|
|
132
|
-
if (
|
|
133
|
-
step.toolCalls &&
|
|
134
|
-
step.toolResults &&
|
|
135
|
-
step.toolCalls.length === step.toolResults.length
|
|
136
|
-
) {
|
|
137
|
-
// This step had tool calls that were auto-executed
|
|
138
|
-
// Add the assistant message with tool_calls
|
|
139
|
-
const stepToolCalls: ToolCall[] = convertAISDKToolCalls(
|
|
140
|
-
step.toolCalls,
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
autoExecutedMessages.push({
|
|
144
|
-
role: 'assistant',
|
|
145
|
-
content: step.text || '',
|
|
146
|
-
tool_calls: stepToolCalls,
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// Add the tool result messages
|
|
150
|
-
step.toolCalls.forEach((toolCall, idx) => {
|
|
151
|
-
const toolResult = step.toolResults[idx];
|
|
152
|
-
const resultStr = getToolResultOutput(toolResult.output);
|
|
153
|
-
|
|
154
|
-
autoExecutedMessages.push({
|
|
155
|
-
role: 'tool' as const,
|
|
156
|
-
content: resultStr,
|
|
157
|
-
tool_call_id:
|
|
158
|
-
toolCall.toolCallId ||
|
|
159
|
-
`tool_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`,
|
|
160
|
-
name: toolCall.toolName,
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Extract tool calls
|
|
167
|
-
const toolCalls: ToolCall[] = [];
|
|
168
|
-
if (toolCallsResult && toolCallsResult.length > 0) {
|
|
169
|
-
logger.debug('Processing tool calls from response', {
|
|
170
|
-
toolCallCount: toolCallsResult.length,
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
for (const toolCall of toolCallsResult) {
|
|
174
|
-
const tc: ToolCall = convertAISDKToolCalls([toolCall])[0];
|
|
175
|
-
toolCalls.push(tc);
|
|
176
|
-
|
|
177
|
-
logger.debug('Tool call processed', {
|
|
178
|
-
toolName: tc.function.name,
|
|
179
|
-
hasArguments: !!tc.function.arguments,
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
// Note: onToolCall already fired in onStepFinish - no need to call again
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Check for XML tool calls if no native ones
|
|
187
|
-
let content = fullText;
|
|
188
|
-
const xmlResult = processXMLToolCalls(content, tools, callbacks);
|
|
189
|
-
if (xmlResult.toolCalls.length > 0) {
|
|
190
|
-
toolCalls.push(...xmlResult.toolCalls);
|
|
191
|
-
content = xmlResult.cleanedContent;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Calculate performance metrics
|
|
195
|
-
const finalMetrics = endMetrics(metrics);
|
|
196
|
-
|
|
197
|
-
logger.info('Chat request completed successfully', {
|
|
198
|
-
model: currentModel,
|
|
199
|
-
duration: `${finalMetrics.duration.toFixed(2)}ms`,
|
|
200
|
-
responseLength: content.length,
|
|
201
|
-
toolCallsFound: toolCalls.length,
|
|
202
|
-
memoryDelta: formatMemoryUsage(
|
|
203
|
-
finalMetrics.memoryUsage || process.memoryUsage(),
|
|
204
|
-
),
|
|
205
|
-
correlationId,
|
|
206
|
-
provider: providerConfig.name,
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
callbacks.onFinish?.();
|
|
210
|
-
|
|
211
|
-
return {
|
|
212
|
-
choices: [
|
|
213
|
-
{
|
|
214
|
-
message: {
|
|
215
|
-
role: 'assistant',
|
|
216
|
-
content,
|
|
217
|
-
tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
218
|
-
},
|
|
219
|
-
},
|
|
220
|
-
],
|
|
221
|
-
// Include auto-executed messages so they can be added to message history
|
|
222
|
-
autoExecutedMessages:
|
|
223
|
-
autoExecutedMessages.length > 0 ? autoExecutedMessages : undefined,
|
|
224
|
-
};
|
|
225
|
-
} catch (error) {
|
|
226
|
-
// Calculate performance metrics even for errors
|
|
227
|
-
const finalMetrics = endMetrics(metrics);
|
|
228
|
-
|
|
229
|
-
// Check if this was a user-initiated cancellation
|
|
230
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
231
|
-
logger.info('Chat request cancelled by user', {
|
|
232
|
-
model: currentModel,
|
|
233
|
-
duration: `${finalMetrics.duration.toFixed(2)}ms`,
|
|
234
|
-
correlationId,
|
|
235
|
-
provider: providerConfig.name,
|
|
236
|
-
});
|
|
237
|
-
throw new Error('Operation was cancelled');
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Log the error with performance metrics
|
|
241
|
-
logger.error('Chat request failed', {
|
|
242
|
-
model: currentModel,
|
|
243
|
-
duration: `${finalMetrics.duration.toFixed(2)}ms`,
|
|
244
|
-
error: error instanceof Error ? error.message : error,
|
|
245
|
-
errorName: error instanceof Error ? error.name : 'Unknown',
|
|
246
|
-
correlationId,
|
|
247
|
-
provider: providerConfig.name,
|
|
248
|
-
memoryDelta: formatMemoryUsage(
|
|
249
|
-
finalMetrics.memoryUsage || process.memoryUsage(),
|
|
250
|
-
),
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
// AI SDK wraps errors in NoOutputGeneratedError with no useful cause
|
|
254
|
-
// Check if it's a cancellation without an underlying API error
|
|
255
|
-
if (
|
|
256
|
-
error instanceof Error &&
|
|
257
|
-
(error.name === 'AI_NoOutputGeneratedError' ||
|
|
258
|
-
error.message.includes('No output generated'))
|
|
259
|
-
) {
|
|
260
|
-
// Check if there's an underlying RetryError with the real cause
|
|
261
|
-
const rootError = extractRootError(error);
|
|
262
|
-
if (rootError === error) {
|
|
263
|
-
// No underlying error - this is just a cancellation
|
|
264
|
-
throw new Error('Operation was cancelled');
|
|
265
|
-
}
|
|
266
|
-
// There's a real error underneath, parse it
|
|
267
|
-
const userMessage = parseAPIError(rootError);
|
|
268
|
-
throw new Error(userMessage);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Parse any other error (including RetryError and APICallError)
|
|
272
|
-
const userMessage = parseAPIError(error);
|
|
273
|
-
throw new Error(userMessage);
|
|
274
|
-
}
|
|
275
|
-
}, correlationId); // End of withNewCorrelationContext
|
|
276
|
-
}
|