untitled-2444index.ts10 matches
6import { SyntaxHighlighter } from "./components/SyntaxHighlighter.ts";
7import { DebugConsole } from "./components/DebugConsole.ts";
8import { OpenAIConnector } from "../shared/OpenAIConnector.ts";
9import { ThemeManager } from "./components/ThemeManager.ts";
10import { ConfettiManager } from "./components/ConfettiManager.ts";
18const syntaxHighlighter = new SyntaxHighlighter();
19const debugConsole = new DebugConsole();
20const openAIConnector = new OpenAIConnector();
21const themeManager = new ThemeManager();
22const confettiManager = new ConfettiManager();
27
28// Set up all event handlers
29setupFormHandling(tokenizer, scriptEditor, syntaxHighlighter, openAIConnector, confettiManager, textFormatter);
30setupTokenCounter(tokenizer);
31setupTemplateSelector(templateManager);
32setupAdvancedOptions(openAIConnector, debugConsole);
33setupResultActions(scriptEditor, textFormatter);
34setupHistoryModal(historyManager, scriptEditor);
51scriptEditor: ScriptEditor,
52syntaxHighlighter: SyntaxHighlighter,
53openAIConnector: OpenAIConnector,
54confettiManager: ConfettiManager,
55textFormatter: TextFormatter
144const apiKeyInput = document.getElementById("apiKey") as HTMLInputElement;
145if (apiKeyInput && apiKeyInput.value && localStorage.getItem("useDirectApi") === "true") {
146// Process directly with OpenAI API
147const prompt = createPromptForScriptType(
148text,
153);
154
155const response = await openAIConnector.createChatCompletion({
156model,
157messages: [{ role: "user", content: prompt }],
314315// Set up advanced options
316function setupAdvancedOptions(openAIConnector: OpenAIConnector, debugConsole: DebugConsole) {
317const advancedOptionsBtn = document.getElementById("advancedOptionsBtn") as HTMLButtonElement;
318const advancedOptions = document.getElementById("advancedOptions") as HTMLDivElement;
350
351if (!apiKey.startsWith("sk-")) {
352alert("Invalid API key format. OpenAI API keys start with 'sk-'");
353return;
354}
356try {
357// Set the API key in the connector
358openAIConnector.setApiKey(apiKey);
359
360// Store the preference (but not the key itself)
untitled-2444index.html2 matches
318<div class="md:col-span-3">
319<div class="flex items-center justify-between">
320<label for="apiKey" class="block text-sm font-medium text-gray-700 dark:text-gray-300">OpenAI API Key (Optional)</label>
321<span class="text-xs text-gray-500 dark:text-gray-400">Direct API connection</span>
322</div>
649
650<footer class="mt-8 text-center text-sm text-gray-500 dark:text-gray-400">
651<p>Powered by OpenAI GPT-4 • <a href="#" id="viewSourceLink" target="_top" class="text-indigo-600 dark:text-indigo-400 hover:underline">View Source</a></p>
652</footer>
653</div>
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: [