19console.log(`📤 Sending follow-up message: ${content}`);
20try {
21await fetch(`https://discord.com/api/v10/webhooks/${applicationId}/${interactionToken}/messages/@original`, {
22method: "PATCH",
23headers: {
50: `applications/${DISCORD_APP_ID}/commands`;
5152console.log(`📡 Using API endpoint: ${endpoint}`);
5354try {
5859// Register the command using POST for a single command
60const response = await fetch(`https://discord.com/api/v10/${endpoint}`, {
61method: "POST", // Using POST for single command creation
62headers: {
57: `applications/${DISCORD_APP_ID}/commands`;
5859console.log(`📡 Using API endpoint: ${endpoint}`);
60const results = [];
616768// Register the command using POST for a single command
69const response = await fetch(`https://discord.com/api/v10/${endpoint}`, {
70method: "POST", // Using POST for single command creation
71headers: {
50: `applications/${DISCORD_APP_ID}/commands`;
5152console.log(`📡 Using API endpoint: ${endpoint}`);
5354try {
5859// Register the command using POST for a single command
60const response = await fetch(`https://discord.com/api/v10/${endpoint}`, {
61method: "POST", // Using POST for single command creation
62headers: {
35: `applications/${DISCORD_APP_ID}/commands`;
3637console.log(`📡 Using API endpoint: ${endpoint}`);
3839try {
41console.log("🔍 Checking current commands...");
4243const getResponse = await fetch(`https://discord.com/api/v10/${endpoint}`, {
44method: "GET",
45headers: {
6263// Send empty array to unregister all commands
64const response = await fetch(`https://discord.com/api/v10/${endpoint}`, {
65method: "PUT",
66headers: {
9- **File Browser**: Select specific files to include in the context window for more focused AI assistance
10- **Branch Management**: View, select, and create branches without leaving the app
11- **Cost Tracking**: See estimated API usage costs for each interaction
12- **Sound Notifications**: Get alerted when Claude finishes responding
13- **Mobile-Friendly**: Works on both desktop and mobile devices
14- **Usage Dashboard**: Monitor API usage and inference calls with detailed analytics
1516## How It Works
17181. **Login**: Authenticate with your Val Town API token and Anthropic API key
192. **Select a Project**: Choose which Val Town project you want to work on
203. **Select Files**: Browse your project files and select which ones to include in the context window
26### Prerequisites
2728- A Val Town account with API access
29- An Anthropic API key (Claude 3.7 Sonnet)
3031### Setup
32331. Visit the OpenTownie app
342. Enter your Val Town API token (with `projects:write` and `users:read` permissions)
353. Enter your Anthropic API key
364. Click "Login" to access your projects
3749- React frontend with TypeScript
50- React Router
51- Hono API server backend
52- Web Audio API for sound notifications
53- AI SDK for Claude integration
5455The application proxies requests to the Anthropic API and Val Town API, allowing Claude to view and edit your project files directly.
5657## Privacy & Security
5859- Your Val Town API token and Anthropic API key are stored locally in your browser
60- No data is stored on our servers
61- All communication with the APIs is done directly from your browser
62
Townieschema.tsx2 matches
19finish_reason?: string;
20num_images?: number;
21our_api_token: boolean;
22}
2344finish_reason TEXT,
45num_images INTEGER,
46our_api_token INTEGER NOT NULL,
47finish_timestamp INTEGER
48)
Townieuser-summary.ts1 match
20SUM(num_images) as total_images
21FROM ${USAGE_TABLE}
22WHERE our_api_token = 1
23GROUP BY user_id, username
24ORDER BY total_price DESC
Townierequests.ts4 matches
17finish_reason: string | null;
18num_images: number | null;
19our_api_token: number;
20}
2157
58// Fetch the inference calls data
59fetch('/api/inference-calls?usage_id=' + usageId)
60.then(response => response.json())
61.then(data => {
192<th>Finish</th>
193<th>Images</th>
194<th>Our API</th>
195</tr>
196</thead>
216<td>${row.finish_reason || '-'}</td>
217<td>${formatNumber(row.num_images)}</td>
218<td>${formatBoolean(row.our_api_token)}</td>
219</tr>
220`).join("")}
1# Usage Dashboard
23A dashboard for monitoring API usage and inference calls.
45## Features
20index.ts # Main entry point and routing
21auth.ts # Authentication logic
22/api/
23index.ts # API request handler
24requests.ts # API endpoints for requests data
25inference-calls.ts # API endpoints for inference calls
26user-summary.ts # API endpoints for user summary data
27/views/
28layout.ts # Common layout template
54- Links back to the associated request
5556### API Endpoints
5758- `/api/requests` - Get paginated requests
59- `/api/requests?usage_id=123` - Get a specific request
60- `/api/inference-calls` - Get paginated inference calls
61- `/api/inference-calls?usage_id=123` - Get inference calls for a specific request
62- `/api/user-summary` - Get user summary data
6364## Debugging