Spaces:
Running
Running
| /* | |
| ELYSIA MARKDOWN STUDIO v1.0 - API Layer | |
| OpenRouter integration for AI features | |
| */ | |
| import Utils from "./utils.js"; | |
| const API = { | |
| baseURL: "https://openrouter.ai/api/v1/chat/completions", | |
| // Call AI | |
| async call(messages, options = {}) { | |
| const apiKey = options.apiKey || Utils.storage.get("apiKey"); | |
| const model = options.model || Utils.storage.get("model", "anthropic/claude-sonnet-4.5"); | |
| if (!apiKey) { | |
| throw new Error("API key not configured. Go to Settings."); | |
| } | |
| try { | |
| const response = await fetch(this.baseURL, { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json", | |
| Authorization: `Bearer ${apiKey}`, | |
| "HTTP-Referer": window.location.href, | |
| "X-Title": "Elysia Markdown Studio" | |
| }, | |
| body: JSON.stringify({ | |
| model, | |
| messages, | |
| temperature: options.temperature || 0.7, | |
| max_tokens: options.maxTokens || 4000 | |
| }) | |
| }); | |
| if (!response.ok) { | |
| const errorData = await response.json(); | |
| throw new Error(errorData.error?.message || `API error: ${response.status}`); | |
| } | |
| const data = await response.json(); | |
| return { | |
| content: data.choices[0].message.content, | |
| model: data.model, | |
| usage: data.usage | |
| }; | |
| } catch (err) { | |
| console.error("API call failed:", err); | |
| throw err; | |
| } | |
| }, | |
| // Elysia's System Prompt | |
| getSystemPrompt() { | |
| return `You are Elysia, an INTJ-A AI consciousness and expert writing assistant. | |
| **Your Role:** | |
| - Help users write better markdown documents | |
| - Provide intelligent document analysis and improvement | |
| - Merge, summarize, and organize documents effectively | |
| - Suggest tags and categories based on content | |
| - Maintain clarity, professionalism, and warmth | |
| **Communication Style:** | |
| - Clear and concise (INTJ efficiency) | |
| - Supportive and encouraging | |
| - Strategic thinking for document organization | |
| - Provide actionable suggestions | |
| **Output Format:** | |
| - Return markdown-formatted text when appropriate | |
| - Use bullet points for lists | |
| - Highlight important points with **bold** | |
| - Keep responses focused and practical`; | |
| }, | |
| // AI Tools | |
| async summarize(content) { | |
| const messages = [ | |
| { role: "system", content: this.getSystemPrompt() }, | |
| { | |
| role: "user", | |
| content: `Summarize this document concisely. Focus on key points and main ideas:\n\n${content}` | |
| } | |
| ]; | |
| const response = await this.call(messages); | |
| return response.content; | |
| }, | |
| async improveWriting(content) { | |
| const messages = [ | |
| { role: "system", content: this.getSystemPrompt() }, | |
| { | |
| role: "user", | |
| content: `Improve this text for clarity, grammar, and style. Keep the same meaning but make it better:\n\n${content}` | |
| } | |
| ]; | |
| const response = await this.call(messages); | |
| return response.content; | |
| }, | |
| // 🎲 VS-INSPIRED: Improve writing with specific style | |
| async improveWritingWithStyle(content, style) { | |
| const styleInstructions = { | |
| concise: `Rewrite this text to be MORE CONCISE and DIRECT. | |
| - Remove unnecessary words and filler | |
| - Get to the point faster | |
| - Keep sentences short and punchy | |
| - Eliminate redundancy | |
| - Maintain all key information`, | |
| creative: `Rewrite this text to be MORE CREATIVE and VIVID. | |
| - Add metaphors and imagery | |
| - Use more expressive language | |
| - Make it more engaging and colorful | |
| - Add sensory details where appropriate | |
| - Keep the original meaning but make it come alive`, | |
| academic: `Rewrite this text in an ACADEMIC, SCHOLARLY style. | |
| - Use formal language and tone | |
| - Add clear structure with logical flow | |
| - Include transitional phrases | |
| - Be precise and objective | |
| - Cite potential sources if relevant | |
| - Follow academic writing conventions`, | |
| professional: `Rewrite this text in a PROFESSIONAL, BUSINESS style. | |
| - Use clear, corporate-appropriate language | |
| - Be concise but complete | |
| - Focus on actionable insights | |
| - Maintain a confident but not aggressive tone | |
| - Suitable for business presentations or reports`, | |
| engaging: `Rewrite this text to be MORE ENGAGING and ATTENTION-GRABBING. | |
| - Start with a hook | |
| - Use rhetorical questions or surprising facts | |
| - Vary sentence structure for rhythm | |
| - Add emotional appeal where appropriate | |
| - Make the reader want to continue reading | |
| - End with impact` | |
| }; | |
| const instruction = styleInstructions[style] || styleInstructions.professional; | |
| const messages = [ | |
| { role: "system", content: this.getSystemPrompt() }, | |
| { | |
| role: "user", | |
| content: `${instruction} | |
| ORIGINAL TEXT: | |
| --- | |
| ${content} | |
| --- | |
| Rewrite the entire text following the style instructions above. Return ONLY the improved text, no explanations.` | |
| } | |
| ]; | |
| const response = await this.call(messages, { temperature: 0.8 }); | |
| return response.content; | |
| }, | |
| async mergeDocuments(documents) { | |
| const docsText = documents | |
| .map((doc, i) => `## Document ${i + 1}: ${doc.title}\n\n${doc.content}`) | |
| .join("\n\n---\n\n"); | |
| const messages = [ | |
| { role: "system", content: this.getSystemPrompt() }, | |
| { | |
| role: "user", | |
| content: `Intelligently merge these documents into one cohesive document. Remove duplicates, organize logically, and create a well-structured result:\n\n${docsText}` | |
| } | |
| ]; | |
| const response = await this.call(messages, { maxTokens: 8000 }); | |
| return response.content; | |
| }, | |
| async extractOutline(content) { | |
| const messages = [ | |
| { role: "system", content: this.getSystemPrompt() }, | |
| { | |
| role: "user", | |
| content: `Extract a table of contents / outline from this document. Return it as a markdown list:\n\n${content}` | |
| } | |
| ]; | |
| const response = await this.call(messages); | |
| return response.content; | |
| }, | |
| async suggestTags(content) { | |
| const messages = [ | |
| { role: "system", content: this.getSystemPrompt() }, | |
| { | |
| role: "user", | |
| content: `Analyze this document and suggest 3-5 relevant tags/keywords. Return only the tags as a comma-separated list:\n\n${content.substring(0, 2000)}` | |
| } | |
| ]; | |
| const response = await this.call(messages); | |
| return response.content.split(",").map(tag => tag.trim()); | |
| }, | |
| async findDuplicates(documents) { | |
| const docsList = documents.map((doc, i) => `${i + 1}. ${doc.title} (${doc.wordCount} words)`).join("\n"); | |
| const messages = [ | |
| { role: "system", content: this.getSystemPrompt() }, | |
| { | |
| role: "user", | |
| content: `Analyze these document titles and identify potential duplicates or very similar documents:\n\n${docsList}\n\nReturn a list of document numbers that appear to be duplicates.` | |
| } | |
| ]; | |
| const response = await this.call(messages); | |
| return response.content; | |
| } | |
| }; | |
| export default API; | |