diff --git a/gpt/index.html b/gpt/index.html
index 897435e..b9ce2c0 100644
--- a/gpt/index.html
+++ b/gpt/index.html
@@ -336,7 +336,7 @@
@@ -353,6 +353,7 @@
+
@@ -368,7 +369,7 @@
-
+
@@ -501,7 +502,8 @@
ollama: { endpoint: 'http://localhost:11434/api/chat', model: 'llama2', type: 'ollama' },
lmstudio: { endpoint: 'http://localhost:1234/v1/chat/completions', model: 'local-model', type: 'openai' },
gpt4all: { endpoint: 'http://localhost:4891/v1/chat/completions', model: 'gpt4all-model', type: 'openai' },
- openai: { endpoint: 'https://api.openai.com/v1/chat/completions', model: 'gpt-3.5-turbo', type: 'openai' }
+ openai: { endpoint: 'https://api.openai.com/v1/chat/completions', model: 'gpt-4o-mini', type: 'openai' },
+ claude: { endpoint: 'https://api.anthropic.com/v1/messages', model: 'claude-sonnet-4-20250514', type: 'claude' }
};
const preset = presets[this.value];
@@ -512,6 +514,32 @@
}
});
+ /* ============================================
+ HELPER FUNCTIONS
+ ============================================ */
+ function getFormattedDate() {
+ const now = new Date();
+ const dd = String(now.getDate()).padStart(2, '0');
+ const mm = String(now.getMonth() + 1).padStart(2, '0');
+ const yyyy = now.getFullYear();
+ const HH = String(now.getHours()).padStart(2, '0');
+ const MM = String(now.getMinutes()).padStart(2, '0');
+ const SS = String(now.getSeconds()).padStart(2, '0');
+ return `${dd}/${mm}/${yyyy}:${HH}/${MM}/${SS}`;
+ }
+
+ function getStatusInfo() {
+ return `[Connection: ${aiConfig.enabled ? 'ONLINE' : 'OFFLINE'}, Endpoint: ${aiConfig.endpoint || 'none'}, Model: ${aiConfig.model || 'none'}]`;
+ }
+
+ function preprocessMessage(message) {
+ // Replace "date" keyword with actual date (case insensitive, whole word)
+ let processed = message.replace(/\bdate\b/gi, `date (${getFormattedDate()})`);
+ // Replace "status" keyword with actual status info (case insensitive, whole word)
+ processed = processed.replace(/\bstatus\b/gi, `status ${getStatusInfo()}`);
+ return processed;
+ }
+
/* ============================================
AI COMMUNICATION
============================================ */
@@ -523,11 +551,14 @@
addLine('To connect an AI backend:', 'system');
addLine(' 1. Type "config" to open settings', 'system');
addLine(' 2. Choose a preset or enter custom endpoint', 'system');
- addLine(' 3. Supported: Ollama, LM Studio, GPT4All, OpenAI', 'system');
+ addLine(' 3. Supported: Ollama, LM Studio, GPT4All, OpenAI, Claude', 'system');
return;
}
isProcessing = true;
+
+ // Preprocess message to replace date/status keywords
+ const processedMessage = preprocessMessage(message);
try {
let response;
@@ -538,7 +569,7 @@
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
model: aiConfig.model,
- messages: [{ role: 'user', content: message }],
+ messages: [{ role: 'user', content: processedMessage }],
stream: false
})
});
@@ -550,6 +581,30 @@
addLine('Error: ' + data.error, 'error');
}
+ } else if (aiConfig.type === 'claude') {
+ // Claude/Anthropic API
+ response = await fetch(aiConfig.endpoint, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'x-api-key': aiConfig.apiKey,
+ 'anthropic-version': '2023-06-01',
+ 'anthropic-dangerous-direct-browser-access': 'true'
+ },
+ body: JSON.stringify({
+ model: aiConfig.model,
+ max_tokens: 1024,
+ messages: [{ role: 'user', content: processedMessage }]
+ })
+ });
+
+ const data = await response.json();
+ if (data.content && data.content[0]) {
+ addLine(data.content[0].text, 'ai');
+ } else if (data.error) {
+ addLine('Error: ' + (data.error.message || data.error), 'error');
+ }
+
} else {
// OpenAI-compatible API (LM Studio, GPT4All, OpenAI, etc.)
const headers = { 'Content-Type': 'application/json' };
@@ -562,7 +617,7 @@
headers: headers,
body: JSON.stringify({
model: aiConfig.model,
- messages: [{ role: 'user', content: message }],
+ messages: [{ role: 'user', content: processedMessage }],
stream: false
})
});
@@ -602,9 +657,11 @@
addLine('Available commands:', 'system');
addLine(' help - Show this help', 'system');
addLine(' config - Configure AI backend', 'system');
- addLine(' status - Show connection status', 'system');
addLine(' clear - Clear screen', 'system');
- addLine(' date - Show current date/time', 'system');
+ addLine('', '');
+ addLine('Keywords (replaced in messages to AI):', 'system');
+ addLine(' date - Replaced with current date/time', 'system');
+ addLine(' status - Replaced with connection info', 'system');
addLine('', '');
addLine('Any other input is sent to the AI', 'system');
break;
@@ -613,23 +670,10 @@
openConfig();
break;
- case 'status':
- addLine('', '');
- addLine('CONNECTION STATUS:', 'system');
- addLine(' Enabled: ' + (aiConfig.enabled ? 'YES' : 'NO'), 'system');
- addLine(' Endpoint: ' + (aiConfig.endpoint || 'Not configured'), 'system');
- addLine(' Model: ' + (aiConfig.model || 'Not configured'), 'system');
- addLine(' Type: ' + (aiConfig.type || 'unknown'), 'system');
- break;
-
case 'clear':
clearOutput();
break;
- case 'date':
- addLine(new Date().toString(), 'system');
- break;
-
default:
queryAI(trimmed);
}