Search
Code3,144
- **Automatic PR Analysis**: Responds to GitHub pull request webhooks instantly- **AI-Powered Reviews**: Uses Anthropic's Claude Haiku 4.5 for intelligent code analysis and typo detection- **Secure Integration**: Webhook signature verification for security- **Smart File Filtering**: Reviews code files and markdown files for typos, skips other documentation and config files - **Pull requests**: Read and write (required to post review comments)**Anthropic API Key**: Get your API key from [Anthropic Console](https://console.anthropic.com/)### 2. Configure Environment VariablesIn Val Town, set these environment variables:- `GITHUB_TOKEN`: Your GitHub personal access token- `ANTHROPIC_API_KEY`: Your Anthropic API key - `WEBHOOK_SECRET`: A random secret string (generate with: `openssl rand -hex 32`)- **Clear Descriptions**: Add good PR descriptions to help the AI understand context- **Test First**: Use the debug endpoints to verify your setup before going live- **Monitor Usage**: Keep an eye on your Anthropic API usage for cost management- **Apply Suggestions**: Use GitHub's "Apply suggestion" button for one-click fixes- **File Size**: Large files are truncated to 2000 characters for analysis- **File Types**: Reviews code files for quality/security and markdown files for typos/grammar- **Dependencies**: Requires internet access to GitHub and Anthropic APIs- **Rate Limits**: Subject to GitHub and Anthropic API rate limitsThese limitations help ensure fast, reliable reviews while managing API costs and complexity.```GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxWEBHOOK_SECRET=a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456```5. Generate token and copy the value### ANTHROPIC_API_KEY1. Go to https://console.anthropic.com/2. Sign up/login3. Go to API Keys section // Main debug page const githubToken = Deno.env.get("GITHUB_TOKEN"); const anthropicKey = Deno.env.get("ANTHROPIC_API_KEY"); const webhookSecret = Deno.env.get("WEBHOOK_SECRET"); environment: { GITHUB_TOKEN: githubToken ? "✅ Set" : "❌ Missing", ANTHROPIC_API_KEY: anthropicKey ? "✅ Set" : "❌ Missing", WEBHOOK_SECRET: webhookSecret ? "✅ Set" : "❌ Missing" },async function testClaudeConnection(): Promise<Response> { const apiKey = Deno.env.get("ANTHROPIC_API_KEY"); if (!apiKey) { return new Response(JSON.stringify({ success: false, error: "ANTHROPIC_API_KEY not configured" }), { status: 400, try { const response = await fetch("https://api.anthropic.com/v1/messages", { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey, "anthropic-version": "2023-06-01", }, body: JSON.stringify({ files: FileChange[]): Promise<ReviewResult> { const apiKey = Deno.env.get("ANTHROPIC_API_KEY"); if (!apiKey) { throw new Error("ANTHROPIC_API_KEY not configured"); } try { const response = await fetch("https://api.anthropic.com/v1/messages", { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey, "anthropic-version": "2023-06-01", }, body: JSON.stringify({import { Bot } from "https://deno.land/x/grammy@v1.35.0/mod.ts";import { DateTime } from "https://esm.sh/luxon@3.4.4";import Anthropic from "npm:@anthropic-ai/sdk@0.24.3";import { backstory } from "../backstory.ts";import {} from "../memoryUtils.ts";async function generateBriefingContent(anthropic, memories, today, isSunday) { try { const weekdaysHelp = generateWeekDays(today); }; console.log("Sending prompt to Anthropic...", userMessage); const response = await anthropic.messages.create({ model: "claude-3-7-sonnet-latest", max_tokens: 30000,export async function sendDailyBriefing(chatId?: string, today?: DateTime) { // Get API keys from environment const apiKey = Deno.env.get("ANTHROPIC_API_KEY"); const telegramToken = Deno.env.get("TELEGRAM_TOKEN"); if (!apiKey) { console.error("Anthropic API key is not configured."); return; } } // Initialize Anthropic client const anthropic = new Anthropic({ apiKey }); // Initialize Telegram bot // Generate briefing content const content = await generateBriefingContent( anthropic, memories, today,You'll need to set up some environment variables to make it run.- `ANTHROPIC_API_KEY` for LLM calls- You'll need to follow [these instructions](https://docs.val.town/integrations/telegram/) to make a telegram bot, and set `TELEGRAM_TOKEN`. You'll also need to get a `TELEGRAM_CHAT_ID` in order to have the bot remember chat contents.- For the Google Calendar integration you'll need `GOOGLE_CALENDAR_ACCOUNT_ID` and `GOOGLE_CALENDAR_CALENDAR_ID`. See [these instuctions](https://www.val.town/v/stevekrouse/pipedream) for details.import { DateTime } from "https://esm.sh/luxon@3.4.4";import Anthropic from "npm:@anthropic-ai/sdk@0.24.3";const RECIPIENTS = ["Geoffrey", "Maggie"] as const;async function analyzeHtmlContent( anthropic: Anthropic, htmlContent: string, imageSummaries: ImageSummary[]) { try { const response = await anthropic.messages.create({ model: "claude-3-5-sonnet-latest", max_tokens: 4196, console.log(e.text); // Get Anthropic API key from environment const apiKey = Deno.env.get("ANTHROPIC_API_KEY"); if (!apiKey) { console.error("Anthropic API key is not configured for this val."); return; } // Initialize Anthropic client const anthropic = new Anthropic({ apiKey }); // Process each image attachment serially ); const response = await anthropic.messages.create({ model: "claude-3-5-sonnet-latest", max_tokens: 4196, // Analyze HTML content const htmlAnalysis = await analyzeHtmlContent( anthropic, e.html || "", summaries} from "https://deno.land/x/grammy@v1.35.0/mod.ts";import { DateTime } from "https://esm.sh/luxon@3.4.4";import Anthropic from "npm:@anthropic-ai/sdk@0.24.3";import { backstory } from "../backstory.ts";import {/** * Format chat history for Anthropic API */function formatChatHistoryForAI(history) { */async function analyzeMessageContent( anthropic, username, messageText, console.log({ systemPrompt, formattedHistory }); const response = await anthropic.messages.create({ model: "claude-3-5-sonnet-latest", max_tokens: 4196,bot.on("message", async (ctx) => { try { // Get Anthropic API key from environment const apiKey = Deno.env.get("ANTHROPIC_API_KEY"); if (!apiKey) { console.error("Anthropic API key is not configured."); ctx.reply( "I apologize, but I'm not properly configured at the moment. Please inform the household administrator." } // Initialize Anthropic client const anthropic = new Anthropic({ apiKey }); // Get message text and user info // Analyze message content with chat history context const analysis = await analyzeMessageContent( anthropic, username, messageText,} from "https://esm.town/v/geoffreylitt/getWeather";import { sqlite } from "https://esm.town/v/stevekrouse/sqlite";import Anthropic from "npm:@anthropic-ai/sdk@0.24.3";const TABLE_NAME = `memories`; try { // Get API key from environment const apiKey = Deno.env.get("ANTHROPIC_API_KEY"); if (!apiKey) { console.error("Anthropic API key is not configured."); return null; } // Initialize Anthropic client const anthropic = new Anthropic({ apiKey }); const response = await anthropic.messages.create({ model: "claude-3-5-sonnet-latest", max_tokens: 150,import { nanoid } from "https://esm.sh/nanoid@5.0.5";import { sqlite } from "https://esm.town/v/stevekrouse/sqlite";import Anthropic from "npm:@anthropic-ai/sdk@0.24.3";const TABLE_NAME = `memories`; try { // Get API key from environment const apiKey = Deno.env.get("ANTHROPIC_API_KEY"); if (!apiKey) { console.error("Anthropic API key is not configured."); return null; } // Initialize Anthropic client const anthropic = new Anthropic({ apiKey }); // Format previous facts for the prompt console.log({ message }); const response = await anthropic.messages.create({ model: "claude-3-5-sonnet-latest", max_tokens: 1000,