discord-botREADME.md3 matches
25- Node.js 16+ and npm
26- Discord account with Bot token
27- OpenAI API key (for AI-powered queries)
28- Val.town account (for deployment)
2951- `DISCORD_USER_ID`: Your Discord user ID
52- `SPOUSE_USER_ID`: Your partner's Discord user ID
53- `OPENAI_API_KEY`: Your OpenAI API key
54555. Initialize the database
146147- Discord.js for Discord API integration
148- OpenAI for AI-powered querying
149- Val.town for hosting and scheduling
150- Better-SQLite3 for database management
discord-bot.cursorrules4 matches
94Note: When changing a SQLite table's schema, change the table's name (e.g., add _2 or _3) to create a fresh table.
9596### OpenAI
9798```ts
99import { OpenAI } from "https://esm.town/v/std/openai";
100const openai = new OpenAI();
101const completion = await openai.chat.completions.create({
102messages: [
103{ role: "user", content: "Say hello in a creative way" },
discord-botDISCORD_BOT_SETUP.md3 matches
57```
5859## 7. Get OpenAI API Key
60611. Go to [OpenAI's website](https://platform.openai.com/)
622. Sign up or log in
633. Navigate to the API keys section
666. Add it to your `.env` file:
67```
68OPENAI_API_KEY=your_openai_api_key_here
69```
70
6* Uses 'npm:pdf.js-extract' for direct PDF text extraction.
7* Serves HTML UI & API endpoint from the same Val.
8* OpenAI import is dynamically done inside the main server function.
9*
10* Based on structure from multi-agent support simulation example.
11* Assumes 'openai' secret is set in Val Town environment variables.
12*
13* Last Updated: 2025-05-01 (Dashboard UI, Localization, Animation Integration)
950export default async function(req: Request) {
951// --- Dynamic Imports (Inside Handler) ---
952const { OpenAI } = await import("https://esm.town/v/std/openai");
953const { z } = await import("npm:zod");
954const { fetch } = await import("https://esm.town/v/std/fetch");
990}
991992// --- Helper Function: Call OpenAI API (Unchanged) ---
993async function callOpenAI(
994openai: OpenAI,
995systemPrompt: string,
996userMessage: string,
999): Promise<{ role: "assistant" | "system"; content: string | object }> {
1000try {
1001const response = await openai.chat.completions.create({
1002model: model,
1003messages: [{ role: "system", content: systemPrompt }, { role: "user", content: userMessage }],
1011return { role: "assistant", content: JSON.parse(content) };
1012} catch (parseError) {
1013console.error("OpenAI JSON Parse Error:", parseError, "Raw Content:", content);
1014throw new Error(`AI response was not valid JSON. Raw: ${content.substring(0, 150)}...`);
1015}
1016} else { return { role: "assistant", content: content }; }
1017} catch (error) {
1018console.error(`OpenAI API call failed. ExpectJSON: ${expectJson}. Error:`, error);
1019let errorMessage = "Error communicating with AI model.";
1020if (error.message) { errorMessage += ` Details: ${error.message}`; }
1021// Check for specific error types if needed (e.g., rate limits, auth)
1022if (error.status === 401) errorMessage = "Authentication error with OpenAI API. Check your secret key.";
1023if (error.status === 429) errorMessage = "OpenAI API rate limit exceeded. Please try again later.";
10241025return { role: "system", content: errorMessage };
1112log: LogEntry[],
1113): Promise<LogEntry[]> { // Returns the completed log array
1114const openai = new OpenAI(); // Assumes API key is in environment variables
11151116log.push({ agent: "System", type: "step", message: "Starting analysis workflow." });
1217// --- 2. Content Analysis ---
1218log.push({ agent: "System", type: "step", message: "Starting Content Analysis..." });
1219const analysisResponse = await callOpenAI(openai, contentAnalysisSystemPrompt, truncatedText, "gpt-4o", true); // Use gpt-4o
1220let analysisResult: AnalysisResult | null = null;
1221if (analysisResponse.role === "assistant" && typeof analysisResponse.content === "object") {
1237// --- 3. Citation Extraction ---
1238log.push({ agent: "System", type: "step", message: "Starting Citation Extraction..." });
1239const citationResponse = await callOpenAI(openai, citationExtractionSystemPrompt, truncatedText, "gpt-4o", true); // Use gpt-4o
1240let extractedCitations: Citation[] = [];
1241if (
1267message: \`AI response was not the expected JSON format. Received: \${JSON.stringify(citationResponse.content).substring(0, 200)}...\`,
1268});
1269} else { // System error from callOpenAI
1270log.push({ agent: "Citation Extraction Agent", type: "error", message: citationResponse.content });
1271}
myanythingmain.tsx3 matches
125if (request.method === 'POST') {
126try {
127const { OpenAI } = await import("https://esm.town/v/std/openai");
128const openai = new OpenAI();
129130const formData = await request.formData();
138const cvText = new TextDecoder().decode(cvBuffer);
139140const completion = await openai.chat.completions.create({
141messages: [
142{
myeverythingmain.tsx3 matches
125if (request.method === "POST") {
126try {
127const { OpenAI } = await import("https://esm.town/v/std/openai");
128const openai = new OpenAI();
129130const formData = await request.formData();
138const cvText = new TextDecoder().decode(cvBuffer);
139140const completion = await openai.chat.completions.create({
141messages: [
142{
125if (request.method === "POST") {
126try {
127const { OpenAI } = await import("https://esm.town/v/std/openai");
128const openai = new OpenAI();
129130const formData = await request.formData();
138const cvText = new TextDecoder().decode(cvBuffer);
139140const completion = await openai.chat.completions.create({
141messages: [
142{
197const [isInitialized, setIsInitialized] = useState(false);
198199// --- OpenAI Interaction (Unchanged) ---
200// !!! IMPORTANT SECURITY WARNING & Val Town Note !!!
201// ... (same as before)
205if (!text) return;
206setStatus("Sending to AI...");
207console.log("Sending to OpenAI:", text);
208setAiResponse(""); // Clear previous response
209setError(null);
213try {
214// ---- START: Replace this block in Val Town ----
215const response = await fetch("https://api.openai.com/v1/chat/completions", {
216method: "POST",
217headers: {
226const errorData = await response.json().catch(() => ({})); // Try to get JSON error details
227throw new Error(
228`OpenAI API Error: ${response.status} ${response.statusText} - ${
229errorData?.error?.message ?? "Check API key or usage limits."
230}`,
240speakText(reply);
241} catch (err: any) {
242console.error("OpenAI call failed:", err);
243const errMsg = `AI Error: ${err.message}`;
244setError(errMsg);
FixItWandgenerate.ts6 matches
1import OpenAI from "https://esm.sh/openai@4.96.0";
2import { search } from "./locations/mod.ts";
34const openai = new OpenAI();
56/**
39const audioFile = new File([audioBlob], "a.mp3", { type: "audio/mp3" });
4041transcription = await openai.audio.transcriptions.create({
42file: audioFile,
43model: "whisper-1",
50if (transcription) {
51// Detect possible location references in the transcription
52const locationDetectionResponse = await openai.chat.completions.create({
53model: "gpt-4o-mini",
54messages: [
149});
150151const chatResponse = await openai.chat.completions.create({
152model: "gpt-4o",
153messages: messages as any, // Type assertion to fix any TypeScript issues
166`;
167168const subjectResponse = await openai.chat.completions.create({
169model: "gpt-4o-mini",
170messages: [
OpenTownie_jacksonsystem_prompt.txt4 matches
88Note: When changing a SQLite table's schema, change the table's name (e.g., add _2 or _3) to create a fresh table.
8990### OpenAI
9192```ts
93import { OpenAI } from "https://esm.town/v/std/openai";
94const openai = new OpenAI();
95const completion = await openai.chat.completions.create({
96messages: [
97{ role: "user", content: "Say hello in a creative way" },