@zhanghongping/json-sage-workflow-cli
Version:
An intelligent JSON processing workflow system with improved error handling and configuration
92 lines (77 loc) • 2.88 kB
text/typescript
import axios from 'axios';
import * as dotenv from 'dotenv';
dotenv.config();
export interface DeepSeekConfig {
apiKey?: string;
apiBaseUrl?: string;
model?: string;
temperature?: number;
maxTokens?: number;
}
export interface SchemaGenerationOptions {
includeExamples?: boolean;
includeDescriptions?: boolean;
format?: 'json-schema-draft-07' | 'json-schema-draft-04';
}
export class DeepSeekService {
private readonly config: DeepSeekConfig;
constructor(config: DeepSeekConfig = {}) {
this.config = {
apiKey: config.apiKey || process.env.DEEPSEEK_API_KEY,
apiBaseUrl: config.apiBaseUrl || 'https://api.deepseek.com/v1',
model: config.model || 'deepseek-chat',
temperature: config.temperature || 0.3,
maxTokens: config.maxTokens || 4000,
};
if (!this.config.apiKey) {
throw new Error('DeepSeek API key is required. Please set it in the constructor or as DEEPSEEK_API_KEY environment variable.');
}
}
private generatePrompt(json: string, options: SchemaGenerationOptions): string {
return `Please analyze the following JSON and generate a JSON Schema that validates it.
Requirements:
- Use ${options.format || 'json-schema-draft-07'} format
- ${options.includeDescriptions ? 'Include detailed descriptions for each field' : 'Keep descriptions minimal'}
- ${options.includeExamples ? 'Include examples for each field based on the input' : 'Do not include examples'}
- Infer appropriate types and formats
- Include appropriate required fields
JSON to analyze:
${json}
Please respond with only the JSON Schema, no additional text.`;
}
public async generateSchema(json: string, options: SchemaGenerationOptions = {}): Promise<string> {
try {
// Validate JSON
JSON.parse(json);
const response = await axios.post(
`${this.config.apiBaseUrl}/chat/completions`,
{
model: this.config.model,
messages: [
{
role: 'user',
content: this.generatePrompt(json, options),
},
],
temperature: this.config.temperature,
max_tokens: this.config.maxTokens,
},
{
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.config.apiKey}`,
},
}
);
const schema = response.data.choices[0].message.content;
// Validate that the response is a valid JSON Schema
JSON.parse(schema);
return schema;
} catch (error) {
if (axios.isAxiosError(error)) {
throw new Error(`DeepSeek API error: ${error.response?.data?.error?.message || error.message}`);
}
throw new Error(`Failed to generate schema: ${error.message}`);
}
}
}