perplexity-hackathon-LawMitra / perplexity_hackathon / src / services / legalQuestionService.ts
legalQuestionService.ts
Raw
import axios from 'axios';
import { z } from 'zod';

export class LegalQuestionService {
  private readonly apiKey: string;
  private readonly apiUrl: string;

  constructor() {
    this.apiKey = process.env.PERPLEXITY_API_KEY || '';
    this.apiUrl = 'https://api.perplexity.ai/chat/completions';

    if (!this.apiKey) {
      throw new Error('PERPLEXITY_API_KEY environment variable is not set');
    }
  }

  async getLegalAnswer(question: string): Promise<string> {
    try {
      const response = await axios.post(
        this.apiUrl,
        {
          model: 'sonar-medium-online',
          messages: [
            {
              role: 'system',
              content: 'You are a legal expert assistant. Provide clear, accurate, and helpful legal information. Remember to include appropriate disclaimers when necessary.'
            },
            {
              role: 'user',
              content: question
            }
          ]
        },
        {
          headers: {
            'Authorization': `Bearer ${this.apiKey}`,
            'Content-Type': 'application/json'
          }
        }
      );

      const responseSchema = z.object({
        choices: z.array(z.object({
          message: z.object({
            content: z.string()
          })
        }))
      });

      const validatedResponse = responseSchema.parse(response.data);
      return validatedResponse.choices[0].message.content;
    } catch (error) {
      console.error('Error getting legal answer:', error);
      throw new Error('Failed to get legal answer');
    }
  }
}