Elysia-Suite's picture
Upload 25 files
0b194e5 verified
/*
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;