agent-consultation-mcp 1.0.0

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.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +140 -0
  3. package/dist/api/index.d.ts +27 -0
  4. package/dist/api/index.js +213 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/middleware/security.d.ts +6 -0
  7. package/dist/api/middleware/security.js +28 -0
  8. package/dist/api/middleware/security.js.map +1 -0
  9. package/dist/api/routes/chat.d.ts +2 -0
  10. package/dist/api/routes/chat.js +61 -0
  11. package/dist/api/routes/chat.js.map +1 -0
  12. package/dist/api/routes/config.d.ts +2 -0
  13. package/dist/api/routes/config.js +81 -0
  14. package/dist/api/routes/config.js.map +1 -0
  15. package/dist/api/routes/providers.d.ts +2 -0
  16. package/dist/api/routes/providers.js +225 -0
  17. package/dist/api/routes/providers.js.map +1 -0
  18. package/dist/api/standalone-server.d.ts +12 -0
  19. package/dist/api/standalone-server.js +91 -0
  20. package/dist/api/standalone-server.js.map +1 -0
  21. package/dist/config/defaults.d.ts +17 -0
  22. package/dist/config/defaults.js +30 -0
  23. package/dist/config/defaults.js.map +1 -0
  24. package/dist/config/encryption.d.ts +12 -0
  25. package/dist/config/encryption.js +85 -0
  26. package/dist/config/encryption.js.map +1 -0
  27. package/dist/config/index.d.ts +5 -0
  28. package/dist/config/index.js +6 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/config/manager.d.ts +62 -0
  31. package/dist/config/manager.js +186 -0
  32. package/dist/config/manager.js.map +1 -0
  33. package/dist/config/prompts.d.ts +10 -0
  34. package/dist/config/prompts.js +140 -0
  35. package/dist/config/prompts.js.map +1 -0
  36. package/dist/config/schema.d.ts +141 -0
  37. package/dist/config/schema.js +54 -0
  38. package/dist/config/schema.js.map +1 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +224 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/providers/base.d.ts +44 -0
  43. package/dist/providers/base.js +84 -0
  44. package/dist/providers/base.js.map +1 -0
  45. package/dist/providers/deepseek.d.ts +30 -0
  46. package/dist/providers/deepseek.js +148 -0
  47. package/dist/providers/deepseek.js.map +1 -0
  48. package/dist/providers/index.d.ts +5 -0
  49. package/dist/providers/index.js +8 -0
  50. package/dist/providers/index.js.map +1 -0
  51. package/dist/providers/openai.d.ts +30 -0
  52. package/dist/providers/openai.js +123 -0
  53. package/dist/providers/openai.js.map +1 -0
  54. package/dist/providers/registry.d.ts +37 -0
  55. package/dist/providers/registry.js +65 -0
  56. package/dist/providers/registry.js.map +1 -0
  57. package/dist/providers/types.d.ts +71 -0
  58. package/dist/providers/types.js +2 -0
  59. package/dist/providers/types.js.map +1 -0
  60. package/dist/server/conversation.d.ts +101 -0
  61. package/dist/server/conversation.js +275 -0
  62. package/dist/server/conversation.js.map +1 -0
  63. package/dist/server/index.d.ts +2 -0
  64. package/dist/server/index.js +3 -0
  65. package/dist/server/index.js.map +1 -0
  66. package/dist/server/tools/consult.d.ts +15 -0
  67. package/dist/server/tools/consult.js +164 -0
  68. package/dist/server/tools/consult.js.map +1 -0
  69. package/dist/server/tools/index.d.ts +1 -0
  70. package/dist/server/tools/index.js +2 -0
  71. package/dist/server/tools/index.js.map +1 -0
  72. package/dist/types/config.d.ts +20 -0
  73. package/dist/types/config.js +2 -0
  74. package/dist/types/config.js.map +1 -0
  75. package/dist/types/index.d.ts +3 -0
  76. package/dist/types/index.js +4 -0
  77. package/dist/types/index.js.map +1 -0
  78. package/dist/types/messages.d.ts +48 -0
  79. package/dist/types/messages.js +2 -0
  80. package/dist/types/messages.js.map +1 -0
  81. package/dist/types/models.d.ts +39 -0
  82. package/dist/types/models.js +66 -0
  83. package/dist/types/models.js.map +1 -0
  84. package/dist/ui/index.html +1044 -0
  85. package/dist/utils/errors.d.ts +32 -0
  86. package/dist/utils/errors.js +53 -0
  87. package/dist/utils/errors.js.map +1 -0
  88. package/dist/utils/index.d.ts +2 -0
  89. package/dist/utils/index.js +3 -0
  90. package/dist/utils/index.js.map +1 -0
  91. package/dist/utils/logger.d.ts +13 -0
  92. package/dist/utils/logger.js +73 -0
  93. package/dist/utils/logger.js.map +1 -0
  94. package/package.json +65 -0
package/dist/index.js ADDED
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { z } from 'zod';
5
+ import { getConfigManager, CONSULTATION_MODES } from './config/index.js';
6
+ import { logger } from './utils/index.js';
7
+ import { consultAgent, continueConversation, endConversation, } from './server/index.js';
8
+ import { initializeProviders } from './providers/index.js';
9
+ import { startConfigUI, openWebUI } from './api/index.js';
10
+ /**
11
+ * Parse CLI arguments
12
+ */
13
+ function parseArgs() {
14
+ const args = process.argv.slice(2);
15
+ // Check for config mode
16
+ if (args.includes('--config') || args.includes('config') || args.includes('-c')) {
17
+ // Parse port if provided
18
+ const portIndex = args.findIndex((a) => a === '--port' || a === '-p');
19
+ let port;
20
+ if (portIndex !== -1 && args[portIndex + 1]) {
21
+ port = parseInt(args[portIndex + 1], 10);
22
+ if (isNaN(port) || port < 1 || port > 65535) {
23
+ console.error('Invalid port number. Using default.');
24
+ port = undefined;
25
+ }
26
+ }
27
+ return { mode: 'config', port };
28
+ }
29
+ // Check for help
30
+ if (args.includes('--help') || args.includes('-h')) {
31
+ console.log(`
32
+ Agent Consultation MCP - Get second opinions from DeepSeek Reasoner
33
+
34
+ Usage:
35
+ npx agent-consultation-mcp Start MCP server (stdio transport)
36
+ npx agent-consultation-mcp --config Open configuration UI in browser
37
+ npx agent-consultation-mcp --help Show this help message
38
+
39
+ Options:
40
+ --config, -c Open configuration UI to manage DeepSeek API key
41
+ --port <number>, -p Set port for config UI (default: 3456)
42
+ --help, -h Show this help message
43
+
44
+ Configuration UI:
45
+ Configure your DeepSeek API key through a web interface at
46
+ http://127.0.0.1:3456 (localhost only for security)
47
+
48
+ Supported Models:
49
+ - deepseek-reasoner (default) - Deep reasoning for complex tasks
50
+ - deepseek-chat - Fast responses for simple queries
51
+
52
+ Consultation Modes:
53
+ - debug - Systematic error analysis and debugging
54
+ - analyzeCode - Code review for bugs, security, performance
55
+ - reviewArchitecture - System design and architecture decisions
56
+ - validatePlan - Implementation plan review and validation
57
+ - explainConcept - Learn concepts with examples and analogies
58
+ - general - General second opinion (default)
59
+ `);
60
+ process.exit(0);
61
+ }
62
+ return { mode: 'mcp' };
63
+ }
64
+ /**
65
+ * Initialize and start the MCP server
66
+ */
67
+ async function main() {
68
+ const { mode, port } = parseArgs();
69
+ // Config UI mode
70
+ if (mode === 'config') {
71
+ try {
72
+ await startConfigUI({ port, openBrowser: true });
73
+ }
74
+ catch (error) {
75
+ console.error('Failed to start config UI:', error instanceof Error ? error.message : error);
76
+ process.exit(1);
77
+ }
78
+ return;
79
+ }
80
+ // MCP server mode (default)
81
+ // Initialize configuration
82
+ const configManager = getConfigManager();
83
+ await configManager.init();
84
+ // Initialize providers
85
+ await initializeProviders();
86
+ logger.info('Starting Agent Consultation MCP Server');
87
+ // Create MCP server
88
+ const server = new McpServer({
89
+ name: 'agent-consultation',
90
+ version: '2.0.0',
91
+ });
92
+ // Register consult_agent tool
93
+ server.tool('consult_agent', 'Consult DeepSeek Reasoner for a second opinion on debugging, code review, architecture, or learning', {
94
+ question: z.string().describe('The question or problem to get advice on'),
95
+ mode: z
96
+ .enum(CONSULTATION_MODES)
97
+ .optional()
98
+ .describe('Consultation mode: debug, analyzeCode, reviewArchitecture, validatePlan, explainConcept, or general'),
99
+ context: z
100
+ .string()
101
+ .optional()
102
+ .describe('Additional context like code snippets, error messages, or plans to analyze'),
103
+ }, async (args) => {
104
+ // Open Web UI in browser when tool is triggered
105
+ openWebUI().catch(() => { });
106
+ try {
107
+ const result = await consultAgent(args);
108
+ return {
109
+ content: [
110
+ {
111
+ type: 'text',
112
+ text: JSON.stringify(result, null, 2),
113
+ },
114
+ ],
115
+ };
116
+ }
117
+ catch (error) {
118
+ logger.error('consult_agent failed', {
119
+ error: error instanceof Error ? error.message : 'Unknown error',
120
+ });
121
+ return {
122
+ content: [
123
+ {
124
+ type: 'text',
125
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
126
+ },
127
+ ],
128
+ isError: true,
129
+ };
130
+ }
131
+ });
132
+ // Register continue_conversation tool
133
+ server.tool('continue_conversation', 'Continue an existing conversation with DeepSeek', {
134
+ conversationId: z
135
+ .string()
136
+ .uuid()
137
+ .describe('The conversation ID to continue'),
138
+ message: z.string().describe('Your follow-up message'),
139
+ }, async (args) => {
140
+ // Open Web UI in browser when tool is triggered
141
+ openWebUI().catch(() => { });
142
+ try {
143
+ const result = await continueConversation(args);
144
+ return {
145
+ content: [
146
+ {
147
+ type: 'text',
148
+ text: JSON.stringify(result, null, 2),
149
+ },
150
+ ],
151
+ };
152
+ }
153
+ catch (error) {
154
+ logger.error('continue_conversation failed', {
155
+ error: error instanceof Error ? error.message : 'Unknown error',
156
+ });
157
+ return {
158
+ content: [
159
+ {
160
+ type: 'text',
161
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
162
+ },
163
+ ],
164
+ isError: true,
165
+ };
166
+ }
167
+ });
168
+ // Register end_conversation tool
169
+ server.tool('end_conversation', 'End an active conversation with DeepSeek', {
170
+ conversationId: z
171
+ .string()
172
+ .uuid()
173
+ .describe('The conversation ID to end'),
174
+ }, async (args) => {
175
+ // Open Web UI in browser when tool is triggered
176
+ openWebUI().catch(() => { });
177
+ try {
178
+ const result = await endConversation(args);
179
+ return {
180
+ content: [
181
+ {
182
+ type: 'text',
183
+ text: JSON.stringify(result, null, 2),
184
+ },
185
+ ],
186
+ };
187
+ }
188
+ catch (error) {
189
+ logger.error('end_conversation failed', {
190
+ error: error instanceof Error ? error.message : 'Unknown error',
191
+ });
192
+ return {
193
+ content: [
194
+ {
195
+ type: 'text',
196
+ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
197
+ },
198
+ ],
199
+ isError: true,
200
+ };
201
+ }
202
+ });
203
+ // Connect using stdio transport
204
+ const transport = new StdioServerTransport();
205
+ await server.connect(transport);
206
+ logger.info('MCP Server connected and ready');
207
+ }
208
+ // Handle process signals
209
+ process.on('SIGINT', () => {
210
+ logger.info('Received SIGINT, shutting down');
211
+ process.exit(0);
212
+ });
213
+ process.on('SIGTERM', () => {
214
+ logger.info('Received SIGTERM, shutting down');
215
+ process.exit(0);
216
+ });
217
+ // Start the server
218
+ main().catch((error) => {
219
+ logger.error('Failed to start MCP server', {
220
+ error: error instanceof Error ? error.message : 'Unknown error',
221
+ });
222
+ process.exit(1);
223
+ });
224
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { ProviderType } from '../types/index.js';
2
+ import type { IProvider, ProviderMessage, CompletionOptions, ProviderResponse, ProviderErrorInfo } from './types.js';
3
+ /**
4
+ * Custom error class for provider errors
5
+ */
6
+ export declare class ProviderError extends Error {
7
+ readonly info: ProviderErrorInfo;
8
+ constructor(info: ProviderErrorInfo);
9
+ }
10
+ /**
11
+ * Abstract base class for all providers
12
+ */
13
+ export declare abstract class BaseProvider implements IProvider {
14
+ abstract readonly name: ProviderType;
15
+ /**
16
+ * Get the API key for this provider
17
+ */
18
+ protected getApiKey(): string | undefined;
19
+ /**
20
+ * Check if the provider is configured
21
+ */
22
+ isConfigured(): boolean;
23
+ /**
24
+ * Create a chat completion - must be implemented by subclasses
25
+ */
26
+ abstract createCompletion(messages: ProviderMessage[], options: CompletionOptions): Promise<ProviderResponse>;
27
+ /**
28
+ * Format system prompt for models that don't support it directly
29
+ * Prepends system prompt to the first user message
30
+ */
31
+ protected formatSystemPromptAsUser(messages: ProviderMessage[], systemPrompt?: string): ProviderMessage[];
32
+ /**
33
+ * Log completion request
34
+ */
35
+ protected logRequest(model: string, messageCount: number, options: CompletionOptions): void;
36
+ /**
37
+ * Log completion response
38
+ */
39
+ protected logResponse(response: ProviderResponse): void;
40
+ /**
41
+ * Create a standardized provider error
42
+ */
43
+ protected createError(code: string, message: string, retryable: boolean, statusCode?: number): ProviderError;
44
+ }
@@ -0,0 +1,84 @@
1
+ import { getConfigManager } from '../config/index.js';
2
+ import { logger } from '../utils/index.js';
3
+ /**
4
+ * Custom error class for provider errors
5
+ */
6
+ export class ProviderError extends Error {
7
+ info;
8
+ constructor(info) {
9
+ super(info.message);
10
+ this.name = 'ProviderError';
11
+ this.info = info;
12
+ }
13
+ }
14
+ /**
15
+ * Abstract base class for all providers
16
+ */
17
+ export class BaseProvider {
18
+ /**
19
+ * Get the API key for this provider
20
+ */
21
+ getApiKey() {
22
+ return getConfigManager().getProviderKey(this.name);
23
+ }
24
+ /**
25
+ * Check if the provider is configured
26
+ */
27
+ isConfigured() {
28
+ return getConfigManager().isProviderConfigured(this.name);
29
+ }
30
+ /**
31
+ * Format system prompt for models that don't support it directly
32
+ * Prepends system prompt to the first user message
33
+ */
34
+ formatSystemPromptAsUser(messages, systemPrompt) {
35
+ if (!systemPrompt)
36
+ return messages;
37
+ const result = [...messages];
38
+ const firstUserIndex = result.findIndex((m) => m.role === 'user');
39
+ if (firstUserIndex >= 0) {
40
+ result[firstUserIndex] = {
41
+ ...result[firstUserIndex],
42
+ content: `[System Instructions]\n${systemPrompt}\n\n[User Query]\n${result[firstUserIndex].content}`,
43
+ };
44
+ }
45
+ return result;
46
+ }
47
+ /**
48
+ * Log completion request
49
+ */
50
+ logRequest(model, messageCount, options) {
51
+ logger.info('Provider completion request', {
52
+ provider: this.name,
53
+ model,
54
+ messageCount,
55
+ maxTokens: options.maxTokens,
56
+ hasSystemPrompt: !!options.systemPrompt,
57
+ });
58
+ }
59
+ /**
60
+ * Log completion response
61
+ */
62
+ logResponse(response) {
63
+ logger.info('Provider completion response', {
64
+ provider: this.name,
65
+ model: response.model,
66
+ finishReason: response.finishReason,
67
+ usage: response.usage,
68
+ hasReasoningContent: !!response.reasoningContent,
69
+ });
70
+ }
71
+ /**
72
+ * Create a standardized provider error
73
+ */
74
+ createError(code, message, retryable, statusCode) {
75
+ return new ProviderError({
76
+ provider: this.name,
77
+ code,
78
+ message,
79
+ retryable,
80
+ statusCode,
81
+ });
82
+ }
83
+ }
84
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,IAAI,CAAoB;IAEjC,YAAY,IAAuB;QACjC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAgB,YAAY;IAGhC;;OAEG;IACO,SAAS;QACjB,OAAO,gBAAgB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,gBAAgB,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAUD;;;OAGG;IACO,wBAAwB,CAChC,QAA2B,EAC3B,YAAqB;QAErB,IAAI,CAAC,YAAY;YAAE,OAAO,QAAQ,CAAC;QAEnC,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC7B,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAElE,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,cAAc,CAAC,GAAG;gBACvB,GAAG,MAAM,CAAC,cAAc,CAAC;gBACzB,OAAO,EAAE,0BAA0B,YAAY,qBAAqB,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;aACrG,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACO,UAAU,CAClB,KAAa,EACb,YAAoB,EACpB,OAA0B;QAE1B,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACzC,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK;YACL,YAAY;YACZ,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY;SACxC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACO,WAAW,CAAC,QAA0B;QAC9C,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC1C,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,mBAAmB,EAAE,CAAC,CAAC,QAAQ,CAAC,gBAAgB;SACjD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACO,WAAW,CACnB,IAAY,EACZ,OAAe,EACf,SAAkB,EAClB,UAAmB;QAEnB,OAAO,IAAI,aAAa,CAAC;YACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,IAAI;YACJ,OAAO;YACP,SAAS;YACT,UAAU;SACX,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ import type { ProviderType } from '../types/index.js';
2
+ import type { ProviderMessage, CompletionOptions, ProviderResponse } from './types.js';
3
+ import { BaseProvider } from './base.js';
4
+ /**
5
+ * DeepSeek Provider - Uses OpenAI-compatible SDK
6
+ */
7
+ export declare class DeepSeekProvider extends BaseProvider {
8
+ readonly name: ProviderType;
9
+ private client;
10
+ /**
11
+ * Get or create the OpenAI-compatible client for DeepSeek
12
+ */
13
+ private getClient;
14
+ /**
15
+ * Check if a model is a reasoning model
16
+ */
17
+ private isReasoningModel;
18
+ /**
19
+ * Check if a model supports system prompts
20
+ */
21
+ private supportsSystemPrompt;
22
+ /**
23
+ * Get the actual API model ID
24
+ */
25
+ private getApiModel;
26
+ /**
27
+ * Create a chat completion
28
+ */
29
+ createCompletion(messages: ProviderMessage[], options: CompletionOptions): Promise<ProviderResponse>;
30
+ }
@@ -0,0 +1,148 @@
1
+ import OpenAI from 'openai';
2
+ import { MODEL_CONFIG } from '../types/index.js';
3
+ import { BaseProvider } from './base.js';
4
+ import { logger } from '../utils/index.js';
5
+ /**
6
+ * DeepSeek API base URL
7
+ */
8
+ const DEEPSEEK_BASE_URL = 'https://api.deepseek.com';
9
+ /**
10
+ * DeepSeek Provider - Uses OpenAI-compatible SDK
11
+ */
12
+ export class DeepSeekProvider extends BaseProvider {
13
+ name = 'deepseek';
14
+ client = null;
15
+ /**
16
+ * Get or create the OpenAI-compatible client for DeepSeek
17
+ */
18
+ getClient() {
19
+ if (!this.client) {
20
+ const apiKey = this.getApiKey();
21
+ if (!apiKey) {
22
+ throw this.createError('AUTH_ERROR', 'DeepSeek API key not configured', false);
23
+ }
24
+ this.client = new OpenAI({
25
+ apiKey,
26
+ baseURL: DEEPSEEK_BASE_URL,
27
+ });
28
+ }
29
+ return this.client;
30
+ }
31
+ /**
32
+ * Check if a model is a reasoning model
33
+ */
34
+ isReasoningModel(model) {
35
+ const config = MODEL_CONFIG[model];
36
+ return config?.isReasoning ?? false;
37
+ }
38
+ /**
39
+ * Check if a model supports system prompts
40
+ */
41
+ supportsSystemPrompt(model) {
42
+ const config = MODEL_CONFIG[model];
43
+ return config?.supportsSystemPrompt ?? true;
44
+ }
45
+ /**
46
+ * Get the actual API model ID
47
+ */
48
+ getApiModel(model) {
49
+ const config = MODEL_CONFIG[model];
50
+ return config?.apiModel ?? model;
51
+ }
52
+ /**
53
+ * Create a chat completion
54
+ */
55
+ async createCompletion(messages, options) {
56
+ const client = this.getClient();
57
+ const apiModel = this.getApiModel(options.model);
58
+ const isReasoning = this.isReasoningModel(options.model);
59
+ const supportsSystem = this.supportsSystemPrompt(options.model);
60
+ this.logRequest(apiModel, messages.length, options);
61
+ const startTime = Date.now();
62
+ try {
63
+ // Build messages array
64
+ let chatMessages = [];
65
+ // Handle system prompt
66
+ if (options.systemPrompt) {
67
+ if (supportsSystem) {
68
+ chatMessages.push({
69
+ role: 'system',
70
+ content: options.systemPrompt,
71
+ });
72
+ }
73
+ else {
74
+ // For reasoning models, prepend to first user message
75
+ messages = this.formatSystemPromptAsUser(messages, options.systemPrompt);
76
+ }
77
+ }
78
+ // Add conversation messages
79
+ chatMessages.push(...messages.map((m) => ({
80
+ role: m.role,
81
+ content: m.content,
82
+ })));
83
+ // Build request parameters
84
+ const requestParams = {
85
+ model: apiModel,
86
+ messages: chatMessages,
87
+ };
88
+ // Handle token limits differently for reasoning models
89
+ if (isReasoning) {
90
+ // Reasoning models use max_completion_tokens
91
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
+ requestParams.max_completion_tokens =
93
+ options.maxTokens || 4096;
94
+ // DeepSeek reasoner: temperature must be 0
95
+ requestParams.temperature = 0;
96
+ }
97
+ else {
98
+ // Standard models use max_tokens
99
+ requestParams.max_tokens = options.maxTokens || 4096;
100
+ // Set temperature for non-reasoning models
101
+ if (options.temperature !== undefined) {
102
+ requestParams.temperature = options.temperature;
103
+ }
104
+ }
105
+ const response = await client.chat.completions.create(requestParams);
106
+ const choice = response.choices[0];
107
+ const content = choice?.message?.content || '';
108
+ // Extract reasoning content if present (DeepSeek Reasoner specific)
109
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
+ const reasoningContent = choice?.message
111
+ ?.reasoning_content;
112
+ const responseTime = Date.now() - startTime;
113
+ if (reasoningContent) {
114
+ logger.debug('Reasoning content received', {
115
+ model: apiModel,
116
+ reasoningLength: reasoningContent.length,
117
+ thinkingTime: responseTime,
118
+ });
119
+ }
120
+ const result = {
121
+ content,
122
+ model: response.model,
123
+ usage: response.usage
124
+ ? {
125
+ promptTokens: response.usage.prompt_tokens,
126
+ completionTokens: response.usage.completion_tokens,
127
+ totalTokens: response.usage.total_tokens,
128
+ }
129
+ : undefined,
130
+ finishReason: choice?.finish_reason || undefined,
131
+ reasoningContent,
132
+ responseTime,
133
+ };
134
+ this.logResponse(result);
135
+ return result;
136
+ }
137
+ catch (error) {
138
+ if (error instanceof OpenAI.APIError) {
139
+ const retryable = error.status === 429 ||
140
+ error.status === 500 ||
141
+ error.status === 503;
142
+ throw this.createError(error.code || 'API_ERROR', error.message, retryable, error.status);
143
+ }
144
+ throw error;
145
+ }
146
+ }
147
+ }
148
+ //# sourceMappingURL=deepseek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/providers/deepseek.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { IProvider, ProviderMessage, CompletionOptions, ProviderResponse, TokenUsage, ProviderErrorInfo, ModelConfig, } from './types.js';
2
+ export { BaseProvider, ProviderError } from './base.js';
3
+ export { ProviderRegistry, getProviderRegistry, initializeProviders, } from './registry.js';
4
+ export { DeepSeekProvider } from './deepseek.js';
5
+ export { OpenAIProvider } from './openai.js';
@@ -0,0 +1,8 @@
1
+ // Base
2
+ export { BaseProvider, ProviderError } from './base.js';
3
+ // Registry
4
+ export { ProviderRegistry, getProviderRegistry, initializeProviders, } from './registry.js';
5
+ // Providers
6
+ export { DeepSeekProvider } from './deepseek.js';
7
+ export { OpenAIProvider } from './openai.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAWA,OAAO;AACP,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAExD,WAAW;AACX,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ProviderType } from '../types/index.js';
2
+ import type { ProviderMessage, CompletionOptions, ProviderResponse } from './types.js';
3
+ import { BaseProvider } from './base.js';
4
+ /**
5
+ * OpenAI Provider - GPT-5.2 models
6
+ */
7
+ export declare class OpenAIProvider extends BaseProvider {
8
+ readonly name: ProviderType;
9
+ private client;
10
+ /**
11
+ * Get or create the OpenAI client
12
+ */
13
+ private getClient;
14
+ /**
15
+ * Check if a model is a reasoning model
16
+ */
17
+ private isReasoningModel;
18
+ /**
19
+ * Get reasoning effort for the model
20
+ */
21
+ private getReasoningEffort;
22
+ /**
23
+ * Get the actual API model ID
24
+ */
25
+ private getApiModel;
26
+ /**
27
+ * Create a chat completion
28
+ */
29
+ createCompletion(messages: ProviderMessage[], options: CompletionOptions): Promise<ProviderResponse>;
30
+ }