Spaces:
Sleeping
Sleeping
| // Example: Using conversation history from a JavaScript frontend | |
| class ChatClient { | |
| constructor(baseUrl = 'http://127.0.0.1:7860') { | |
| this.baseUrl = baseUrl; | |
| this.sessionId = null; | |
| } | |
| // Send a message and maintain conversation history | |
| async ask(query, metadata = {}) { | |
| const payload = { | |
| query: query, | |
| metadata: metadata | |
| }; | |
| // Include session_id if we have one (for conversation continuity) | |
| if (this.sessionId) { | |
| payload.session_id = this.sessionId; | |
| } | |
| const response = await fetch(`${this.baseUrl}/ask`, { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify(payload) | |
| }); | |
| const data = await response.json(); | |
| // Store session_id for future messages | |
| if (data.session_id) { | |
| this.sessionId = data.session_id; | |
| } | |
| return data; | |
| } | |
| // Stream a response with conversation history | |
| async askStream(query, metadata = {}, onChunk, onDone) { | |
| const payload = { | |
| query: query, | |
| metadata: metadata | |
| }; | |
| if (this.sessionId) { | |
| payload.session_id = this.sessionId; | |
| } | |
| const response = await fetch(`${this.baseUrl}/ask_stream`, { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify(payload) | |
| }); | |
| const reader = response.body.getReader(); | |
| const decoder = new TextDecoder(); | |
| while (true) { | |
| const { done, value } = await reader.read(); | |
| if (done) break; | |
| const chunk = decoder.decode(value); | |
| const lines = chunk.split('\n'); | |
| for (const line of lines) { | |
| if (line.startsWith('event: session')) { | |
| const sessionLine = lines[lines.indexOf(line) + 1]; | |
| if (sessionLine && sessionLine.startsWith('data: ')) { | |
| this.sessionId = sessionLine.substring(6).trim(); | |
| } | |
| } else if (line.startsWith('data: ')) { | |
| const data = line.substring(6); | |
| if (data === '[DONE]') { | |
| if (onDone) onDone(); | |
| } else if (onChunk) { | |
| onChunk(data); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| // Code assistance with history | |
| async codeAssist(query, metadata = {}) { | |
| const payload = { | |
| query: query, | |
| metadata: metadata | |
| }; | |
| if (this.sessionId) { | |
| payload.session_id = this.sessionId; | |
| } | |
| const response = await fetch(`${this.baseUrl}/code_assist`, { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify(payload) | |
| }); | |
| const data = await response.json(); | |
| if (data.session_id) { | |
| this.sessionId = data.session_id; | |
| } | |
| return data; | |
| } | |
| // Get conversation history | |
| async getHistory() { | |
| if (!this.sessionId) { | |
| throw new Error('No active session'); | |
| } | |
| const response = await fetch(`${this.baseUrl}/get_history`, { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify({ session_id: this.sessionId }) | |
| }); | |
| return await response.json(); | |
| } | |
| // Clear current conversation | |
| async clearHistory() { | |
| if (!this.sessionId) return; | |
| const response = await fetch(`${this.baseUrl}/clear_history`, { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify({ session_id: this.sessionId }) | |
| }); | |
| this.sessionId = null; | |
| return await response.json(); | |
| } | |
| // Start a new conversation | |
| newConversation() { | |
| this.sessionId = null; | |
| } | |
| } | |
| // Usage example: | |
| async function example() { | |
| const chat = new ChatClient(); | |
| // Turn 1: Start conversation | |
| console.log('User: Write a function to calculate factorial'); | |
| const response1 = await chat.ask('Write a function to calculate factorial'); | |
| console.log('AI:', response1.reply); | |
| console.log('Session ID:', chat.sessionId); | |
| // Turn 2: Follow-up (AI remembers the factorial function) | |
| console.log('\nUser: Can you optimize it using memoization?'); | |
| const response2 = await chat.ask('Can you optimize it using memoization?'); | |
| console.log('AI:', response2.reply); | |
| // Turn 3: Another follow-up | |
| console.log('\nUser: Add error handling for negative numbers'); | |
| const response3 = await chat.ask('Add error handling for negative numbers'); | |
| console.log('AI:', response3.reply); | |
| // View history | |
| const history = await chat.getHistory(); | |
| console.log('\nConversation history:', history.message_count, 'messages'); | |
| // Start new conversation | |
| chat.newConversation(); | |
| console.log('\nStarting new conversation...'); | |
| const response4 = await chat.ask('Hello! Can you help me with Python?'); | |
| console.log('AI:', response4.reply); | |
| console.log('New Session ID:', chat.sessionId); | |
| } | |
| // Example with streaming: | |
| async function streamExample() { | |
| const chat = new ChatClient(); | |
| console.log('User: Explain async/await in JavaScript'); | |
| let fullResponse = ''; | |
| await chat.askStream( | |
| 'Explain async/await in JavaScript', | |
| {}, | |
| (chunk) => { | |
| // Parse chunk if it's JSON | |
| try { | |
| const parsed = JSON.parse(chunk); | |
| if (parsed.choices && parsed.choices[0].delta.content) { | |
| process.stdout.write(parsed.choices[0].delta.content); | |
| fullResponse += parsed.choices[0].delta.content; | |
| } | |
| } catch { | |
| // Raw text chunk | |
| process.stdout.write(chunk); | |
| fullResponse += chunk; | |
| } | |
| }, | |
| () => { | |
| console.log('\n\nStreaming complete!'); | |
| console.log('Session ID:', chat.sessionId); | |
| } | |
| ); | |
| // Continue the conversation | |
| console.log('\nUser: Can you show me an example?'); | |
| const response = await chat.ask('Can you show me an example?'); | |
| console.log('AI:', response.reply); | |
| } | |
| // Export for use in other modules | |
| if (typeof module !== 'undefined' && module.exports) { | |
| module.exports = ChatClient; | |
| } | |