Bot & Automation

Market AI

/root/hermes-projects/Market AI

packages/provider-adapters/src/ai-provider.ts text
export interface AiReviewInput {
  prompt: string;
  system?: string;
}

export interface AiReviewResult {
  provider: "github_models" | "disabled";
  model?: string;
  content: string;
}

export function isGithubModelsConfigured(): boolean {
  return Boolean(process.env.GITHUB_MODELS_TOKEN);
}

function githubModelsEndpoint(): string {
  const org = process.env.GITHUB_MODELS_ORG?.trim();

  if (org) {
    return `https://models.github.ai/orgs/${org}/inference/chat/completions`;
  }

  const baseUrl = process.env.GITHUB_MODELS_BASE_URL?.trim() || "https://models.github.ai/inference";
  return `${baseUrl.replace(/\/$/, "")}/chat/completions`;
}

export async function generateAiReview(input: AiReviewInput): Promise<AiReviewResult> {
  const token = process.env.GITHUB_MODELS_TOKEN;
  const model = process.env.GITHUB_MODELS_MODEL?.trim() || "openai/gpt-4.1";

  if (!token) {
    return {
      provider: "disabled",
      content: "AI review provider is not configured.",
    };
  }

  const response = await fetch(githubModelsEndpoint(), {
    method: "POST",
    headers: {
      Accept: "application/vnd.github+json",
      Authorization: `Bearer ${token}`,
      "X-GitHub-Api-Version": "2026-03-10",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      model,
      messages: [
        {
          role: "system",
          content:
            input.system ??
            "You are a risk-first trading analysis reviewer. Never promise profit or guaranteed accuracy.",
        },
        { role: "user", content: input.prompt },
      ],
      temperature: 0.2,
      max_tokens: 350,
    }),
  });

  const data = (await response.json()) as {
    choices?: Array<{ message?: { content?: string } }>;
    message?: string;
    error?: { message?: string };
  };

  if (!response.ok) {
    const safeDetail = data.error?.message ?? data.message ?? `GitHub Models request failed with ${response.status}`;
    throw new Error(safeDetail);
  }

  return {
    provider: "github_models",
    model,
    content: data.choices?.[0]?.message?.content?.trim() || "AI review returned an empty response.",
  };
}