PRChecker2index.tsx1 match
16// Call AI service with your private API key
17// Replace with your actual AI service URL
18const aiResponse = await fetch("https://api.openai.com/v1/chat/completions", {
19method: "POST",
20headers: {
untitled-2444README.md10 matches
1# Script Improver Pro
23A Val Town application that processes large scripts through OpenAI's GPT-4 model to make them clearer, more concise, and better written.
45## Features
10- Combines processed outputs seamlessly
11- Simple, responsive UI with token counting and progress tracking
12- **Direct OpenAI API Connection** - Use your own API key for direct processing
13- **Debug Console** - View API requests, responses, and token usage
14- **Script Type Detection** - Automatically identifies screenplay, technical, marketing, academic, or creative content
211. The user pastes their script into the text area and provides optional instructions
222. The application splits the text into chunks of approximately 3330 tokens each
233. Each chunk is processed sequentially through OpenAI's GPT-4 model
244. The processed chunks are combined, handling overlaps to avoid duplication
255. The improved script is displayed to the user
2829- `/index.ts` - Main HTTP endpoint and route handler
30- `/backend/processor.ts` - Text processing logic and OpenAI integration
31- `/backend/openaiProxy.ts` - Server-side proxy for OpenAI API calls
32- `/backend/scriptTypeDetector.ts` - Automatic script type detection
33- `/shared/tokenizer.ts` - Advanced token counting and text chunking
34- `/shared/OpenAIConnector.ts` - Direct OpenAI API connection handling
35- `/frontend/index.html` - Main HTML template
36- `/frontend/index.ts` - Frontend JavaScript logic
42- **Backend**: Hono.js for HTTP routing
43- **Frontend**: Vanilla TypeScript with Tailwind CSS
44- **AI**: OpenAI GPT-4 for text processing
45- **Styling**: Tailwind CSS for responsive design
46- **Syntax Highlighting**: highlight.js for code highlighting
512. Select script type or use auto-detection
523. Choose an instruction template or write custom instructions
534. (Optional) Set your OpenAI API key for direct processing
545. Click "Improve Script" to process
556. View, compare, and download the improved script
5859### Direct API Connection
60You can use your own OpenAI API key for direct processing, bypassing the server proxy. This can be useful for:
61- Processing very large scripts
62- Using custom model parameters
80## Limitations
8182- Token counting is approximate and may not exactly match OpenAI's tokenizer
83- Very large scripts may take longer to process
84- The quality of improvements depends on the clarity of instructions and the quality of the input script
untitled-2444processor.ts10 matches
1import { OpenAI } from "https://esm.town/v/std/openai";
2import { Tokenizer } from "../shared/tokenizer.ts";
3import { blob } from "https://esm.town/v/std/blob";
45// Use the standard OpenAI library for server-side processing
6const openai = new OpenAI();
7const tokenizer = new Tokenizer();
812const OVERLAP_TOKENS = 250;
1314// OpenAI model configuration
15const DEFAULT_MODEL = "gpt-4o";
16const DEFAULT_TEMPERATURE = 0.7;
1718/**
19* Process large text by splitting into chunks and sending to OpenAI
20*/
21export async function processLargeText(
71}
72
73// Process with OpenAI
74const processedChunk = await processChunkWithOpenAI(
75chunk,
76contextualInstructions,
287288/**
289* Process a single chunk with OpenAI
290*/
291async function processChunkWithOpenAI(
292chunk: string,
293instructions: string,
307for (let attempt = 0; attempt < 3; attempt++) {
308try {
309const completion = await openai.chat.completions.create({
310model: config.model,
311messages: [{ role: "user", content: prompt }],
untitled-2444index.ts4 matches
138});
139140// API endpoint for OpenAI proxy
141app.post("/api/openai/chat", async c => {
142try {
143const body = await c.req.json();
144
145const { proxyChatCompletion, logApiUsage } = await import("./backend/openaiProxy.ts");
146const result = await proxyChatCompletion(body);
147
157return c.json(result);
158} catch (error) {
159console.error("OpenAI proxy error:", error);
160return c.json({
161error: error instanceof Error ? error.message : "Unknown error occurred"
untitled-2444openaiProxy.ts7 matches
1/**
2* OpenAI API Proxy
3*
4* Proxies requests to OpenAI API to avoid exposing API keys to the client
5*/
6import { OpenAI } from "https://esm.town/v/std/openai";
78const openai = new OpenAI();
910/**
11* Proxy a chat completion request to OpenAI
12*/
13export async function proxyChatCompletion(params: any): Promise<any> {
22
23// Create completion
24const completion = await openai.chat.completions.create({
25model,
26messages: params.messages,
34return completion;
35} catch (error) {
36console.error("OpenAI API error:", error);
37throw error;
38}
untitled-2444DebugConsole.ts6 matches
4* A collapsible terminal-like console for debugging
5*/
6import { ApiEvents } from "../../shared/OpenAIConnector.ts";
78export class DebugConsole {
77*/
78private setupEventListeners(): void {
79window.addEventListener(`openai:${ApiEvents.REQUEST_STARTED}`, (e: any) => {
80const detail = e.detail;
81this.log('request', `Request started: ${detail.model}`, {
85});
86
87window.addEventListener(`openai:${ApiEvents.REQUEST_COMPLETED}`, (e: any) => {
88const detail = e.detail;
89this.log('success', `Request completed: ${detail.requestId}`, {
92});
93
94window.addEventListener(`openai:${ApiEvents.REQUEST_ERROR}`, (e: any) => {
95const detail = e.detail;
96this.log('error', `Error: ${detail.error}`, {
99});
100
101window.addEventListener(`openai:${ApiEvents.TOKEN_USAGE}`, (e: any) => {
102const detail = e.detail;
103this.log('info', `Token usage: ${detail.totalTokens} total (${detail.promptTokens} prompt, ${detail.completionTokens} completion)`, {
106});
107
108window.addEventListener(`openai:${ApiEvents.LOG}`, (e: any) => {
109const detail = e.detail;
110this.log('log', detail.message);
untitled-2444OpenAIConnector.ts8 matches
1/**
2* OpenAI API Connector
3*
4* Handles direct connections to the OpenAI API
5*/
614};
1516export class OpenAIConnector {
17private apiKey: string | null = null;
18private baseUrl = 'https://api.openai.com/v1';
19private useServerProxy: boolean = true;
20
104*/
105private async createCompletionViaProxy(params: any): Promise<any> {
106const response = await fetch('/api/openai/chat', {
107method: 'POST',
108headers: {
135if (!response.ok) {
136const errorData = await response.json().catch(() => null);
137throw new Error(errorData?.error?.message || `OpenAI API error: ${response.status}`);
138}
139
174if (typeof window !== 'undefined') {
175this.dispatchEvent = (eventName, data) => {
176const event = new CustomEvent(`openai:${eventName}`, { detail: data });
177window.dispatchEvent(event);
178};
180// Fallback for non-browser environments
181this.dispatchEvent = (eventName, data) => {
182console.log(`[OpenAI Event] ${eventName}:`, data);
183};
184}
3import { cors } from "https://esm.sh/hono@3.11.12/middleware";
4import { readFile, serveFile } from "https://esm.town/v/std/utils@85-main/index.ts";
5import { OpenAI } from "https://esm.town/v/std/openai";
6import {
7getAuthUrl,
39app.get("/shared/*", c => serveFile(c.req.path, import.meta.url));
4041// Initialize OpenAI client
42const openai = new OpenAI();
4344// Helper function to get session from cookies
288
289try {
290// Use OpenAI to parse the natural language command
291const completion = await openai.chat.completions.create({
292model: "gpt-4o-mini",
293messages: [
untitled-6906Main.tsx7 matches
1import { OpenAI } from "https://esm.town/v/std/openai";
23// Initialize OpenAI client (moved to server scope)
4const openai = new OpenAI();
56// This function will be the main entry point for the Val
12if (typeof userCommand === "string") {
13try {
14const aiResponse = await getOpenAIResponse(userCommand);
15return new Response(generateHtml(aiResponse), { headers: { "Content-Type": "text/html" } });
16} catch (error) {
205}
206207async function getOpenAIResponse(command: string): Promise<string> {
208try {
209const completion = await openai.chat.completions.create({
210messages: [
211{ role: "user", content: command },
217return completion.choices[0].message.content || "The air shifts, but nothing changes.";
218} catch (error) {
219console.error("Error calling OpenAI:", error);
220return "The mists swirl strangely. (AI connection error.)";
221}
stevensDemo.cursorrules4 matches
100Note: When changing a SQLite table's schema, change the table's name (e.g., add _2 or _3) to create a fresh table.
101102### OpenAI
103```ts
104import { OpenAI } from "https://esm.town/v/std/openai";
105const openai = new OpenAI();
106const completion = await openai.chat.completions.create({
107messages: [
108{ role: "user", content: "Say hello in a creative way" },