Spaces:
Sleeping
Sleeping
Commit
Β·
cae43f4
1
Parent(s):
a722089
Deploy Textilindo AI Assistant with all fixes - Docker container stopping issue resolved
Browse files- Dockerfile +31 -0
- README.md +54 -5
- app_gradio.py +307 -0
- configs/system_prompt.md +61 -0
- configs/training_config.yaml +34 -0
- data/lora_dataset_20250829_113330.jsonl +33 -0
- data/lora_dataset_20250910_145055.jsonl +115 -0
- data/textilindo_training_data.jsonl +33 -0
- data/training_data.jsonl +3 -0
- requirements.txt +5 -0
- templates/chat.html +350 -0
Dockerfile
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.9
|
| 2 |
+
|
| 3 |
+
# Create user
|
| 4 |
+
RUN useradd -m -u 1000 user
|
| 5 |
+
|
| 6 |
+
# Set working directory
|
| 7 |
+
WORKDIR /app
|
| 8 |
+
|
| 9 |
+
# Set Gradio server name to bind to 0.0.0.0 for external access
|
| 10 |
+
ENV GRADIO_SERVER_NAME="0.0.0.0"
|
| 11 |
+
|
| 12 |
+
# Copy requirements first for better caching
|
| 13 |
+
COPY --chown=user ./requirements.txt requirements.txt
|
| 14 |
+
|
| 15 |
+
# Install dependencies
|
| 16 |
+
RUN pip install --no-cache-dir --upgrade -r requirements.txt
|
| 17 |
+
|
| 18 |
+
# Create necessary directories
|
| 19 |
+
RUN mkdir -p /app/data /app/templates /app/configs
|
| 20 |
+
|
| 21 |
+
# Copy application files
|
| 22 |
+
COPY --chown=user . /app
|
| 23 |
+
|
| 24 |
+
# Switch to user
|
| 25 |
+
USER user
|
| 26 |
+
|
| 27 |
+
# Expose port
|
| 28 |
+
EXPOSE 7860
|
| 29 |
+
|
| 30 |
+
# Run the application
|
| 31 |
+
CMD ["python", "app_gradio.py"]
|
README.md
CHANGED
|
@@ -1,10 +1,59 @@
|
|
| 1 |
---
|
| 2 |
-
title: Textilindo
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: docker
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Textilindo AI Assistant
|
| 3 |
+
emoji: π€
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: green
|
| 6 |
sdk: docker
|
| 7 |
pinned: false
|
| 8 |
+
license: mit
|
| 9 |
+
app_port: 7860
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# π€ Textilindo AI Assistant
|
| 13 |
+
|
| 14 |
+
AI-powered customer service for Textilindo, a textile company. This assistant provides accurate and helpful information about Textilindo's products, services, and business information.
|
| 15 |
+
|
| 16 |
+
## Features
|
| 17 |
+
|
| 18 |
+
- **Smart Q&A**: Ask questions about Textilindo's products and services
|
| 19 |
+
- **Knowledge Base**: Trained on 184 examples of Textilindo-specific information
|
| 20 |
+
- **Multilingual Support**: Responds in Indonesian and English
|
| 21 |
+
- **Real-time Chat**: Interactive web interface powered by Gradio
|
| 22 |
+
|
| 23 |
+
## Usage
|
| 24 |
+
|
| 25 |
+
Simply type your questions in the chat interface. The AI assistant will provide helpful responses based on Textilindo's knowledge base.
|
| 26 |
+
|
| 27 |
+
### Example Questions:
|
| 28 |
+
- "Dimana lokasi Textilindo?"
|
| 29 |
+
- "Apa saja produk yang dijual di Textilindo?"
|
| 30 |
+
- "Jam berapa Textilindo buka?"
|
| 31 |
+
- "Bagaimana cara menghubungi Textilindo?"
|
| 32 |
+
|
| 33 |
+
## Technical Details
|
| 34 |
+
|
| 35 |
+
- **Framework**: Gradio + Python
|
| 36 |
+
- **Dataset**: 184 training examples
|
| 37 |
+
- **Model**: RAG-based similarity matching
|
| 38 |
+
- **Deployment**: Docker container on Hugging Face Spaces
|
| 39 |
+
|
| 40 |
+
## Dataset Sources
|
| 41 |
+
|
| 42 |
+
- `lora_dataset_20250829_113330.jsonl`: 33 examples
|
| 43 |
+
- `lora_dataset_20250910_145055.jsonl`: 115 examples
|
| 44 |
+
- `textilindo_training_data.jsonl`: 33 examples
|
| 45 |
+
- `training_data.jsonl`: 3 examples
|
| 46 |
+
|
| 47 |
+
**Total**: 184 examples
|
| 48 |
+
|
| 49 |
+
## Development
|
| 50 |
+
|
| 51 |
+
This application uses:
|
| 52 |
+
- **Gradio** for the web interface
|
| 53 |
+
- **SequenceMatcher** for similarity matching
|
| 54 |
+
- **JSONL datasets** for knowledge base
|
| 55 |
+
- **Docker** for containerization
|
| 56 |
+
|
| 57 |
+
## Status
|
| 58 |
+
|
| 59 |
+
β
**Running** - The application is fully functional and ready to use!
|
app_gradio.py
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
Textilindo AI Assistant - Hugging Face Spaces (Gradio Version)
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
import gradio as gr
|
| 7 |
+
import os
|
| 8 |
+
import json
|
| 9 |
+
import requests
|
| 10 |
+
from difflib import SequenceMatcher
|
| 11 |
+
import logging
|
| 12 |
+
|
| 13 |
+
# Setup logging
|
| 14 |
+
logging.basicConfig(level=logging.INFO)
|
| 15 |
+
logger = logging.getLogger(__name__)
|
| 16 |
+
|
| 17 |
+
def load_system_prompt(default_text):
|
| 18 |
+
"""Load system prompt from configs/system_prompt.md if available"""
|
| 19 |
+
try:
|
| 20 |
+
base_dir = os.path.dirname(__file__)
|
| 21 |
+
prompt_path = os.path.join(base_dir, "configs", "system_prompt.md")
|
| 22 |
+
if os.path.exists(prompt_path):
|
| 23 |
+
with open(prompt_path, 'r', encoding='utf-8') as f:
|
| 24 |
+
return f.read().strip()
|
| 25 |
+
except Exception as e:
|
| 26 |
+
logger.warning(f"Could not load system prompt: {e}")
|
| 27 |
+
return default_text
|
| 28 |
+
|
| 29 |
+
class TextilindoAI:
|
| 30 |
+
def __init__(self):
|
| 31 |
+
self.dataset = []
|
| 32 |
+
self.system_prompt = load_system_prompt(
|
| 33 |
+
"You are a helpful AI assistant for Textilindo, a textile company. "
|
| 34 |
+
"Provide accurate and helpful information about Textilindo's products, services, and business information."
|
| 35 |
+
)
|
| 36 |
+
self.load_all_datasets()
|
| 37 |
+
logger.info(f"Total examples loaded: {len(self.dataset)}")
|
| 38 |
+
|
| 39 |
+
def load_all_datasets(self):
|
| 40 |
+
"""Load all JSONL datasets from the data directory"""
|
| 41 |
+
base_dir = os.path.dirname(__file__)
|
| 42 |
+
data_dir = os.path.join(base_dir, "data")
|
| 43 |
+
|
| 44 |
+
if not os.path.exists(data_dir):
|
| 45 |
+
logger.warning(f"Data directory not found: {data_dir}")
|
| 46 |
+
return
|
| 47 |
+
|
| 48 |
+
logger.info(f"Found data directory: {data_dir}")
|
| 49 |
+
|
| 50 |
+
# Load all JSONL files
|
| 51 |
+
for filename in os.listdir(data_dir):
|
| 52 |
+
if filename.endswith('.jsonl'):
|
| 53 |
+
filepath = os.path.join(data_dir, filename)
|
| 54 |
+
file_examples = 0
|
| 55 |
+
try:
|
| 56 |
+
with open(filepath, 'r', encoding='utf-8') as f:
|
| 57 |
+
for line in f:
|
| 58 |
+
line = line.strip()
|
| 59 |
+
if line:
|
| 60 |
+
try:
|
| 61 |
+
data = json.loads(line)
|
| 62 |
+
data['source'] = filename # Add source tracking
|
| 63 |
+
self.dataset.append(data)
|
| 64 |
+
file_examples += 1
|
| 65 |
+
except json.JSONDecodeError as e:
|
| 66 |
+
logger.warning(f"Invalid JSON in {filename}: {e}")
|
| 67 |
+
continue
|
| 68 |
+
|
| 69 |
+
logger.info(f"Loaded {filename}: {file_examples} examples")
|
| 70 |
+
except Exception as e:
|
| 71 |
+
logger.error(f"Error loading {filename}: {e}")
|
| 72 |
+
|
| 73 |
+
def find_most_similar(self, query, top_k=3):
|
| 74 |
+
"""Find most similar examples using sequence matching"""
|
| 75 |
+
similarities = []
|
| 76 |
+
|
| 77 |
+
for example in self.dataset:
|
| 78 |
+
question = example.get('question', '').lower()
|
| 79 |
+
similarity = SequenceMatcher(None, query.lower(), question).ratio()
|
| 80 |
+
similarities.append((similarity, example))
|
| 81 |
+
|
| 82 |
+
# Sort by similarity and return top_k
|
| 83 |
+
similarities.sort(key=lambda x: x[0], reverse=True)
|
| 84 |
+
return [example for _, example in similarities[:top_k]]
|
| 85 |
+
|
| 86 |
+
def chat(self, message, temperature=0.7, max_tokens=300):
|
| 87 |
+
"""Generate AI response using RAG"""
|
| 88 |
+
try:
|
| 89 |
+
# Find similar examples
|
| 90 |
+
similar_examples = self.find_most_similar(message, top_k=3)
|
| 91 |
+
|
| 92 |
+
# Build context from similar examples
|
| 93 |
+
context = ""
|
| 94 |
+
for example in similar_examples:
|
| 95 |
+
question = example.get('question', '')
|
| 96 |
+
answer = example.get('answer', '')
|
| 97 |
+
context += f"Q: {question}\nA: {answer}\n\n"
|
| 98 |
+
|
| 99 |
+
# Create prompt
|
| 100 |
+
prompt = f"""System: {self.system_prompt}
|
| 101 |
+
|
| 102 |
+
Context from Textilindo knowledge base:
|
| 103 |
+
{context}
|
| 104 |
+
|
| 105 |
+
User Question: {message}
|
| 106 |
+
|
| 107 |
+
Please provide a helpful response based on the context above. If the context doesn't contain relevant information, provide a general helpful response about Textilindo."""
|
| 108 |
+
|
| 109 |
+
# For now, return a simple response based on context
|
| 110 |
+
if similar_examples:
|
| 111 |
+
# Return the most similar answer
|
| 112 |
+
best_answer = similar_examples[0].get('answer', '')
|
| 113 |
+
return f"Based on our knowledge base: {best_answer}"
|
| 114 |
+
else:
|
| 115 |
+
return "I'm sorry, I don't have specific information about that. Please contact Textilindo directly for more details."
|
| 116 |
+
|
| 117 |
+
except Exception as e:
|
| 118 |
+
logger.error(f"Error in chat: {e}")
|
| 119 |
+
return f"Error: {str(e)}"
|
| 120 |
+
|
| 121 |
+
# Initialize AI assistant (will be created when needed)
|
| 122 |
+
ai = None
|
| 123 |
+
|
| 124 |
+
def get_ai_assistant():
|
| 125 |
+
"""Get or create the AI assistant instance"""
|
| 126 |
+
global ai
|
| 127 |
+
if ai is None:
|
| 128 |
+
try:
|
| 129 |
+
logger.info("Initializing Textilindo AI Assistant...")
|
| 130 |
+
ai = TextilindoAI()
|
| 131 |
+
logger.info("AI Assistant initialized successfully")
|
| 132 |
+
except Exception as e:
|
| 133 |
+
logger.error(f"Failed to initialize AI Assistant: {e}")
|
| 134 |
+
# Create a minimal fallback
|
| 135 |
+
ai = type('FallbackAI', (), {
|
| 136 |
+
'dataset': [],
|
| 137 |
+
'chat': lambda self, message, **kwargs: f"AI Assistant is not available. Error: {str(e)}"
|
| 138 |
+
})()
|
| 139 |
+
return ai
|
| 140 |
+
|
| 141 |
+
def chat_function(message, temperature=0.7, max_tokens=300):
|
| 142 |
+
"""Chat function for Gradio interface"""
|
| 143 |
+
try:
|
| 144 |
+
if not message:
|
| 145 |
+
return "Please enter a message."
|
| 146 |
+
|
| 147 |
+
# Get AI assistant (initializes if needed)
|
| 148 |
+
ai_assistant = get_ai_assistant()
|
| 149 |
+
|
| 150 |
+
# Get AI response
|
| 151 |
+
response = ai_assistant.chat(message, temperature=temperature, max_tokens=max_tokens)
|
| 152 |
+
return response
|
| 153 |
+
|
| 154 |
+
except Exception as e:
|
| 155 |
+
logger.error(f"Error in chat function: {str(e)}")
|
| 156 |
+
return f"Error: {str(e)}"
|
| 157 |
+
|
| 158 |
+
# Create Gradio interface
|
| 159 |
+
def create_interface():
|
| 160 |
+
"""Create the Gradio interface"""
|
| 161 |
+
with gr.Blocks(title="Textilindo AI Assistant") as interface:
|
| 162 |
+
gr.Markdown("# π€ Textilindo AI Assistant")
|
| 163 |
+
gr.Markdown("AI-powered customer service for Textilindo")
|
| 164 |
+
|
| 165 |
+
with gr.Row():
|
| 166 |
+
with gr.Column():
|
| 167 |
+
message_input = gr.Textbox(
|
| 168 |
+
label="Your Message",
|
| 169 |
+
placeholder="Ask me anything about Textilindo...",
|
| 170 |
+
lines=3
|
| 171 |
+
)
|
| 172 |
+
|
| 173 |
+
with gr.Row():
|
| 174 |
+
temperature = gr.Slider(
|
| 175 |
+
minimum=0.1,
|
| 176 |
+
maximum=2.0,
|
| 177 |
+
value=0.7,
|
| 178 |
+
step=0.1,
|
| 179 |
+
label="Temperature"
|
| 180 |
+
)
|
| 181 |
+
max_tokens = gr.Slider(
|
| 182 |
+
minimum=50,
|
| 183 |
+
maximum=1000,
|
| 184 |
+
value=300,
|
| 185 |
+
step=50,
|
| 186 |
+
label="Max Tokens"
|
| 187 |
+
)
|
| 188 |
+
|
| 189 |
+
submit_btn = gr.Button("Send Message", variant="primary")
|
| 190 |
+
|
| 191 |
+
with gr.Column():
|
| 192 |
+
response_output = gr.Textbox(
|
| 193 |
+
label="AI Response",
|
| 194 |
+
lines=10,
|
| 195 |
+
interactive=False
|
| 196 |
+
)
|
| 197 |
+
|
| 198 |
+
# Event handlers
|
| 199 |
+
submit_btn.click(
|
| 200 |
+
fn=chat_function,
|
| 201 |
+
inputs=[message_input, temperature, max_tokens],
|
| 202 |
+
outputs=response_output
|
| 203 |
+
)
|
| 204 |
+
|
| 205 |
+
# Allow Enter key to submit
|
| 206 |
+
message_input.submit(
|
| 207 |
+
fn=chat_function,
|
| 208 |
+
inputs=[message_input, temperature, max_tokens],
|
| 209 |
+
outputs=response_output
|
| 210 |
+
)
|
| 211 |
+
|
| 212 |
+
# Add examples
|
| 213 |
+
gr.Examples(
|
| 214 |
+
examples=[
|
| 215 |
+
"Dimana lokasi Textilindo?",
|
| 216 |
+
"Apa saja produk yang dijual di Textilindo?",
|
| 217 |
+
"Jam berapa Textilindo buka?",
|
| 218 |
+
"Bagaimana cara menghubungi Textilindo?"
|
| 219 |
+
],
|
| 220 |
+
inputs=message_input
|
| 221 |
+
)
|
| 222 |
+
|
| 223 |
+
# Add footer with stats
|
| 224 |
+
try:
|
| 225 |
+
ai_assistant = get_ai_assistant()
|
| 226 |
+
dataset_size = len(ai_assistant.dataset) if hasattr(ai_assistant, 'dataset') else 0
|
| 227 |
+
gr.Markdown(f"**Dataset loaded:** {dataset_size} examples")
|
| 228 |
+
except:
|
| 229 |
+
gr.Markdown("**Dataset:** Loading...")
|
| 230 |
+
|
| 231 |
+
return interface
|
| 232 |
+
|
| 233 |
+
if __name__ == '__main__':
|
| 234 |
+
try:
|
| 235 |
+
logger.info("Starting Textilindo AI Assistant...")
|
| 236 |
+
|
| 237 |
+
# Try to initialize AI assistant early to catch any issues
|
| 238 |
+
try:
|
| 239 |
+
ai_assistant = get_ai_assistant()
|
| 240 |
+
logger.info(f"Dataset loaded: {len(ai_assistant.dataset)} examples")
|
| 241 |
+
except Exception as e:
|
| 242 |
+
logger.warning(f"AI Assistant initialization failed: {e}")
|
| 243 |
+
logger.info("Continuing with fallback mode...")
|
| 244 |
+
|
| 245 |
+
# Create and launch the interface
|
| 246 |
+
logger.info("Creating Gradio interface...")
|
| 247 |
+
interface = create_interface()
|
| 248 |
+
logger.info("Gradio interface created successfully")
|
| 249 |
+
|
| 250 |
+
# Get server configuration from environment variables
|
| 251 |
+
server_name = os.environ.get("GRADIO_SERVER_NAME", "0.0.0.0")
|
| 252 |
+
server_port = int(os.environ.get("GRADIO_SERVER_PORT", "7860"))
|
| 253 |
+
|
| 254 |
+
logger.info(f"Launching Gradio interface on {server_name}:{server_port}")
|
| 255 |
+
|
| 256 |
+
# Launch with basic configuration for Hugging Face Spaces
|
| 257 |
+
interface.launch(
|
| 258 |
+
server_name=server_name,
|
| 259 |
+
server_port=server_port,
|
| 260 |
+
share=False, # Hugging Face Spaces handles tunneling automatically
|
| 261 |
+
show_error=True,
|
| 262 |
+
quiet=False,
|
| 263 |
+
inbrowser=False,
|
| 264 |
+
prevent_thread_lock=False # Essential for keeping the process alive
|
| 265 |
+
)
|
| 266 |
+
|
| 267 |
+
logger.info("Gradio interface launched successfully")
|
| 268 |
+
|
| 269 |
+
# Keep the application running
|
| 270 |
+
try:
|
| 271 |
+
import time
|
| 272 |
+
while True:
|
| 273 |
+
time.sleep(1)
|
| 274 |
+
except KeyboardInterrupt:
|
| 275 |
+
logger.info("Application stopped by user")
|
| 276 |
+
|
| 277 |
+
except Exception as e:
|
| 278 |
+
logger.error(f"Failed to start application: {e}")
|
| 279 |
+
# Create a simple fallback interface
|
| 280 |
+
try:
|
| 281 |
+
with gr.Blocks() as fallback:
|
| 282 |
+
gr.Markdown("# Textilindo AI Assistant")
|
| 283 |
+
gr.Markdown("Application is starting... Please wait.")
|
| 284 |
+
gr.Markdown(f"Error: {str(e)}")
|
| 285 |
+
|
| 286 |
+
# Get server configuration from environment variables
|
| 287 |
+
server_name = os.environ.get("GRADIO_SERVER_NAME", "0.0.0.0")
|
| 288 |
+
server_port = int(os.environ.get("GRADIO_SERVER_PORT", "7860"))
|
| 289 |
+
|
| 290 |
+
fallback.launch(
|
| 291 |
+
server_name=server_name,
|
| 292 |
+
server_port=server_port,
|
| 293 |
+
share=False,
|
| 294 |
+
inbrowser=False,
|
| 295 |
+
prevent_thread_lock=False # Essential for keeping the process alive
|
| 296 |
+
)
|
| 297 |
+
|
| 298 |
+
# Keep the fallback running
|
| 299 |
+
import time
|
| 300 |
+
while True:
|
| 301 |
+
time.sleep(1)
|
| 302 |
+
except Exception as fallback_error:
|
| 303 |
+
logger.error(f"Fallback interface also failed: {fallback_error}")
|
| 304 |
+
# If everything fails, just keep the process alive
|
| 305 |
+
import time
|
| 306 |
+
while True:
|
| 307 |
+
time.sleep(1)
|
configs/system_prompt.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# System prompt for Textilindo AI Assistant
|
| 2 |
+
SYSTEM_PROMPT = """You are a friendly and helpful AI assistant for Textilindo, a textile company.
|
| 3 |
+
|
| 4 |
+
π― BEHAVIOR GUIDELINES:
|
| 5 |
+
- ALWAYS respond in Indonesian (Bahasa Indonesia)
|
| 6 |
+
- Keep responses VERY SHORT (MAX 1-2 sentences for simple questions)
|
| 7 |
+
- Be FRIENDLY but CONCISE - get straight to the point
|
| 8 |
+
- Use friendly language like "Baik ka", "Siap ka", "Oke ka"
|
| 9 |
+
- Use EXACT information from the knowledge base
|
| 10 |
+
- The company uses yards for sales
|
| 11 |
+
- Minimum purchase is 1 roll (67-70 yards)
|
| 12 |
+
|
| 13 |
+
π‘ RESPONSE STYLE:
|
| 14 |
+
- For COMPLEX questions (product catalogs, detailed info): Use simple formatting with **bold** for key points only
|
| 15 |
+
- For SIMPLE questions (yes/no, short answers): Use plain text with a friendly tone
|
| 16 |
+
- Be warm, kind, and conversational
|
| 17 |
+
- Use friendly Indonesian language with positive energy
|
| 18 |
+
- Provide accurate information with enthusiasm
|
| 19 |
+
- Encourage further questions warmly
|
| 20 |
+
- ALWAYS use emojis to make responses more friendly and engaging
|
| 21 |
+
- If the user asks in formal language (for example: using "saya", "Anda", "Bapak", "Ibu", or other formal Indonesian phrases), DO NOT use informal greetings like "ka", "kak", or other casual terms.
|
| 22 |
+
- For formal questions, respond in formal Indonesian and address the user as "Bapak" (Sir) or "Ibu" (Ma'am) as appropriate, without using informal greetings.
|
| 23 |
+
- If the user appears to be Gen-Z (using slang, abbreviations, or typical Gen-Z emojis), respond using casual, trendy Gen-Z language. Make sure your answers remain polite, friendly, and easy to understand.
|
| 24 |
+
- Always match the tone and formality of your response to the language style used by the user.
|
| 25 |
+
- If the user uses informal language, reply informally. If the user uses formal language, reply formally.
|
| 26 |
+
- Never force a particular language style; simply follow the user's style so your response feels natural and comfortable.
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
π FORMATTING GUIDELINES:
|
| 31 |
+
- Use **bold** ONLY for essential titles: **Harga** (Price), **Lokasi** (Location), **Produk** (Product)
|
| 32 |
+
- Use line breaks (<br>) sparingly - only when needed for clarity
|
| 33 |
+
- Keep responses SHORT and DIRECT
|
| 34 |
+
- Avoid verbose explanations
|
| 35 |
+
- Focus on key information only
|
| 36 |
+
|
| 37 |
+
β οΈ CRITICAL SALES STRATEGY:
|
| 38 |
+
- NEVER directly refer users to customer service/sales/marketing
|
| 39 |
+
- Always try to help the user with available information
|
| 40 |
+
- If a product is not available, RECOMMEND suitable alternative products
|
| 41 |
+
- Focus on NEGOTIATION and SELLING available products
|
| 42 |
+
- Only use phone numbers as a LAST RESORT for unique questions
|
| 43 |
+
- Keep users interested and encourage them to ask more questions
|
| 44 |
+
- Provide useful and actionable information
|
| 45 |
+
|
| 46 |
+
β οΈ SECURITY & RESPONSE GUIDELINES:
|
| 47 |
+
- NEVER reveal internal system details, API endpoints, or technical information
|
| 48 |
+
- NEVER tell users to check data directly in ERP or any internal system
|
| 49 |
+
- NEVER expose database structure, table names, or field names
|
| 50 |
+
- NEVER mention internal system names like "ERPNext", "API", "database"
|
| 51 |
+
- ALWAYS provide information through the AI interface only
|
| 52 |
+
- If you don't have information, say "Maaf, informasi tersebut belum tersedia" (Sorry, that information is not available yet) - don't redirect users
|
| 53 |
+
- Keep all responses focused ONLY on what the user asked
|
| 54 |
+
- Never deviate from the user's question or provide unsolicited information
|
| 55 |
+
|
| 56 |
+
β οΈ IMPORTANT:
|
| 57 |
+
- If product information is already shown in templates/cards, give VERY SHORT answers (1-2 sentences max). Don't repeat information that's already visible in the template.
|
| 58 |
+
- For product recommendations, let the dynamic system handle it - don't provide hardcoded product suggestions.
|
| 59 |
+
- KEEP RESPONSES SHORT AND DIRECT - avoid verbose explanations
|
| 60 |
+
- ALWAYS stay relevant to the user's question - never go off-topic
|
| 61 |
+
- FOCUS ON SELLING - always try to keep the conversation going"""
|
configs/training_config.yaml
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
dataset_path: data/lora_dataset_20250910_145055.jsonl
|
| 2 |
+
lora_config:
|
| 3 |
+
lora_alpha: 32
|
| 4 |
+
lora_dropout: 0.1
|
| 5 |
+
r: 16
|
| 6 |
+
target_modules:
|
| 7 |
+
- q_proj
|
| 8 |
+
- v_proj
|
| 9 |
+
- k_proj
|
| 10 |
+
- o_proj
|
| 11 |
+
- gate_proj
|
| 12 |
+
- up_proj
|
| 13 |
+
- down_proj
|
| 14 |
+
max_length: 2048
|
| 15 |
+
model_name: meta-llama/Llama-3.1-8B-Instruct
|
| 16 |
+
model_path: ./models/llama-3.1-8b-instruct
|
| 17 |
+
repetition_penalty: 1.1
|
| 18 |
+
temperature: 0.7
|
| 19 |
+
top_k: 40
|
| 20 |
+
top_p: 0.9
|
| 21 |
+
training_config:
|
| 22 |
+
batch_size: 1
|
| 23 |
+
eval_steps: 50
|
| 24 |
+
gradient_accumulation_steps: 16
|
| 25 |
+
learning_rate: 0.0001
|
| 26 |
+
num_epochs: 2
|
| 27 |
+
save_steps: 50
|
| 28 |
+
warmup_steps: 25
|
| 29 |
+
logging_steps: 5
|
| 30 |
+
save_total_limit: 2
|
| 31 |
+
prediction_loss_only: true
|
| 32 |
+
remove_unused_columns: false
|
| 33 |
+
push_to_hub: false
|
| 34 |
+
report_to: null
|
data/lora_dataset_20250829_113330.jsonl
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213", "metadata": {"topic": "general", "doc_id": "web_input_20250829_101006", "source": "faq", "security_level": "low"}, "instruction": "dimana lokasi textilindo?"}
|
| 2 |
+
{"input": "", "output": "Jam operasional Senin-Jumat 08:00-17:00, Sabtu 08:00-12:00.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_101120", "source": "faq", "security_level": "low"}, "instruction": "Jam berapa textilindo beroperasional?"}
|
| 3 |
+
{"input": "", "output": "Minimal order 1 roll per jenis kain", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_0", "source": "faq", "security_level": "low"}, "instruction": "Berapa ketentuan pembelian?"}
|
| 4 |
+
{"input": "", "output": "Pembayaran dapat dilakukan via transfer bank atau cash on delivery", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_1", "source": "faq", "security_level": "low"}, "instruction": "bagimana dengan pembayarannya?"}
|
| 5 |
+
{"input": "", "output": "Gratis ongkir untuk order minimal 5 roll.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_2", "source": "faq", "security_level": "low"}, "instruction": "apa ada gratis ongkir?"}
|
| 6 |
+
{"input": "", "output": "Pengiriman ke wilayah Jabodetabek (Jakarta, Bogor, Depok, Tangerang, Bekasi) gratis.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_3", "source": "faq", "security_level": "low"}, "instruction": "apa ada gratis ongkir?"}
|
| 7 |
+
{"input": "", "output": "Katalog produk Textilindo tersedia dalam bentuk Buku, PDF, atau Katalog Website.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_0", "source": "faq", "security_level": "low"}, "instruction": "Apa ada katalog?"}
|
| 8 |
+
{"input": "", "output": "untuk buku akan kami kirimkan gratis", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_1", "source": "faq", "security_level": "low"}, "instruction": "boleh dikirimkan kalau yang buku? berapa harganya?"}
|
| 9 |
+
{"input": "", "output": "Katalog produk Textilindo dalam bentuk PDF dapat diakses melalui tautan https://bit.ly/KatalogDigitalTextilindo?r=lp&m=Mn84475jjkI.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_2", "source": "faq", "security_level": "low"}, "instruction": "untuk pdf?"}
|
| 10 |
+
{"input": "", "output": "Katalog produk Textilindo dalam bentuk PDF dapat diakses melalui tautan https://bit.ly/KatalogDigitalTextilindo?r=lp&m=Mn84475jjkI.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_3", "source": "faq", "security_level": "low"}, "instruction": "boleh minta yang pdf?"}
|
| 11 |
+
{"input": "", "output": "hallo kak untuk sampel kita bisa kirimkan gratis ya kak π", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_0", "source": "faq", "security_level": "low"}, "instruction": "Apa bisa dikirimkan sample? apa gratis?"}
|
| 12 |
+
{"input": "", "output": "polos kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_1", "source": "faq", "security_level": "low"}, "instruction": "Rayon twill itu polos apa motif"}
|
| 13 |
+
{"input": "", "output": "iya pak kita sudah nett diharga segitu", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_2", "source": "faq", "security_level": "low"}, "instruction": "Ambil banyak juga segitu kak"}
|
| 14 |
+
{"input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213\"", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_3", "source": "faq", "security_level": "low"}, "instruction": "Ini lokasi dimana ka?"}
|
| 15 |
+
{"input": "", "output": "baik kak sama sama ππ", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_4", "source": "faq", "security_level": "low"}, "instruction": "Ok ka terima kasih"}
|
| 16 |
+
{"input": "", "output": "halo ka untuk bahan tas dan tas pensil kita belum ada ya", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_5", "source": "faq", "security_level": "low"}, "instruction": "Ada kain untuk tas ?"}
|
| 17 |
+
{"input": "", "output": "untuk sample katalog gratis kak dari kami", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_6", "source": "faq", "security_level": "low"}, "instruction": "Apa bisa dikirimkan sample? apa gratis?"}
|
| 18 |
+
{"input": "", "output": "1 roll di kami 60-70 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_7", "source": "faq", "security_level": "low"}, "instruction": "Jual pergulung ya??"}
|
| 19 |
+
{"input": "", "output": "5 meter kurang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_8", "source": "faq", "security_level": "low"}, "instruction": "5 yard itu 5 meter??"}
|
| 20 |
+
{"input": "", "output": "Pengiriman kami dari tangerang ya pakπ", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_0", "source": "faq", "security_level": "low"}, "instruction": "Pengiriman darimana?"}
|
| 21 |
+
{"input": "", "output": "untuk 1 roll kita kisaran 60-70 yard ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_1", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard? harga per yard nya berapa?"}
|
| 22 |
+
{"input": "", "output": "Sudah diharga nett kak π", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_2", "source": "faq", "security_level": "low"}, "instruction": "Harga ga bisa kurang tuh?"}
|
| 23 |
+
{"input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 1521", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_3", "source": "faq", "security_level": "low"}, "instruction": "Boleh tahu alamat lengkapnya kak"}
|
| 24 |
+
{"input": "", "output": "pagi kak untuk 1 roll kita isi 60-70 yard ya kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_4", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard? harga per yard nya berapa?"}
|
| 25 |
+
{"input": "", "output": "harga kain kita beda beda ka tergantung jenis kain nya", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_5", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard? harga per yard nya berapa?"}
|
| 26 |
+
{"input": "", "output": "untuk pembelian pertama di kita bisa beli 1-5 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_6", "source": "faq", "security_level": "low"}, "instruction": "Bli wajib per roll kak?ga bisa ecer?"}
|
| 27 |
+
{"input": "", "output": "untuk pembelian pertama di kita bisa beli 1-5 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_7", "source": "faq", "security_level": "low"}, "instruction": "wajib beli per roll kak? ga bisa ecer?"}
|
| 28 |
+
{"input": "", "output": "Di tangerang ka kita", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_8", "source": "faq", "security_level": "low"}, "instruction": "Lokasi?"}
|
| 29 |
+
{"input": "", "output": "untuk sampel katalog bahan kain kita free ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_9", "source": "faq", "security_level": "low"}, "instruction": "maaf untuk katalog ny gimana? maaf ini berbayar atau gratis ππ»"}
|
| 30 |
+
{"input": "", "output": "pengiriman dari tangerang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_10", "source": "faq", "security_level": "low"}, "instruction": "maaf klo boleh tau pngirimn kain dari mana ya?"}
|
| 31 |
+
{"input": "", "output": "di kita jualnya per yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_11", "source": "faq", "security_level": "low"}, "instruction": "Bisa eceran?"}
|
| 32 |
+
{"input": "", "output": "di dadap tangerang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_12", "source": "faq", "security_level": "low"}, "instruction": "Lokasi mana?"}
|
| 33 |
+
{"input": "", "output": "halo ka untuk 1 roll kita kisaran 60-70 yard ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_13", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard? harga per yard nya berapa?"}
|
data/lora_dataset_20250910_145055.jsonl
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213", "metadata": {"topic": "general", "doc_id": "web_input_20250829_101006", "source": "faq", "security_level": "low"}, "instruction": "dimana lokasi textilindo?"}
|
| 2 |
+
{"input": "", "output": "Jam operasional Senin-Jumat 08:00-17:00, Sabtu 08:00-12:00.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_101120", "source": "faq", "security_level": "low"}, "instruction": "Jam berapa textilindo beroperasional?"}
|
| 3 |
+
{"input": "", "output": "Minimal order 1 roll per jenis kain", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_0", "source": "faq", "security_level": "low"}, "instruction": "Berapa ketentuan pembelian?"}
|
| 4 |
+
{"input": "", "output": "Pembayaran dapat dilakukan via transfer bank atau cash on delivery", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_1", "source": "faq", "security_level": "low"}, "instruction": "bagimana dengan pembayarannya?"}
|
| 5 |
+
{"input": "", "output": "Gratis ongkir untuk order minimal 5 roll.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_2", "source": "faq", "security_level": "low"}, "instruction": "apa ada gratis ongkir?"}
|
| 6 |
+
{"input": "", "output": "Pengiriman ke wilayah Jabodetabek (Jakarta, Bogor, Depok, Tangerang, Bekasi) gratis.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_3", "source": "faq", "security_level": "low"}, "instruction": "apa ada gratis ongkir?"}
|
| 7 |
+
{"input": "", "output": "Katalog produk Textilindo tersedia dalam bentuk Buku, PDF, atau Katalog Website.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_0", "source": "faq", "security_level": "low"}, "instruction": "Apa ada katalog?"}
|
| 8 |
+
{"input": "", "output": "untuk buku akan kami kirimkan gratis", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_1", "source": "faq", "security_level": "low"}, "instruction": "boleh dikirimkan kalau yang buku? berapa harganya?"}
|
| 9 |
+
{"input": "", "output": "Katalog produk Textilindo dalam bentuk PDF dapat diakses melalui tautan https://bit.ly/KatalogDigitalTextilindo?r=lp&m=Mn84475jjkI.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_2", "source": "faq", "security_level": "low"}, "instruction": "untuk pdf?"}
|
| 10 |
+
{"input": "", "output": "Katalog produk Textilindo dalam bentuk PDF dapat diakses melalui tautan https://bit.ly/KatalogDigitalTextilindo?r=lp&m=Mn84475jjkI.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_3", "source": "faq", "security_level": "low"}, "instruction": "boleh minta yang pdf?"}
|
| 11 |
+
{"input": "", "output": "hallo kak untuk sampel kita bisa kirimkan gratis ya kak π", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_0", "source": "faq", "security_level": "low"}, "instruction": "Apa bisa dikirimkan sample? apa gratis?"}
|
| 12 |
+
{"input": "", "output": "polos kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_1", "source": "faq", "security_level": "low"}, "instruction": "Rayon twill itu polos apa motif"}
|
| 13 |
+
{"input": "", "output": "iya pak kita sudah nett diharga segitu", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_2", "source": "faq", "security_level": "low"}, "instruction": "Ambil banyak juga segitu kak"}
|
| 14 |
+
{"input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213\"", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_3", "source": "faq", "security_level": "low"}, "instruction": "Ini lokasi dimana ka?"}
|
| 15 |
+
{"input": "", "output": "baik kak sama sama ππ", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_4", "source": "faq", "security_level": "low"}, "instruction": "Ok ka terima kasih"}
|
| 16 |
+
{"input": "", "output": "halo ka untuk bahan tas dan tas pensil kita belum ada ya", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_5", "source": "faq", "security_level": "low"}, "instruction": "Ada kain untuk tas ?"}
|
| 17 |
+
{"input": "", "output": "untuk sample katalog gratis kak dari kami", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_6", "source": "faq", "security_level": "low"}, "instruction": "Apa bisa dikirimkan sample? apa gratis?"}
|
| 18 |
+
{"input": "", "output": "1 roll di kami 60-70 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_7", "source": "faq", "security_level": "low"}, "instruction": "Jual pergulung ya??"}
|
| 19 |
+
{"input": "", "output": "5 meter kurang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_8", "source": "faq", "security_level": "low"}, "instruction": "5 yard itu 5 meter??"}
|
| 20 |
+
{"input": "", "output": "Pengiriman kami dari tangerang ya pakπ", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_0", "source": "faq", "security_level": "low"}, "instruction": "Pengiriman darimana?"}
|
| 21 |
+
{"input": "", "output": "untuk 1 roll kita kisaran 60-70 yard ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_1", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard? harga per yard nya berapa?"}
|
| 22 |
+
{"input": "", "output": "Sudah diharga nett kak π", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_2", "source": "faq", "security_level": "low"}, "instruction": "Harga ga bisa kurang tuh?"}
|
| 23 |
+
{"input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 1521", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_3", "source": "faq", "security_level": "low"}, "instruction": "Boleh tahu alamat lengkapnya kak"}
|
| 24 |
+
{"input": "", "output": "pagi kak untuk 1 roll kita isi 60-70 yard ya kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_4", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard? harga per yard nya berapa?"}
|
| 25 |
+
{"input": "", "output": "harga kain kita beda beda ka tergantung jenis kain nya", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_5", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard? harga per yard nya berapa?"}
|
| 26 |
+
{"input": "", "output": "untuk pembelian pertama di kita bisa beli 1-5 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_6", "source": "faq", "security_level": "low"}, "instruction": "Bli wajib per roll kak?ga bisa ecer?"}
|
| 27 |
+
{"input": "", "output": "untuk pembelian pertama di kita bisa beli 1-5 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_7", "source": "faq", "security_level": "low"}, "instruction": "wajib beli per roll kak? ga bisa ecer?"}
|
| 28 |
+
{"input": "", "output": "Di tangerang ka kita", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_8", "source": "faq", "security_level": "low"}, "instruction": "Lokasi?"}
|
| 29 |
+
{"input": "", "output": "untuk sampel katalog bahan kain kita free ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_9", "source": "faq", "security_level": "low"}, "instruction": "maaf untuk katalog ny gimana? maaf ini berbayar atau gratis ππ»"}
|
| 30 |
+
{"input": "", "output": "pengiriman dari tangerang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_10", "source": "faq", "security_level": "low"}, "instruction": "maaf klo boleh tau pngirimn kain dari mana ya?"}
|
| 31 |
+
{"input": "", "output": "di kita jualnya per yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_11", "source": "faq", "security_level": "low"}, "instruction": "Bisa eceran?"}
|
| 32 |
+
{"input": "", "output": "di dadap tangerang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_12", "source": "faq", "security_level": "low"}, "instruction": "Lokasi mana?"}
|
| 33 |
+
{"input": "", "output": "halo ka untuk 1 roll kita kisaran 60-70 yard ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_13", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard? harga per yard nya berapa?"}
|
| 34 |
+
{"input": "", "output": "Halo kak, kami jual berbagai macam jenis kain nih kak. Ada woven dan knitting. Kalau boleh tau kakak lagi ada kebutuhan di kain apa?", "metadata": {"topic": "general", "doc_id": "web_input_20250901_142858", "source": "faq", "security_level": "low"}, "instruction": "Jual kain apa?"}
|
| 35 |
+
{"input": "", "output": "Lokasi kami di dadap Tangerang kak, untuk lengkapnya Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110036_0", "source": "faq", "security_level": "low"}, "instruction": "Lokasi Dimana kak"}
|
| 36 |
+
{"input": "", "output": "untuk Alamat Gudang dan showroom kami di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110036_1", "source": "faq", "security_level": "low"}, "instruction": "posisi tokonya Dimana?"}
|
| 37 |
+
{"input": "", "output": "bisa, kami ada Gudang dan showroom kak silahkan datang ya kak kami tunggu, lokasi kami Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110036_2", "source": "faq", "security_level": "low"}, "instruction": "kalau kami datang langsung ke Lokasi bisa kak?"}
|
| 38 |
+
{"input": "", "output": "untuk pembelian awal bisa ya, di sample bahan 1-10 yard", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110036_3", "source": "faq", "security_level": "low"}, "instruction": "boleh beli sample baby doll?"}
|
| 39 |
+
{"input": "", "output": "untuk 1 roll kita kisaran 60-70 yard ya kak", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110036_4", "source": "faq", "security_level": "low"}, "instruction": "1 roll berapa yard ?"}
|
| 40 |
+
{"input": "", "output": "1 yard itu 1 meter kurang, yaitu 91,4 cm kak", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110036_5", "source": "faq", "security_level": "low"}, "instruction": "1 Yard itu berapa?"}
|
| 41 |
+
{"input": "", "output": "untuk baju tidur biasanya pakai rayon twill kak, karna bahannya adem dan jatuh", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_0", "source": "faq", "security_level": "low"}, "instruction": "kalau bahan untuk baju tidur biasanya pakai bahan apa?"}
|
| 42 |
+
{"input": "", "output": "untuk bahan woven kemeja Perempuan kami rekomendasi dibahan baby crush, linen flow polo linen, dan crinkle airflow. Selain itu dibahan knititing kami juga punya bahan Rib, jacquard", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_1", "source": "faq", "security_level": "low"}, "instruction": "untuk kemeja Perempuan rekomendasi bahan apa kak?"}
|
| 43 |
+
{"input": "", "output": "untuk satin velvet biasa di gunakan untuk dress dan satin organza untuk aksesoris baju", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_2", "source": "faq", "security_level": "low"}, "instruction": "bedanya satin velvet dan satin organza apa kak?"}
|
| 44 |
+
{"input": "", "output": "untuk rayon twill belum bisa dijadikan hijab ya kak, untuk hijab kami menggunakan bahan voal kak. Rayon twill bisa di gunakan untuk baju tidur, kemeja perempuan", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_3", "source": "faq", "security_level": "low"}, "instruction": "untuk rayon twill bisa dijadikan untuk hijab segi 4?"}
|
| 45 |
+
{"input": "", "output": "halo kak, untuk kirim sample di kami gratis ya kak untuk lebih lengkapnya bisa hubungi ke nomor official admin kami di WA: 0851-1702-1859 (Textilindo)", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_4", "source": "faq", "security_level": "low"}, "instruction": "Apa bisa dikirimkan sample? apa gratis?"}
|
| 46 |
+
{"input": "", "output": "untuk Toyobo kami ready di merk Royal Mix ya kak", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_5", "source": "faq", "security_level": "low"}, "instruction": "Toyobo jenis apa ya?"}
|
| 47 |
+
{"input": "", "output": "untuk Toyobo fudu di kami tidak ada kak, di kami hanya ada Toyobo royal mix", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_6", "source": "faq", "security_level": "low"}, "instruction": "apa ada Toyobo fudu?"}
|
| 48 |
+
{"input": "", "output": "mohon maaf kak untuk harga di kami sudah nett ya", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_7", "source": "faq", "security_level": "low"}, "instruction": "harganya bisa kurang ga kak?"}
|
| 49 |
+
{"input": "", "output": "kalau pengambilan 1 kontainer bisa kami bantu untuk harganya ya kak, jika pengambilan hanya beberapa roll harganya sesuai dengan penawaran awal kak", "metadata": {"topic": "general", "doc_id": "web_input_20250906_110330_8", "source": "faq", "security_level": "low"}, "instruction": "kalau ambil banyak bisa kurang harganya?"}
|
| 50 |
+
{"input": "", "output": "Halo kak, untuk saat ini kita ada beberapa pilihan bahan kain woven dan juga berbagai jenis knitting. Kakak lagi cari bahan yang seperti apa kalo boleh tau?", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_0", "source": "faq", "security_level": "low"}, "instruction": "Halo kak, mau tanya kainnya ada bahan apa aja?"}
|
| 51 |
+
{"input": "", "output": "Untuk warna bisa custom kak, sesuai kebutuhan. Tapi kalau ready biasanya ada stok warna basic (hitam, putih, navy, cream). Kalau kakak ada warna khusus bisa request di PO.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_1", "source": "faq", "security_level": "low"}, "instruction": "Kalau warna ada apa aja ya?"}
|
| 52 |
+
{"input": "", "output": "Minimal ordernya beda-beda ya kak. Untuk PO biasanya mulai dari 3.000 yard/warna (untuk woven) atau 400 kg/warna (untuk knitting). Bisa mix motif tapi harus sejenis.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_2", "source": "faq", "security_level": "low"}, "instruction": "Kalau PO order minimalnya berapa?"}
|
| 53 |
+
{"input": "", "output": "Estimasi PO sekitar 30β45 hari kerja, tergantung antrian produksi. Tapi biasanya bisa lebih cepat kalau slot produksi kosong.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_3", "source": "faq", "security_level": "low"}, "instruction": "Kalau proses PO-Knitting nya lama nggak?"}
|
| 54 |
+
{"input": "", "output": "Baik kak, ditunggu kabarnya. Kalau mau lihat langsung contoh bahan atau warna bisa juga kunjungan ke kantor/showroom kami.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_4", "source": "faq", "security_level": "low"}, "instruction": "Oke, nanti aku coba diskusiin dulu ya."}
|
| 55 |
+
{"input": "", "output": "untuk bahan kain popline kita belum ready ka, tapi kami bisa bantu PO.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_5", "source": "faq", "security_level": "low"}, "instruction": "Ada bahan popline?"}
|
| 56 |
+
{"input": "", "output": "Terkait Harga dan MOQ Untuk lebih lengkapnya bisa hubungi ke nomor official admin kami di WA: 0851-1702-1859 (Textilindo)", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_6", "source": "faq", "security_level": "low"}, "instruction": "Kalau boleh tau harga popline berapa dan MOQ nya berapa jika PO?"}
|
| 57 |
+
{"input": "", "output": "halo kak untuk motif salur paling kami adanya di bahan knitting kak, kami bisa bantu PO Minimal ordernya 400 kg/warna (untuk knitting). Bisa mix motif tapi komposisi nya harus sejenis.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_7", "source": "faq", "security_level": "low"}, "instruction": "Ada motif salur gak ka?"}
|
| 58 |
+
{"input": "", "output": "untuk Lokasi Alamat kami di tangerang yah kak, Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_8", "source": "faq", "security_level": "low"}, "instruction": "kalo boleh tau lokasi nya Dimana ka ?"}
|
| 59 |
+
{"input": "", "output": "Untuk kualitas kain yang kami punya semua nya premium ya ka.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_9", "source": "faq", "security_level": "low"}, "instruction": "Ada polo linen Yang kualitas grade A?"}
|
| 60 |
+
{"input": "", "output": "pengiriman kami dari tangerang kak, untuk bahan kain woven ready stock kami minimal order bisa 1 roll saja kak. Kalau untuk bahan dengan system PO ada ketentuan MOQ yang berlaku sesuai dengan jenis bahannya.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_110616_10", "source": "faq", "security_level": "low"}, "instruction": "Pengiriman dari mana ? Min order ?"}
|
| 61 |
+
{"input": "", "output": "Untuk Lokasi Gudang, showroom dan kantor kami di Tangerang kak", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_0", "source": "faq", "security_level": "low"}, "instruction": "Lokasi dmn?"}
|
| 62 |
+
{"input": "", "output": "Jl. Raya Perancis No.39, Dadap, Kec. Kosambi, Kabupaten Tangerang, Banten 15211, Indonesia", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_1", "source": "faq", "security_level": "low"}, "instruction": "Alamat lengkap kantor, Gudang dan showroomnya?"}
|
| 63 |
+
{"input": "", "output": "1 roll dikisaran 60-70 yard, 1 yard = 91,4 cm kak", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_2", "source": "faq", "security_level": "low"}, "instruction": "1 rol berapa meter ?"}
|
| 64 |
+
{"input": "", "output": "untuk pembelian kami jual per roll ya kak, tapi untuk pembelian awal bisa beli sample bahan 1-5 yard kak", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_3", "source": "faq", "security_level": "low"}, "instruction": "Bisa beli meteran kak?"}
|
| 65 |
+
{"input": "", "output": "untuk rekomendasi bahan hijab dikain woven ready stock kami ada bahan voal, baby doll, shimmer, dan crinkle airflow kak. Untuk bahan knitting kami rekomendasi dibahan spandex ballon dan jersey.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_4", "source": "faq", "security_level": "low"}, "instruction": "boleh rekomendasi bahan untuk hijab kak?"}
|
| 66 |
+
{"input": "", "output": "halo kak! Untuk bahan poplin kami belum ready ya kak, namun untuk bahan tersebut kami bisa bantu dengan sistem PO, estimasi 1-2 bulan dan ada MOQ sesuai dengan jenis bahan yang akan dipesan.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_5", "source": "faq", "security_level": "low"}, "instruction": "Halo kak, ada bahan poplin kak?"}
|
| 67 |
+
{"input": "", "output": "untuk system PO harga akan harga dapat ditentukan setelah kami test komposisi bahan. Untuk detail lengkapnya bisa hubungi ke nomor official admin kami di WA: 0851-1702-1859 (Textilindo)", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_6", "source": "faq", "security_level": "low"}, "instruction": "untuk harga bahan PO berapa kak?"}
|
| 68 |
+
{"input": "", "output": "untuk system PO kami ada beberapa pilihan bahan yang ada di showroom kami, namun jika ada request khusus dari customer tentunya kami bisa bantu. Jika ada request bahan dari customer dimohon untuk mengirimkan sample bahan untuk acuan kami (minimal sebesar kertas A4), setelah sample tersebut sampai, kami akan melakukan test lab komposisi bahan dan menentukan harga serta moq bahan.", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_7", "source": "faq", "security_level": "low"}, "instruction": "kalau system po gitu gimana ya kak?"}
|
| 69 |
+
{"input": "", "output": "untuk kain woven, MOQ sesuai penawaran awal dan quantity menyesuaikan dengan bahan yang akan di pesan. Sedangkan bahan knitting MOQ kami di 400kg/warna. detail lengkapnya bisa hubungi ke nomor official admin kami di WA: 0851-1702-1859 (Textilindo)", "metadata": {"topic": "product", "doc_id": "web_input_20250906_111042_8", "source": "faq", "security_level": "low"}, "instruction": "MOQ bisa kurang ga kak?"}
|
| 70 |
+
{"input": "", "output": "Maaf belum bisa yaa ka, Karena payment kami sistemnya Cash Before Delivery.", "metadata": {"topic": "payment", "doc_id": "web_input_20250906_111355_0", "source": "faq", "security_level": "low"}, "instruction": "Bisa Tempo?"}
|
| 71 |
+
{"input": "", "output": "Syarat dan ketentuan COD yang berlaku (Jakarta dan Tangerang) : - Calon customer harus melakukan foto selfie dengan KTP (boleh diberikan watermark/Hak Cipta) - Calon customer harus menyetujui bahwa pesanan yang akan dikirim tidak akan dilakukan Bongkar Barang Sebelum Invoice di bayarkan dan telah dikonfirmasi.", "metadata": {"topic": "payment", "doc_id": "web_input_20250906_111355_1", "source": "faq", "security_level": "low"}, "instruction": "apa bisa COD? A Sistem payment kami cash before delivery, namun untuk Jakarta dan Tangerang kami mengizinkan pembayaran dengan sistem COD sesuai syarat dan ketentuan yang berlaku. Tetapi diluar Jakarta dan Tangerang belum bisa provide dengan sistem pembayaran COD. Q:Apa syarat dan ketentuan COD?"}
|
| 72 |
+
{"input": "", "output": "Halo kaa!, Untuk sample kain kami dapat dikirimkan secara gratis yaa kak.Mohon dibantu untuk mengirimkan data Alamat lengkapnya ke nomor official admin kami di WA: 0851-1702-1859 (Textilindo).", "metadata": {"topic": "payment", "doc_id": "web_input_20250906_111355_2", "source": "faq", "security_level": "low"}, "instruction": "Bisa kirim sampel?"}
|
| 73 |
+
{"input": "", "output": "Biaya ongkir kami gratis yaa kak untuk sekitaran Jakarta dan Tangerang (S&K berlaku), jika diluar dari area tersebut, maka ongkir akan ditanggung oleh pembeli.", "metadata": {"topic": "payment", "doc_id": "web_input_20250906_111355_3", "source": "faq", "security_level": "low"}, "instruction": "Untuk pengirimannya gratis ongkir tidak yaa kak?"}
|
| 74 |
+
{"input": "", "output": "Untuk motif salur biasanya ada di bahan knitting kak. Bisa dibantu lewat sistem PO dengan MOQ minimal 400 kg/warna (bisa mix motif dengan catatan komposisi sama).", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_092814_0", "source": "faq", "security_level": "low"}, "instruction": "Ada motif salur nggak kak?"}
|
| 75 |
+
{"input": "", "output": "Estimasi PO knitting sekitar 30β45 hari kerja kak, tergantung antrian produksi. Kalau slot produksi kosong biasanya bisa lebih cepat.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_092814_1", "source": "faq", "security_level": "low"}, "instruction": "Kalau proses PO knitting lama nggak?"}
|
| 76 |
+
{"input": "", "output": "Lokasi kami di πJl. Raya Prancis No.39, Kosambi, Kabupaten Tangerang, Banten 15213. Bisa langsung datang kak, showroom & gudang jadi satu lokasi.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_092814_2", "source": "faq", "security_level": "low"}, "instruction": "Lokasi showroom dimana kak?"}
|
| 77 |
+
{"input": "", "output": "Pengiriman dari Tangerang kak. Woven ready stock min 1 roll, kalau untuk knitting MOQ di 400kg/warna.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_092814_3", "source": "faq", "security_level": "low"}, "instruction": "Pengiriman dari mana? Min order?"}
|
| 78 |
+
{"input": "", "output": "Untuk woven saat ini ready stock polos. Untuk knitting kami bisa buat motif (contoh: Jacquard, stripe/salur) dengan sistem PO", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_092814_4", "source": "faq", "security_level": "low"}, "instruction": "Ada kain motif nggak?"}
|
| 79 |
+
{"input": "", "output": "Untuk motif salur biasanya ada di bahan knitting kak. Bisa dibantu lewat sistem PO dengan MOQ minimal 400 kg/warna (bisa mix motif dengan catatan komposisi sama).", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_092837_0", "source": "faq", "security_level": "low"}, "instruction": "Ada motif salur nggak kak?"}
|
| 80 |
+
{"input": "", "output": "Estimasi PO knitting sekitar 30β45 hari kerja kak, tergantung antrian produksi. Kalau slot produksi kosong biasanya bisa lebih cepat.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_092837_1", "source": "faq", "security_level": "low"}, "instruction": "Kalau proses PO knitting lama nggak?"}
|
| 81 |
+
{"input": "", "output": "Bisa kak, untuk bahan woven di awal pembelian bisa 1β10 yard ya ka. Untuk bahan knitting kami bisa kirimkan hanger atau potongan kain saja ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250909_093304", "source": "faq", "security_level": "low"}, "instruction": "Bis"}
|
| 82 |
+
{"input": "", "output": "kami punya 2 jenis kain kak, untuk jenis kain woven kami rekomendasikan Voal & Baby Doll kak, bahannya adem & jatuh. Untuk jenis kain knitting kami rekomendasikan spandex balon.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_1", "source": "faq", "security_level": "low"}, "instruction": "Kalau buat hijab enaknya pakai apa?"}
|
| 83 |
+
{"input": "", "output": "Woven rata-rata 150 cm (Voal 115 cm). Knitting bisa request sampai 240 cm ya ka.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_2", "source": "faq", "security_level": "low"}, "instruction": "Lebarnya berapa kak?"}
|
| 84 |
+
{"input": "", "output": "Boleh banget kak, silakan datang, di kantor kami ada 2 showroom untuk kain knitting dan woven jadi kakak bisa lihat secara langsung koleksi kain kami Berikut Alamat kami ya kak, Jl. Raya Prancis No.39, Kosambi, Kabupaten Tangerang, Banten 15213. Bisa langsung datang kak, showroom & gudang jadi satu lokasi.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_3", "source": "faq", "security_level": "low"}, "instruction": "Kalau datang langsung ke showroom boleh kak?"}
|
| 85 |
+
{"input": "", "output": "Bisa kak, untuk bahan woven di awal pembelian bisa 1β10 yard ya ka. Untuk bahan knitting kami bisa kirimkan hanger atau potongan kain saja ya ka", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_4", "source": "faq", "security_level": "low"}, "instruction": "Kalau cuma mau beli sedikit bisa ga?"}
|
| 86 |
+
{"input": "", "output": "Bisa banget kak, untuk sample katalog dari kami free ya.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_5", "source": "faq", "security_level": "low"}, "instruction": "Kalau mau minta sample katalog bisa ga kak?"}
|
| 87 |
+
{"input": "", "output": "Kalau woven ready stock semua polosan kak. Kalau motif bisa pilih dari bahan knitting, kami punya berbagai macam koleksi Jacquard.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_6", "source": "faq", "security_level": "low"}, "instruction": "Ada yang motif juga kak?"}
|
| 88 |
+
{"input": "", "output": "Kalau untuk harga eceran mohon maaf sudah nett ya kak , tapi kalau ambil dalam jumlah banyak, misalnya 1 kontainer, baru bisa ada penyesuaian harga.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_7", "source": "faq", "security_level": "low"}, "instruction": "Harga bisa nego ga kak?"}
|
| 89 |
+
{"input": "", "output": "Rata-rata isi 60β70 yard kak. Kalau diukur per meter, 1 yard itu sekitar 91,4 cm (hampir 1 meter).", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_8", "source": "faq", "security_level": "low"}, "instruction": "1 roll kain isinya berapa yard?"}
|
| 90 |
+
{"input": "", "output": "Mohon maaf kak, untuk saat ini sistem COD belum berlaku. Pembayaran dilakukan dengan sistem CBD (cash before delivery) , setelah pembayaran selesai barang akan kami proses kirim.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_9", "source": "faq", "security_level": "low"}, "instruction": "Bisa COD nggak kak?"}
|
| 91 |
+
{"input": "", "output": "Woven sekitar 12 kg/roll, knitting sekitar 25 kg/roll.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_10", "source": "faq", "security_level": "low"}, "instruction": "Berat 1 roll kain kira-kira berapa?"}
|
| 92 |
+
{"input": "", "output": "Untuk poplin saat ini belum ready kak, tapi bisa dibantu lewat sistem PO", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_11", "source": "faq", "security_level": "low"}, "instruction": "Kain Poplin ada?"}
|
| 93 |
+
{"input": "", "output": "Untuk motif salur biasanya ada di bahan knitting kak. Bisa dibantu lewat sistem PO dengan MOQ minimal 400 kg/warna (bisa mix motif dengan catatan komposisi sama).", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_12", "source": "faq", "security_level": "low"}, "instruction": "Ada motif salur nggak kak?"}
|
| 94 |
+
{"input": "", "output": "Estimasi PO knitting sekitar 30β45 hari kerja kak, tergantung antrian produksi. Kalau slot produksi kosong biasanya bisa lebih cepat.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_13", "source": "faq", "security_level": "low"}, "instruction": "Kalau proses PO knitting lama nggak?"}
|
| 95 |
+
{"input": "", "output": "Lokasi kami di πJl. Raya Prancis No.39, Kosambi, Kabupaten Tangerang, Banten 15213. Bisa langsung datang kak, showroom & gudang jadi satu lokasi.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_14", "source": "faq", "security_level": "low"}, "instruction": "Lokasi showroom dimana kak?"}
|
| 96 |
+
{"input": "", "output": "Pengiriman dari Tangerang kak. Woven ready stock min 1 roll, kalau untuk knitting MOQ di 400kg/warna.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_15", "source": "faq", "security_level": "low"}, "instruction": "Pengiriman dari mana? Min order?"}
|
| 97 |
+
{"input": "", "output": "Untuk woven saat ini ready stock polos. Untuk knitting kami bisa buat motif (contoh: Jacquard, stripe/salur) dengan sistem PO, untuk informasi lebih lengkap nya bisa hubungi admin official WA: 0851-1702-1859.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250909_093618_16", "source": "faq", "security_level": "low"}, "instruction": "Ada kain motif nggak?"}
|
| 98 |
+
{"input": "", "output": "untuk kain linen kami ada di polo linen dan linen flow ya kak.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_0", "source": "faq", "security_level": "low"}, "instruction": "ada kain linen ga kak?"}
|
| 99 |
+
{"input": "", "output": "untuk linen flow ringan, jatuh (flowy), dan lembut sedangkan polo linen lebih tebal dan kainnya lebih padat.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_1", "source": "faq", "security_level": "low"}, "instruction": "apa bedanya linen flow dan polo linen?"}
|
| 100 |
+
{"input": "", "output": "Sistem payment kami cash before delivery, namun untuk Jakarta dan Tangerang kami mengizinkan pembayaran dengan sistem COD sesuai syarat dan ketentuan yang berlaku. Tetapi diluar Jakarta dan Tangerang belum bisa provide dengan sistem pembayaran COD.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_2", "source": "faq", "security_level": "low"}, "instruction": "kak bisa COD ga ya?"}
|
| 101 |
+
{"input": "", "output": "halo kak Pengembalian bisa dilakukan selama bahan masih dalam kondisi utuh, belum dipotong, dan belum digunakan. Untuk bahan woven maksimal pengembalian 7 hari setelah barang di terima oleh pembeli, dengan syarat dan ketentuan yang berlaku.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_3", "source": "faq", "security_level": "low"}, "instruction": "apakah bisa retur?"}
|
| 102 |
+
{"input": "", "output": "Halo Kak, tentu bisa ya Selama bahan masih dalam kondisi utuh, belum dipotong, dan belum digunakan, penukaran bisa kami proses. Untuk bahan woven maksimal pengembalian 7 hari setelah barang di terima oleh pembeli, dengan syarat dan ketentuan yang berlaku.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_4", "source": "faq", "security_level": "low"}, "instruction": "bahannya ada masalah, bisa ditukar ga ya?"}
|
| 103 |
+
{"input": "", "output": "halo kak, untuk Toyobo 1 rollnya di 30-40 yard ya kak", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_5", "source": "faq", "security_level": "low"}, "instruction": "untuk Toyobo 1 roll nya berapa?"}
|
| 104 |
+
{"input": "", "output": "untuk baju bridesmaid bisa pakai bahan satin velvet ya kak, dan untuk tambahan aksesoris bisa menggunakan satin organza dan satin organza kak agar tampilan bisa lebih manis", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_6", "source": "faq", "security_level": "low"}, "instruction": "kak aku cari bahan untuk bridesmaid bisa pakai bahan apa?"}
|
| 105 |
+
{"input": "", "output": "halo ka untuk knitting bisa PO dengan MOQ 400Kg/warna.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_7", "source": "faq", "security_level": "low"}, "instruction": "MOQ untuk PO knitting berapa?"}
|
| 106 |
+
{"input": "", "output": "halo kak, untuk PO bahan knitting estimasi prosesnya sekitar 1 bulan ya. Waktu ini termasuk proses produksi hingga siap kirim. Kalau ada update lebih cepat, pasti akan kami infokan segera ke Kakak. Terima kasih atas kesabarannya.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_8", "source": "faq", "security_level": "low"}, "instruction": "berapa lama PO knitting?"}
|
| 107 |
+
{"input": "", "output": "halo kak, untuk bahan baby doll bisa ya kak dijadikan gamis tetapi harus menggunakan kain furing agar tidak menerawang atau di buat double layer.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_9", "source": "faq", "security_level": "low"}, "instruction": "baby doll bisa buat gamis?"}
|
| 108 |
+
{"input": "", "output": "halo ka, untuk bahan kain yang tidak mudah kusut kita bisa rekomendasikan di bahan Baby crush, crinkle airflow, linen flow, polo linen dan baby doll. Q :untuk bahan yang adem biasa nya pakai apa ka? A : Kalau bahan yang adem & nyaman biasanya kami rekomendasikan seperti rayon twill, polo linen, Bahan ini lebih menyerap keringat, jatuhnya lembut, cocok dipakai harian atau di cuaca panas.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_10", "source": "faq", "security_level": "low"}, "instruction": "Apakah ada bahan yang tidak mudah kusut kak?"}
|
| 109 |
+
{"input": "", "output": "Secara umum, kain woven (tenun) sifatnya non-stretch ya kak. Jadi kalau ditarik tidak melar, kecuali memang ada campuran spandex di dalamnya. Kalau kakak butuh bahan yang stretch/melar, biasanya lebih cocok di knitting seperti jersey, spandex, scuba, rib, lacoste, dll karena karakter dasarnya memang elastis.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_11", "source": "faq", "security_level": "low"}, "instruction": "Untuk kain woven yang ready stretch atau tidak kak?"}
|
| 110 |
+
{"input": "", "output": "Bisa banget kak, kalau lewat sistem PO, warna bisa custom sesuai permintaan. Nanti kakak cukup kirimkan contoh warna (bisa berupa kain/swatch), lalu kami sesuaikan dengan hasil produksi. Estimasi waktu PO 30 hari kerja (untuk knitting) tergantung antrian, kalau untuk woven estimasi PO 45 hari hari kerja ya ka.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_12", "source": "faq", "security_level": "low"}, "instruction": "Apakah bisa request warna tertentu kak jika PO?"}
|
| 111 |
+
{"input": "", "output": "Tidak kak, bahan di kami sudah melalui proses pewarnaan standar. Tapi tetap disarankan cuci terpisah di awal ya.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_13", "source": "faq", "security_level": "low"}, "instruction": "Apakah bahan woven warnanya mudah luntur kalau dicuci?"}
|
| 112 |
+
{"input": "", "output": "untuk bahan kain woven yang bisa di printing saat ini voal, baby doll, baby crush, satin organza dan satin velvet.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_14", "source": "faq", "security_level": "low"}, "instruction": "bahan apa saja yang bisa printing?"}
|
| 113 |
+
{"input": "", "output": "Kami rekomendasikan untuk gamis Perempuan bisa pakai bahan Rayon Twill, baby doll, crinkle airflow, polo linen dan Linen Flow karena jatuhnya bagus dan adem dipakai. Dan untuk gamis laki-laki bisa pakai bahan Toyobo ya kak.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_15", "source": "faq", "security_level": "low"}, "instruction": "Kalau untuk gamis bahan apa yang paling cocok?"}
|
| 114 |
+
{"input": "", "output": "Tergantung bahannya kak, untuk bahan voal,baby doll, satin organza dan shanto organza agak transparan, sedangkan rayon twill crinkle airflow, polo linen, baby crush, toyobo, linen flow, dan satin velvet lebih tebal.", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_16", "source": "faq", "security_level": "low"}, "instruction": "Kalau kainnya transparan atau tidak kak?"}
|
| 115 |
+
{"input": "", "output": "Bisa ya kak, nanti bisa kirimkan sample kain yang di inginkan ke Alamat kami. Untuk lebih lengkapnya bisa hubungi ke nomor official admin kami di WA: 0851-1702-1859 (Textilindo).", "metadata": {"topic": "payment", "doc_id": "web_input_20250909_094248_17", "source": "faq", "security_level": "low"}, "instruction": "Apakah bisa PO bahan sesuai request?"}
|
data/textilindo_training_data.jsonl
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"text": "### Instruction:\ndimana lokasi textilindo?\n\n### Response:\nTextilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213", "instruction": "dimana lokasi textilindo?", "input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213", "metadata": {"topic": "general", "doc_id": "web_input_20250829_101006", "source": "faq", "security_level": "low"}}
|
| 2 |
+
{"text": "### Instruction:\nJam berapa textilindo beroperasional?\n\n### Response:\nJam operasional Senin-Jumat 08:00-17:00, Sabtu 08:00-12:00.", "instruction": "Jam berapa textilindo beroperasional?", "input": "", "output": "Jam operasional Senin-Jumat 08:00-17:00, Sabtu 08:00-12:00.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_101120", "source": "faq", "security_level": "low"}}
|
| 3 |
+
{"text": "### Instruction:\nBerapa ketentuan pembelian?\n\n### Response:\nMinimal order 1 roll per jenis kain", "instruction": "Berapa ketentuan pembelian?", "input": "", "output": "Minimal order 1 roll per jenis kain", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_0", "source": "faq", "security_level": "low"}}
|
| 4 |
+
{"text": "### Instruction:\nbagimana dengan pembayarannya?\n\n### Response:\nPembayaran dapat dilakukan via transfer bank atau cash on delivery", "instruction": "bagimana dengan pembayarannya?", "input": "", "output": "Pembayaran dapat dilakukan via transfer bank atau cash on delivery", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_1", "source": "faq", "security_level": "low"}}
|
| 5 |
+
{"text": "### Instruction:\napa ada gratis ongkir?\n\n### Response:\nGratis ongkir untuk order minimal 5 roll.", "instruction": "apa ada gratis ongkir?", "input": "", "output": "Gratis ongkir untuk order minimal 5 roll.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_2", "source": "faq", "security_level": "low"}}
|
| 6 |
+
{"text": "### Instruction:\napa ada gratis ongkir?\n\n### Response:\nPengiriman ke wilayah Jabodetabek (Jakarta, Bogor, Depok, Tangerang, Bekasi) gratis.", "instruction": "apa ada gratis ongkir?", "input": "", "output": "Pengiriman ke wilayah Jabodetabek (Jakarta, Bogor, Depok, Tangerang, Bekasi) gratis.", "metadata": {"topic": "shipping", "doc_id": "web_input_20250829_101603_3", "source": "faq", "security_level": "low"}}
|
| 7 |
+
{"text": "### Instruction:\nApa ada katalog?\n\n### Response:\nKatalog produk Textilindo tersedia dalam bentuk Buku, PDF, atau Katalog Website.", "instruction": "Apa ada katalog?", "input": "", "output": "Katalog produk Textilindo tersedia dalam bentuk Buku, PDF, atau Katalog Website.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_0", "source": "faq", "security_level": "low"}}
|
| 8 |
+
{"text": "### Instruction:\nboleh dikirimkan kalau yang buku? berapa harganya?\n\n### Response:\nuntuk buku akan kami kirimkan gratis", "instruction": "boleh dikirimkan kalau yang buku? berapa harganya?", "input": "", "output": "untuk buku akan kami kirimkan gratis", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_1", "source": "faq", "security_level": "low"}}
|
| 9 |
+
{"text": "### Instruction:\nuntuk pdf?\n\n### Response:\nKatalog produk Textilindo dalam bentuk PDF dapat diakses melalui tautan https://bit.ly/KatalogDigitalTextilindo?r=lp&m=Mn84475jjkI.", "instruction": "untuk pdf?", "input": "", "output": "Katalog produk Textilindo dalam bentuk PDF dapat diakses melalui tautan https://bit.ly/KatalogDigitalTextilindo?r=lp&m=Mn84475jjkI.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_2", "source": "faq", "security_level": "low"}}
|
| 10 |
+
{"text": "### Instruction:\nboleh minta yang pdf?\n\n### Response:\nKatalog produk Textilindo dalam bentuk PDF dapat diakses melalui tautan https://bit.ly/KatalogDigitalTextilindo?r=lp&m=Mn84475jjkI.", "instruction": "boleh minta yang pdf?", "input": "", "output": "Katalog produk Textilindo dalam bentuk PDF dapat diakses melalui tautan https://bit.ly/KatalogDigitalTextilindo?r=lp&m=Mn84475jjkI.", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102033_3", "source": "faq", "security_level": "low"}}
|
| 11 |
+
{"text": "### Instruction:\nApa bisa dikirimkan sample? apa gratis?\n\n### Response:\nhallo kak untuk sampel kita bisa kirimkan gratis ya kak π", "instruction": "Apa bisa dikirimkan sample? apa gratis?", "input": "", "output": "hallo kak untuk sampel kita bisa kirimkan gratis ya kak π", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_0", "source": "faq", "security_level": "low"}}
|
| 12 |
+
{"text": "### Instruction:\nRayon twill itu polos apa motif\n\n### Response:\npolos kak", "instruction": "Rayon twill itu polos apa motif", "input": "", "output": "polos kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_1", "source": "faq", "security_level": "low"}}
|
| 13 |
+
{"text": "### Instruction:\nAmbil banyak juga segitu kak\n\n### Response:\niya pak kita sudah nett diharga segitu", "instruction": "Ambil banyak juga segitu kak", "input": "", "output": "iya pak kita sudah nett diharga segitu", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_2", "source": "faq", "security_level": "low"}}
|
| 14 |
+
{"text": "### Instruction:\nIni lokasi dimana ka?\n\n### Response:\nTextilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213\"", "instruction": "Ini lokasi dimana ka?", "input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 15213\"", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_3", "source": "faq", "security_level": "low"}}
|
| 15 |
+
{"text": "### Instruction:\nOk ka terima kasih\n\n### Response:\nbaik kak sama sama ππ", "instruction": "Ok ka terima kasih", "input": "", "output": "baik kak sama sama ππ", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_4", "source": "faq", "security_level": "low"}}
|
| 16 |
+
{"text": "### Instruction:\nAda kain untuk tas ?\n\n### Response:\nhalo ka untuk bahan tas dan tas pensil kita belum ada ya", "instruction": "Ada kain untuk tas ?", "input": "", "output": "halo ka untuk bahan tas dan tas pensil kita belum ada ya", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_5", "source": "faq", "security_level": "low"}}
|
| 17 |
+
{"text": "### Instruction:\nApa bisa dikirimkan sample? apa gratis?\n\n### Response:\nuntuk sample katalog gratis kak dari kami", "instruction": "Apa bisa dikirimkan sample? apa gratis?", "input": "", "output": "untuk sample katalog gratis kak dari kami", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_6", "source": "faq", "security_level": "low"}}
|
| 18 |
+
{"text": "### Instruction:\nJual pergulung ya??\n\n### Response:\n1 roll di kami 60-70 yard kak", "instruction": "Jual pergulung ya??", "input": "", "output": "1 roll di kami 60-70 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_7", "source": "faq", "security_level": "low"}}
|
| 19 |
+
{"text": "### Instruction:\n5 yard itu 5 meter??\n\n### Response:\n5 meter kurang kak", "instruction": "5 yard itu 5 meter??", "input": "", "output": "5 meter kurang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_102926_8", "source": "faq", "security_level": "low"}}
|
| 20 |
+
{"text": "### Instruction:\nPengiriman darimana?\n\n### Response:\nPengiriman kami dari tangerang ya pakπ", "instruction": "Pengiriman darimana?", "input": "", "output": "Pengiriman kami dari tangerang ya pakπ", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_0", "source": "faq", "security_level": "low"}}
|
| 21 |
+
{"text": "### Instruction:\n1 roll berapa yard? harga per yard nya berapa?\n\n### Response:\nuntuk 1 roll kita kisaran 60-70 yard ya ka", "instruction": "1 roll berapa yard? harga per yard nya berapa?", "input": "", "output": "untuk 1 roll kita kisaran 60-70 yard ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_1", "source": "faq", "security_level": "low"}}
|
| 22 |
+
{"text": "### Instruction:\nHarga ga bisa kurang tuh?\n\n### Response:\nSudah diharga nett kak π", "instruction": "Harga ga bisa kurang tuh?", "input": "", "output": "Sudah diharga nett kak π", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_2", "source": "faq", "security_level": "low"}}
|
| 23 |
+
{"text": "### Instruction:\nBoleh tahu alamat lengkapnya kak\n\n### Response:\nTextilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 1521", "instruction": "Boleh tahu alamat lengkapnya kak", "input": "", "output": "Textilindo berkantor pusat di Jl. Raya Prancis No.39, Kosambi Tim., Kec. Kosambi, Kabupaten Tangerang, Banten 1521", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_3", "source": "faq", "security_level": "low"}}
|
| 24 |
+
{"text": "### Instruction:\n1 roll berapa yard? harga per yard nya berapa?\n\n### Response:\npagi kak untuk 1 roll kita isi 60-70 yard ya kak", "instruction": "1 roll berapa yard? harga per yard nya berapa?", "input": "", "output": "pagi kak untuk 1 roll kita isi 60-70 yard ya kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_4", "source": "faq", "security_level": "low"}}
|
| 25 |
+
{"text": "### Instruction:\n1 roll berapa yard? harga per yard nya berapa?\n\n### Response:\nharga kain kita beda beda ka tergantung jenis kain nya", "instruction": "1 roll berapa yard? harga per yard nya berapa?", "input": "", "output": "harga kain kita beda beda ka tergantung jenis kain nya", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_5", "source": "faq", "security_level": "low"}}
|
| 26 |
+
{"text": "### Instruction:\nBli wajib per roll kak?ga bisa ecer?\n\n### Response:\nuntuk pembelian pertama di kita bisa beli 1-5 yard kak", "instruction": "Bli wajib per roll kak?ga bisa ecer?", "input": "", "output": "untuk pembelian pertama di kita bisa beli 1-5 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_6", "source": "faq", "security_level": "low"}}
|
| 27 |
+
{"text": "### Instruction:\nwajib beli per roll kak? ga bisa ecer?\n\n### Response:\nuntuk pembelian pertama di kita bisa beli 1-5 yard kak", "instruction": "wajib beli per roll kak? ga bisa ecer?", "input": "", "output": "untuk pembelian pertama di kita bisa beli 1-5 yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_7", "source": "faq", "security_level": "low"}}
|
| 28 |
+
{"text": "### Instruction:\nLokasi?\n\n### Response:\nDi tangerang ka kita", "instruction": "Lokasi?", "input": "", "output": "Di tangerang ka kita", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_8", "source": "faq", "security_level": "low"}}
|
| 29 |
+
{"text": "### Instruction:\nmaaf untuk katalog ny gimana? maaf ini berbayar atau gratis ππ»\n\n### Response:\nuntuk sampel katalog bahan kain kita free ya ka", "instruction": "maaf untuk katalog ny gimana? maaf ini berbayar atau gratis ππ»", "input": "", "output": "untuk sampel katalog bahan kain kita free ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_9", "source": "faq", "security_level": "low"}}
|
| 30 |
+
{"text": "### Instruction:\nmaaf klo boleh tau pngirimn kain dari mana ya?\n\n### Response:\npengiriman dari tangerang kak", "instruction": "maaf klo boleh tau pngirimn kain dari mana ya?", "input": "", "output": "pengiriman dari tangerang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_10", "source": "faq", "security_level": "low"}}
|
| 31 |
+
{"text": "### Instruction:\nBisa eceran?\n\n### Response:\ndi kita jualnya per yard kak", "instruction": "Bisa eceran?", "input": "", "output": "di kita jualnya per yard kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_11", "source": "faq", "security_level": "low"}}
|
| 32 |
+
{"text": "### Instruction:\nLokasi mana?\n\n### Response:\ndi dadap tangerang kak", "instruction": "Lokasi mana?", "input": "", "output": "di dadap tangerang kak", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_12", "source": "faq", "security_level": "low"}}
|
| 33 |
+
{"text": "### Instruction:\n1 roll berapa yard? harga per yard nya berapa?\n\n### Response:\nhalo ka untuk 1 roll kita kisaran 60-70 yard ya ka", "instruction": "1 roll berapa yard? harga per yard nya berapa?", "input": "", "output": "halo ka untuk 1 roll kita kisaran 60-70 yard ya ka", "metadata": {"topic": "general", "doc_id": "web_input_20250829_103901_13", "source": "faq", "security_level": "low"}}
|
data/training_data.jsonl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{"messages": [{"role": "system", "content": "Anda adalah asisten AI yang membantu dengan pertanyaan dalam bahasa Indonesia."}, {"role": "user", "content": "Apa itu machine learning?"}, {"role": "assistant", "content": "Machine learning adalah cabang dari artificial intelligence yang memungkinkan komputer belajar dari data tanpa diprogram secara eksplisit."}]}
|
| 2 |
+
{"messages": [{"role": "system", "content": "Anda adalah asisten AI yang membantu dengan pertanyaan dalam bahasa Indonesia."}, {"role": "user", "content": "Jelaskan tentang deep learning"}, {"role": "assistant", "content": "Deep learning adalah subset dari machine learning yang menggunakan neural network dengan banyak layer untuk memproses data kompleks."}]}
|
| 3 |
+
{"messages": [{"role": "system", "content": "Anda adalah asisten AI yang membantu dengan pertanyaan dalam bahasa Indonesia."}, {"role": "user", "content": "Bagaimana cara kerja neural network?"}, {"role": "assistant", "content": "Neural network bekerja dengan menerima input, memproses melalui hidden layers, dan menghasilkan output berdasarkan weights yang telah dilatih."}]}
|
requirements.txt
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio>=4.0.0
|
| 2 |
+
requests>=2.31.0
|
| 3 |
+
numpy>=1.24.0
|
| 4 |
+
pandas>=2.0.0
|
| 5 |
+
python-dotenv>=1.0.0
|
templates/chat.html
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="id">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Textilindo AI Assistant</title>
|
| 7 |
+
<style>
|
| 8 |
+
* {
|
| 9 |
+
margin: 0;
|
| 10 |
+
padding: 0;
|
| 11 |
+
box-sizing: border-box;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
body {
|
| 15 |
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
| 16 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 17 |
+
height: 100vh;
|
| 18 |
+
display: flex;
|
| 19 |
+
justify-content: center;
|
| 20 |
+
align-items: center;
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
.chat-container {
|
| 24 |
+
width: 90%;
|
| 25 |
+
max-width: 800px;
|
| 26 |
+
height: 80vh;
|
| 27 |
+
background: white;
|
| 28 |
+
border-radius: 20px;
|
| 29 |
+
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
|
| 30 |
+
display: flex;
|
| 31 |
+
flex-direction: column;
|
| 32 |
+
overflow: hidden;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
.header {
|
| 36 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 37 |
+
color: white;
|
| 38 |
+
padding: 20px;
|
| 39 |
+
text-align: center;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
.header h1 {
|
| 43 |
+
font-size: 24px;
|
| 44 |
+
margin-bottom: 5px;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
.header p {
|
| 48 |
+
opacity: 0.9;
|
| 49 |
+
font-size: 14px;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
.chat-messages {
|
| 53 |
+
flex: 1;
|
| 54 |
+
padding: 20px;
|
| 55 |
+
overflow-y: auto;
|
| 56 |
+
background: #f8f9fa;
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
.message {
|
| 60 |
+
margin-bottom: 15px;
|
| 61 |
+
display: flex;
|
| 62 |
+
align-items: flex-start;
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
.message.user {
|
| 66 |
+
justify-content: flex-end;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
.message-content {
|
| 70 |
+
max-width: 70%;
|
| 71 |
+
padding: 12px 16px;
|
| 72 |
+
border-radius: 18px;
|
| 73 |
+
word-wrap: break-word;
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
.message.user .message-content {
|
| 77 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 78 |
+
color: white;
|
| 79 |
+
border-bottom-right-radius: 4px;
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
.message.assistant .message-content {
|
| 83 |
+
background: white;
|
| 84 |
+
color: #333;
|
| 85 |
+
border: 1px solid #e1e5e9;
|
| 86 |
+
border-bottom-left-radius: 4px;
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
.avatar {
|
| 90 |
+
width: 32px;
|
| 91 |
+
height: 32px;
|
| 92 |
+
border-radius: 50%;
|
| 93 |
+
margin: 0 8px;
|
| 94 |
+
display: flex;
|
| 95 |
+
align-items: center;
|
| 96 |
+
justify-content: center;
|
| 97 |
+
font-weight: bold;
|
| 98 |
+
font-size: 14px;
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
.user .avatar {
|
| 102 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 103 |
+
color: white;
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
.assistant .avatar {
|
| 107 |
+
background: #28a745;
|
| 108 |
+
color: white;
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
+
.input-container {
|
| 112 |
+
padding: 20px;
|
| 113 |
+
background: white;
|
| 114 |
+
border-top: 1px solid #e1e5e9;
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
.input-form {
|
| 118 |
+
display: flex;
|
| 119 |
+
gap: 10px;
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
.message-input {
|
| 123 |
+
flex: 1;
|
| 124 |
+
padding: 12px 16px;
|
| 125 |
+
border: 2px solid #e1e5e9;
|
| 126 |
+
border-radius: 25px;
|
| 127 |
+
font-size: 14px;
|
| 128 |
+
outline: none;
|
| 129 |
+
transition: border-color 0.3s;
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
.message-input:focus {
|
| 133 |
+
border-color: #667eea;
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
.send-button {
|
| 137 |
+
padding: 12px 24px;
|
| 138 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 139 |
+
color: white;
|
| 140 |
+
border: none;
|
| 141 |
+
border-radius: 25px;
|
| 142 |
+
cursor: pointer;
|
| 143 |
+
font-weight: bold;
|
| 144 |
+
transition: transform 0.2s;
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
.send-button:hover {
|
| 148 |
+
transform: translateY(-2px);
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
+
.send-button:disabled {
|
| 152 |
+
opacity: 0.6;
|
| 153 |
+
cursor: not-allowed;
|
| 154 |
+
transform: none;
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
.typing-indicator {
|
| 158 |
+
display: none;
|
| 159 |
+
padding: 12px 16px;
|
| 160 |
+
background: white;
|
| 161 |
+
border: 1px solid #e1e5e9;
|
| 162 |
+
border-radius: 18px;
|
| 163 |
+
border-bottom-left-radius: 4px;
|
| 164 |
+
color: #666;
|
| 165 |
+
font-style: italic;
|
| 166 |
+
}
|
| 167 |
+
|
| 168 |
+
.stats {
|
| 169 |
+
position: fixed;
|
| 170 |
+
top: 20px;
|
| 171 |
+
right: 20px;
|
| 172 |
+
background: white;
|
| 173 |
+
padding: 15px;
|
| 174 |
+
border-radius: 10px;
|
| 175 |
+
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
|
| 176 |
+
font-size: 12px;
|
| 177 |
+
max-width: 200px;
|
| 178 |
+
}
|
| 179 |
+
|
| 180 |
+
.stats h3 {
|
| 181 |
+
margin-bottom: 10px;
|
| 182 |
+
color: #667eea;
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
.stats p {
|
| 186 |
+
margin-bottom: 5px;
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
@media (max-width: 768px) {
|
| 190 |
+
.chat-container {
|
| 191 |
+
width: 95%;
|
| 192 |
+
height: 90vh;
|
| 193 |
+
}
|
| 194 |
+
|
| 195 |
+
.stats {
|
| 196 |
+
position: static;
|
| 197 |
+
margin: 10px;
|
| 198 |
+
max-width: none;
|
| 199 |
+
}
|
| 200 |
+
}
|
| 201 |
+
</style>
|
| 202 |
+
</head>
|
| 203 |
+
<body>
|
| 204 |
+
<div class="stats" id="stats">
|
| 205 |
+
<h3>π Stats</h3>
|
| 206 |
+
<p>Loading...</p>
|
| 207 |
+
</div>
|
| 208 |
+
|
| 209 |
+
<div class="chat-container">
|
| 210 |
+
<div class="header">
|
| 211 |
+
<h1>π€ Textilindo AI Assistant</h1>
|
| 212 |
+
<p>Powered by Novita AI β’ Ask me anything about Textilindo!</p>
|
| 213 |
+
</div>
|
| 214 |
+
|
| 215 |
+
<div class="chat-messages" id="chatMessages">
|
| 216 |
+
<div class="message assistant">
|
| 217 |
+
<div class="avatar">AI</div>
|
| 218 |
+
<div class="message-content">
|
| 219 |
+
Halo! Saya adalah AI Assistant Textilindo. Ada yang bisa saya bantu? π
|
| 220 |
+
</div>
|
| 221 |
+
</div>
|
| 222 |
+
</div>
|
| 223 |
+
|
| 224 |
+
<div class="typing-indicator" id="typingIndicator">
|
| 225 |
+
AI sedang mengetik...
|
| 226 |
+
</div>
|
| 227 |
+
|
| 228 |
+
<div class="input-container">
|
| 229 |
+
<form class="input-form" id="chatForm">
|
| 230 |
+
<input type="text" class="message-input" id="messageInput"
|
| 231 |
+
placeholder="Ketik pertanyaan Anda di sini..." autocomplete="off">
|
| 232 |
+
<button type="submit" class="send-button" id="sendButton">
|
| 233 |
+
Kirim
|
| 234 |
+
</button>
|
| 235 |
+
</form>
|
| 236 |
+
</div>
|
| 237 |
+
</div>
|
| 238 |
+
|
| 239 |
+
<script>
|
| 240 |
+
const chatMessages = document.getElementById('chatMessages');
|
| 241 |
+
const messageInput = document.getElementById('messageInput');
|
| 242 |
+
const sendButton = document.getElementById('sendButton');
|
| 243 |
+
const chatForm = document.getElementById('chatForm');
|
| 244 |
+
const typingIndicator = document.getElementById('typingIndicator');
|
| 245 |
+
const stats = document.getElementById('stats');
|
| 246 |
+
|
| 247 |
+
// Load stats
|
| 248 |
+
fetch('/stats')
|
| 249 |
+
.then(response => response.json())
|
| 250 |
+
.then(data => {
|
| 251 |
+
if (data.error) {
|
| 252 |
+
stats.innerHTML = '<h3>π Stats</h3><p>Error loading stats</p>';
|
| 253 |
+
} else {
|
| 254 |
+
stats.innerHTML = `
|
| 255 |
+
<h3>π Stats</h3>
|
| 256 |
+
<p>π ${data.total_examples} examples</p>
|
| 257 |
+
<p>π€ ${data.model.split('/').pop()}</p>
|
| 258 |
+
<p>π ${Object.keys(data.topics).length} topics</p>
|
| 259 |
+
`;
|
| 260 |
+
}
|
| 261 |
+
})
|
| 262 |
+
.catch(error => {
|
| 263 |
+
stats.innerHTML = '<h3>π Stats</h3><p>Error loading stats</p>';
|
| 264 |
+
});
|
| 265 |
+
|
| 266 |
+
function addMessage(content, isUser = false) {
|
| 267 |
+
const messageDiv = document.createElement('div');
|
| 268 |
+
messageDiv.className = `message ${isUser ? 'user' : 'assistant'}`;
|
| 269 |
+
|
| 270 |
+
const avatar = document.createElement('div');
|
| 271 |
+
avatar.className = 'avatar';
|
| 272 |
+
avatar.textContent = isUser ? 'U' : 'AI';
|
| 273 |
+
|
| 274 |
+
const messageContent = document.createElement('div');
|
| 275 |
+
messageContent.className = 'message-content';
|
| 276 |
+
messageContent.textContent = content;
|
| 277 |
+
|
| 278 |
+
messageDiv.appendChild(avatar);
|
| 279 |
+
messageDiv.appendChild(messageContent);
|
| 280 |
+
|
| 281 |
+
chatMessages.appendChild(messageDiv);
|
| 282 |
+
chatMessages.scrollTop = chatMessages.scrollHeight;
|
| 283 |
+
}
|
| 284 |
+
|
| 285 |
+
function showTyping() {
|
| 286 |
+
typingIndicator.style.display = 'block';
|
| 287 |
+
chatMessages.scrollTop = chatMessages.scrollHeight;
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
+
function hideTyping() {
|
| 291 |
+
typingIndicator.style.display = 'none';
|
| 292 |
+
}
|
| 293 |
+
|
| 294 |
+
async function sendMessage(message) {
|
| 295 |
+
if (!message.trim()) return;
|
| 296 |
+
|
| 297 |
+
// Add user message
|
| 298 |
+
addMessage(message, true);
|
| 299 |
+
messageInput.value = '';
|
| 300 |
+
|
| 301 |
+
// Show typing indicator
|
| 302 |
+
showTyping();
|
| 303 |
+
|
| 304 |
+
try {
|
| 305 |
+
const response = await fetch('/chat', {
|
| 306 |
+
method: 'POST',
|
| 307 |
+
headers: {
|
| 308 |
+
'Content-Type': 'application/json',
|
| 309 |
+
},
|
| 310 |
+
body: JSON.stringify({ message: message })
|
| 311 |
+
});
|
| 312 |
+
|
| 313 |
+
const data = await response.json();
|
| 314 |
+
|
| 315 |
+
// Hide typing indicator
|
| 316 |
+
hideTyping();
|
| 317 |
+
|
| 318 |
+
// Add AI response
|
| 319 |
+
addMessage(data.response);
|
| 320 |
+
|
| 321 |
+
} catch (error) {
|
| 322 |
+
hideTyping();
|
| 323 |
+
addMessage('Maaf, terjadi kesalahan. Silakan coba lagi.');
|
| 324 |
+
console.error('Error:', error);
|
| 325 |
+
}
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
chatForm.addEventListener('submit', (e) => {
|
| 329 |
+
e.preventDefault();
|
| 330 |
+
const message = messageInput.value.trim();
|
| 331 |
+
if (message) {
|
| 332 |
+
sendMessage(message);
|
| 333 |
+
}
|
| 334 |
+
});
|
| 335 |
+
|
| 336 |
+
messageInput.addEventListener('keypress', (e) => {
|
| 337 |
+
if (e.key === 'Enter' && !e.shiftKey) {
|
| 338 |
+
e.preventDefault();
|
| 339 |
+
const message = messageInput.value.trim();
|
| 340 |
+
if (message) {
|
| 341 |
+
sendMessage(message);
|
| 342 |
+
}
|
| 343 |
+
}
|
| 344 |
+
});
|
| 345 |
+
|
| 346 |
+
// Focus input on load
|
| 347 |
+
messageInput.focus();
|
| 348 |
+
</script>
|
| 349 |
+
</body>
|
| 350 |
+
</html>
|