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.
- package/LICENSE +21 -0
- package/README.md +140 -0
- package/dist/api/index.d.ts +27 -0
- package/dist/api/index.js +213 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware/security.d.ts +6 -0
- package/dist/api/middleware/security.js +28 -0
- package/dist/api/middleware/security.js.map +1 -0
- package/dist/api/routes/chat.d.ts +2 -0
- package/dist/api/routes/chat.js +61 -0
- package/dist/api/routes/chat.js.map +1 -0
- package/dist/api/routes/config.d.ts +2 -0
- package/dist/api/routes/config.js +81 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/providers.d.ts +2 -0
- package/dist/api/routes/providers.js +225 -0
- package/dist/api/routes/providers.js.map +1 -0
- package/dist/api/standalone-server.d.ts +12 -0
- package/dist/api/standalone-server.js +91 -0
- package/dist/api/standalone-server.js.map +1 -0
- package/dist/config/defaults.d.ts +17 -0
- package/dist/config/defaults.js +30 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/encryption.d.ts +12 -0
- package/dist/config/encryption.js +85 -0
- package/dist/config/encryption.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +62 -0
- package/dist/config/manager.js +186 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/prompts.d.ts +10 -0
- package/dist/config/prompts.js +140 -0
- package/dist/config/prompts.js.map +1 -0
- package/dist/config/schema.d.ts +141 -0
- package/dist/config/schema.js +54 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +224 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/base.d.ts +44 -0
- package/dist/providers/base.js +84 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/deepseek.d.ts +30 -0
- package/dist/providers/deepseek.js +148 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +30 -0
- package/dist/providers/openai.js +123 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +37 -0
- package/dist/providers/registry.js +65 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +71 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/server/conversation.d.ts +101 -0
- package/dist/server/conversation.js +275 -0
- package/dist/server/conversation.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/tools/consult.d.ts +15 -0
- package/dist/server/tools/consult.js +164 -0
- package/dist/server/tools/consult.js.map +1 -0
- package/dist/server/tools/index.d.ts +1 -0
- package/dist/server/tools/index.js +2 -0
- package/dist/server/tools/index.js.map +1 -0
- package/dist/types/config.d.ts +20 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +48 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/models.d.ts +39 -0
- package/dist/types/models.js +66 -0
- package/dist/types/models.js.map +1 -0
- package/dist/ui/index.html +1044 -0
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.js +53 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.js +73 -0
- package/dist/utils/logger.js.map +1 -0
- 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
|
+
}
|