chat
This commit is contained in:
@@ -0,0 +1,371 @@
|
|||||||
|
# Frontend WebSocket Chatbot Implementation Prompt
|
||||||
|
|
||||||
|
Create a modern, responsive frontend application for a real-time chatbot system using Socket.IO. The chatbot is designed for an Electrical Power Panels (تابلو برق) e-commerce platform that provides product guidance in Persian/Farsi.
|
||||||
|
|
||||||
|
## Technical Requirements
|
||||||
|
|
||||||
|
### 1. WebSocket Connection Setup
|
||||||
|
|
||||||
|
- **Connection Path**: `/ws-chatbot`
|
||||||
|
- **Library**: Use Socket.IO client library (socket.io-client)
|
||||||
|
- **Connection Options**:
|
||||||
|
- Support both authenticated (with JWT token) and anonymous connections
|
||||||
|
- Token can be provided via:
|
||||||
|
- Query parameter: `?token=YOUR_JWT_TOKEN`
|
||||||
|
- Authorization header: `Authorization: Bearer YOUR_JWT_TOKEN`
|
||||||
|
- For anonymous users, the system uses a ULID stored in cookies (`chatbot_session_id`)
|
||||||
|
- CORS is enabled with credentials support
|
||||||
|
|
||||||
|
### 2. WebSocket Events to Implement
|
||||||
|
|
||||||
|
#### Connection Events
|
||||||
|
- `connect` - Socket connected successfully
|
||||||
|
- `disconnect` - Socket disconnected
|
||||||
|
- `connection_failed` - Connection failed
|
||||||
|
|
||||||
|
#### Authentication Events
|
||||||
|
- **Emit**: `authenticate` (if using token-based auth)
|
||||||
|
- **Listen**: `authenticated` - Authentication successful
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"message": "authenticated",
|
||||||
|
"userId": "user_id",
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- **Listen**: `unauthorized` - Authentication failed
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"message": "error_message",
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Session Management Events
|
||||||
|
- **Emit**: `create_session` - Create a new chat session
|
||||||
|
- **Listen**: `session_created` - Session created successfully
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"id": "session_ulid",
|
||||||
|
"status": "active",
|
||||||
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"lastMessageAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"messages": []
|
||||||
|
},
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Emit**: `join_chat` - Join an existing chat session (pass sessionId as string)
|
||||||
|
- **Listen**: `chat_joined` - Successfully joined chat session
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"id": "session_ulid",
|
||||||
|
"status": "active",
|
||||||
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"lastMessageAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"id": "message_ulid",
|
||||||
|
"content": "message content",
|
||||||
|
"type": "user" | "bot" | "system",
|
||||||
|
"status": "sent" | "delivered" | "read" | "failed",
|
||||||
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"responseToId": "optional_message_id",
|
||||||
|
"metadata": {},
|
||||||
|
"tokensUsed": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Emit**: `leave_chat` - Leave a chat session (pass sessionId as string)
|
||||||
|
- **Listen**: `chat_left` - Successfully left chat session
|
||||||
|
|
||||||
|
#### Message Events
|
||||||
|
- **Emit**: `send_message` - Send a regular message
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"content": "user message text",
|
||||||
|
"sessionId": "session_ulid",
|
||||||
|
"responseToId": "optional_message_id_to_reply_to",
|
||||||
|
"metadata": {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Emit**: `send_message_stream` - Send a message and receive streaming response
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"content": "user message text",
|
||||||
|
"sessionId": "session_ulid",
|
||||||
|
"responseToId": "optional_message_id_to_reply_to",
|
||||||
|
"metadata": {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Listen**: `message_received` - User message received and saved
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"id": "message_ulid",
|
||||||
|
"content": "message content",
|
||||||
|
"type": "user",
|
||||||
|
"status": "sent",
|
||||||
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"responseToId": null,
|
||||||
|
"metadata": {},
|
||||||
|
"tokensUsed": 0
|
||||||
|
},
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Streaming Response Events (for `send_message_stream`)
|
||||||
|
- **Listen**: `bot_response_start` - Bot started generating response
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"userMessageId": "message_ulid"
|
||||||
|
},
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Listen**: `bot_response_chunk` - Receive a chunk of bot response (streaming)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"chunk": "partial text chunk",
|
||||||
|
"userMessageId": "message_ulid"
|
||||||
|
},
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Listen**: `bot_response_end` - Bot finished generating response
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"userMessageId": "message_ulid",
|
||||||
|
"fullResponse": "complete bot response text"
|
||||||
|
},
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Non-Streaming Bot Response (for `send_message`)
|
||||||
|
- **Listen**: `bot_response` - Complete bot response received
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"id": "message_ulid",
|
||||||
|
"content": "complete bot response",
|
||||||
|
"type": "bot",
|
||||||
|
"status": "sent",
|
||||||
|
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||||
|
"responseToId": "user_message_ulid",
|
||||||
|
"metadata": {
|
||||||
|
"confidence": 0.95,
|
||||||
|
"sources": [],
|
||||||
|
"llmContext": {}
|
||||||
|
},
|
||||||
|
"tokensUsed": 150
|
||||||
|
},
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Typing Indicators
|
||||||
|
- **Emit**: `typing_start` - User started typing (pass sessionId as string)
|
||||||
|
- **Emit**: `typing_stop` - User stopped typing (pass sessionId as string)
|
||||||
|
- **Listen**: `typing_start` - Another user started typing
|
||||||
|
- **Listen**: `typing_stop` - Another user stopped typing
|
||||||
|
|
||||||
|
#### User Presence Events
|
||||||
|
- **Listen**: `user_joined` - Another user joined the session
|
||||||
|
- **Listen**: `user_left` - Another user left the session
|
||||||
|
|
||||||
|
#### Error Events
|
||||||
|
- **Listen**: `error` - General error
|
||||||
|
- **Listen**: `websocket_error` - WebSocket connection error
|
||||||
|
- **Listen**: `session_error` - Session-related error
|
||||||
|
- **Listen**: `message_error` - Message-related error
|
||||||
|
|
||||||
|
All error events follow this format:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "error",
|
||||||
|
"message": "error message",
|
||||||
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. REST API Endpoints (Optional - for session management)
|
||||||
|
|
||||||
|
The backend also provides REST endpoints that can be used for session management:
|
||||||
|
|
||||||
|
- `POST /chatbot/sessions` - Create a new chat session
|
||||||
|
- `GET /chatbot/sessions?limit=10` - Get user's chat sessions (paginated)
|
||||||
|
- `GET /chatbot/sessions/:sessionId` - Get a specific chat session with messages
|
||||||
|
- `POST /chatbot/messages` - Send a message (non-streaming)
|
||||||
|
- `POST /chatbot/messages/stream` - Send a message and get Server-Sent Events (SSE) streaming
|
||||||
|
- `PUT /chatbot/sessions/:sessionId/close` - Close a chat session
|
||||||
|
- `PUT /chatbot/sessions/:sessionId/messages/read` - Mark messages as read
|
||||||
|
|
||||||
|
### 4. UI/UX Requirements
|
||||||
|
|
||||||
|
#### Design
|
||||||
|
- Modern, clean, and responsive design
|
||||||
|
- Support for Persian/Farsi (RTL) text direction
|
||||||
|
- Mobile-first approach with desktop support
|
||||||
|
- Dark mode support (optional but recommended)
|
||||||
|
- Smooth animations and transitions
|
||||||
|
|
||||||
|
#### Chat Interface Components
|
||||||
|
|
||||||
|
1. **Session List Sidebar** (optional)
|
||||||
|
- List of all chat sessions
|
||||||
|
- Show last message preview
|
||||||
|
- Show unread message count
|
||||||
|
- Show session status (active/closed)
|
||||||
|
- Create new session button
|
||||||
|
|
||||||
|
2. **Chat Window**
|
||||||
|
- Message list with scroll-to-bottom functionality
|
||||||
|
- Message bubbles:
|
||||||
|
- User messages: Right-aligned (or left in RTL), distinct styling
|
||||||
|
- Bot messages: Left-aligned (or right in RTL), distinct styling
|
||||||
|
- System messages: Centered, muted styling
|
||||||
|
- Show message timestamps (relative or absolute)
|
||||||
|
- Show message status indicators (sent, delivered, read, failed)
|
||||||
|
- Support for message replies (if responseToId is provided)
|
||||||
|
- Markdown rendering for bot messages (if applicable)
|
||||||
|
- Copy message functionality
|
||||||
|
|
||||||
|
3. **Input Area**
|
||||||
|
- Text input field with character counter (max 2000 characters)
|
||||||
|
- Send button
|
||||||
|
- Support for Enter key to send (Shift+Enter for new line)
|
||||||
|
- Typing indicator display
|
||||||
|
- File upload support (if needed in future)
|
||||||
|
- Emoji picker (optional)
|
||||||
|
|
||||||
|
4. **Streaming Response Display**
|
||||||
|
- Show typing indicator when `bot_response_start` is received
|
||||||
|
- Display streaming text character-by-character or word-by-word as chunks arrive
|
||||||
|
- Smooth animation for streaming text
|
||||||
|
- Show completion when `bot_response_end` is received
|
||||||
|
- Handle errors gracefully during streaming
|
||||||
|
|
||||||
|
5. **Connection Status**
|
||||||
|
- Visual indicator for connection status (connected/disconnected/reconnecting)
|
||||||
|
- Auto-reconnect functionality with exponential backoff
|
||||||
|
- Show connection errors to user
|
||||||
|
|
||||||
|
6. **Error Handling**
|
||||||
|
- Display user-friendly error messages
|
||||||
|
- Retry mechanisms for failed operations
|
||||||
|
- Toast notifications for errors
|
||||||
|
- Persian/Farsi error messages
|
||||||
|
|
||||||
|
#### Features
|
||||||
|
|
||||||
|
- **Real-time Updates**: All messages should appear in real-time
|
||||||
|
- **Message Persistence**: Load previous messages when joining a session
|
||||||
|
- **Auto-scroll**: Automatically scroll to bottom when new messages arrive
|
||||||
|
- **Typing Indicators**: Show when bot is generating response
|
||||||
|
- **Message Status**: Display sent/delivered/read status for user messages
|
||||||
|
- **Session Management**: Create, join, leave, and close sessions
|
||||||
|
- **Responsive Design**: Works on mobile, tablet, and desktop
|
||||||
|
- **Accessibility**: WCAG 2.1 AA compliance
|
||||||
|
- **Performance**: Optimize for smooth scrolling with many messages (virtual scrolling if needed)
|
||||||
|
|
||||||
|
### 5. State Management
|
||||||
|
|
||||||
|
Implement proper state management for:
|
||||||
|
- WebSocket connection state
|
||||||
|
- Current active session
|
||||||
|
- Message list for current session
|
||||||
|
- Session list
|
||||||
|
- Typing indicators
|
||||||
|
- Connection status
|
||||||
|
- Error states
|
||||||
|
|
||||||
|
### 6. Technical Stack Recommendations
|
||||||
|
|
||||||
|
- **Framework**: React, Vue, or Angular (your choice)
|
||||||
|
- **State Management**: Redux, Zustand, Pinia, or Context API
|
||||||
|
- **WebSocket**: socket.io-client
|
||||||
|
- **Styling**: Tailwind CSS, Material-UI, or styled-components
|
||||||
|
- **Icons**: React Icons, Heroicons, or similar
|
||||||
|
- **Date Formatting**: date-fns or moment.js
|
||||||
|
- **HTTP Client**: Axios or fetch API
|
||||||
|
- **Build Tool**: Vite, Create React App, or Next.js
|
||||||
|
|
||||||
|
### 7. Implementation Notes
|
||||||
|
|
||||||
|
- Handle reconnection automatically
|
||||||
|
- Store ULID in cookies for anonymous users
|
||||||
|
- Implement proper cleanup on component unmount
|
||||||
|
- Debounce typing indicators (send `typing_stop` after 3 seconds of inactivity)
|
||||||
|
- Implement message queuing for offline scenarios
|
||||||
|
- Add loading states for all async operations
|
||||||
|
- Implement proper error boundaries
|
||||||
|
- Add analytics/tracking (optional)
|
||||||
|
- Support for keyboard shortcuts (optional)
|
||||||
|
|
||||||
|
### 8. Testing Requirements
|
||||||
|
|
||||||
|
- Unit tests for WebSocket event handlers
|
||||||
|
- Integration tests for message flow
|
||||||
|
- E2E tests for critical user flows
|
||||||
|
- Test reconnection scenarios
|
||||||
|
- Test error handling
|
||||||
|
- Test streaming response display
|
||||||
|
|
||||||
|
### 9. Additional Features (Optional)
|
||||||
|
|
||||||
|
- Message search within a session
|
||||||
|
- Export chat history
|
||||||
|
- Share session link
|
||||||
|
- Voice input (speech-to-text)
|
||||||
|
- Message reactions
|
||||||
|
- Rich text formatting in messages
|
||||||
|
- Product cards/embeds in bot responses
|
||||||
|
- Quick reply buttons
|
||||||
|
|
||||||
|
### 10. Example Flow
|
||||||
|
|
||||||
|
1. User opens the application
|
||||||
|
2. Application connects to WebSocket (`/ws-chatbot`)
|
||||||
|
3. If authenticated, token is sent; otherwise, ULID is used from cookie or generated
|
||||||
|
4. User creates a new session or joins an existing one
|
||||||
|
5. Previous messages are loaded and displayed
|
||||||
|
6. User types a message and sends it
|
||||||
|
7. Message appears immediately in the chat
|
||||||
|
8. Bot response starts streaming (if using streaming) or arrives as complete message
|
||||||
|
9. User can continue the conversation
|
||||||
|
10. Connection is maintained and auto-reconnects if dropped
|
||||||
|
|
||||||
|
## Deliverables
|
||||||
|
|
||||||
|
Create a complete, production-ready frontend application with:
|
||||||
|
- Clean, maintainable code structure
|
||||||
|
- Comprehensive error handling
|
||||||
|
- Responsive design
|
||||||
|
- Real-time WebSocket integration
|
||||||
|
- TypeScript support (recommended)
|
||||||
|
- Documentation and comments
|
||||||
|
- README with setup instructions
|
||||||
|
|
||||||
@@ -4,280 +4,62 @@ export const CHATBOT_CONSTANTS = {
|
|||||||
DEFAULT_MAX_TOKENS: 2000,
|
DEFAULT_MAX_TOKENS: 2000,
|
||||||
MAX_CONVERSATION_HISTORY: 20,
|
MAX_CONVERSATION_HISTORY: 20,
|
||||||
|
|
||||||
// General system prompt focused on company guidance
|
// General system prompt focused on Electrical Power Panels product guidance
|
||||||
SYSTEM_PROMPT: `شما یک دستیار هوشمند AI برای پلتفرم DZone هستید که در راهنمایی کاربران درباره شرکتها و صنایع تخصص دارید. شما باید تمامی پاسخها را به زبان فارسی ارائه دهید.
|
SYSTEM_PROMPT: `شما یک دستیار هوشمند AI برای پلتفرم فجر تابلو مرکزی هستید که در راهنمایی کاربران برای یافتن و انتخاب تابلوهای برق (Electrical Power Panels) تخصص دارید. شما باید تمامی پاسخها را به زبان فارسی ارائه دهید.
|
||||||
|
|
||||||
## وظایف اصلی شما:
|
## وظایف اصلی شما:
|
||||||
🏢 **راهنمایی شرکتها**: کمک به کاربران برای یافتن شرکتهای مناسب و اطلاعات تماس آنها
|
⚡ **راهنمایی محصولات تابلو برق**: کمک به کاربران برای یافتن تابلوهای برق مناسب بر اساس نیازهایشان
|
||||||
🏭 **معرفی صنایع**: ارائه اطلاعات کامل درباره صنایع مختلف و شرکتهای فعال در هر حوزه
|
🔌 **مشاوره فنی**: ارائه اطلاعات فنی درباره انواع تابلوهای برق، ظرفیت، ولتاژ و مشخصات
|
||||||
💼 **محصولات و خدمات**: راهنمایی درباره محصولات و خدمات ارائه شده توسط شرکتها
|
🏭 **معرفی تولیدکنندگان**: معرفی شرکتهای تولیدکننده تابلو برق و محصولات آنها
|
||||||
🔍 **جستجو و مقایسه**: کمک به انتخاب بهترین شرکت برای نیازهای خاص کاربران
|
💡 **مشاوره انتخاب**: کمک به انتخاب بهترین تابلو برق بر اساس کاربرد، ظرفیت و بودجه
|
||||||
📞 **اطلاعات تماس**: ارائه اطلاعات کامل تماس شامل تلفن، ایمیل و آدرس شرکتها
|
📋 **مشخصات فنی**: ارائه جزئیات کامل فنی شامل ولتاژ، جریان، ابعاد، استانداردها و گواهینامهها
|
||||||
|
📞 **اطلاعات تماس**: ارائه اطلاعات تماس تولیدکنندگان و فروشندگان
|
||||||
|
|
||||||
|
## انواع تابلوهای برق که باید درباره آنها اطلاعات داشته باشید:
|
||||||
|
🔹 **تابلو برق فشار ضعیف (LV Panel)**: برای مصارف خانگی، تجاری و صنعتی
|
||||||
|
🔹 **تابلو برق فشار متوسط (MV Panel)**: برای شبکههای توزیع برق
|
||||||
|
🔹 **تابلو برق کنترل و فرمان**: برای کنترل موتورها و سیستمهای اتوماسیون
|
||||||
|
🔹 **تابلو برق توزیع**: برای توزیع برق در ساختمانها و کارخانهها
|
||||||
|
🔹 **تابلو برق خازنی**: برای اصلاح ضریب توان
|
||||||
|
🔹 **تابلو برق UPS**: برای سیستمهای برق اضطراری
|
||||||
|
🔹 **تابلو برق روشنایی**: برای کنترل روشنایی
|
||||||
|
🔹 **تابلو برق آسانسور**: برای سیستمهای آسانسور
|
||||||
|
|
||||||
|
## اطلاعات مهم برای راهنمایی کاربران:
|
||||||
|
✅ **ولتاژ کاری**: 220V, 380V, 400V, 6.6kV, 11kV, 20kV و غیره
|
||||||
|
✅ **جریان نامی**: آمپر مورد نیاز (از 10A تا چند هزار آمپر)
|
||||||
|
✅ **نوع نصب**: دیواری، ایستاده، توکار، روکار
|
||||||
|
✅ **درجه حفاظت**: IP54, IP65, IP66 و غیره
|
||||||
|
✅ **استانداردها**: IEC, VDE, DIN, IEEE و استانداردهای ملی
|
||||||
|
✅ **کاربرد**: مسکونی، تجاری، صنعتی، بیمارستانی، دیتاسنتر
|
||||||
|
✅ **ابعاد و ابعاد**: اندازه فیزیکی مناسب برای محل نصب
|
||||||
|
✅ **قابلیتهای اضافی**: سیستمهای مانیتورینگ، SCADA، کنترل از راه دور
|
||||||
|
|
||||||
## اصول پاسخگویی:
|
## اصول پاسخگویی:
|
||||||
✅ همیشه به زبان فارسی پاسخ دهید
|
✅ همیشه به زبان فارسی پاسخ دهید
|
||||||
✅ از اطلاعات پایگاه داده شرکتها و صنایع برای پاسخهای دقیق استفاده کنید
|
✅ از اطلاعات پایگاه داده محصولات و شرکتها برای پاسخهای دقیق استفاده کنید
|
||||||
✅ در صورت سوال درباره شرکت خاص، اطلاعات کامل آن را ارائه دهید
|
✅ سوالات کاربر را برای درک بهتر نیازش بپرسید (ولتاژ، جریان، کاربرد، بودجه)
|
||||||
✅ همیشه اطلاعات تماس (تلفن، ایمیل، آدرس) شرکتها را اضافه کنید
|
✅ اطلاعات فنی دقیق و قابل اعتماد ارائه دهید
|
||||||
|
|
||||||
|
✅ در صورت نیاز، چند گزینه مختلف با مشخصات و قیمت ارائه دهید
|
||||||
✅ اگر چیزی نمیدانید، صادقانه اعتراف کنید و راه حل جایگزین پیشنهاد دهید
|
✅ اگر چیزی نمیدانید، صادقانه اعتراف کنید و راه حل جایگزین پیشنهاد دهید
|
||||||
✅ از ایموجیها برای بهتر کردن تجربه کاربر استفاده کنید
|
✅ از ایموجیها برای بهتر کردن تجربه کاربر استفاده کنید
|
||||||
✅ پاسخهای خود را ساختاربندی و خوانا ارائه دهید
|
✅ پاسخهای خود را ساختاربندی و خوانا ارائه دهید
|
||||||
|
|
||||||
## قالب پاسخ برای شرکتها:
|
## قالب پاسخ برای محصولات تابلو برق:
|
||||||
📍 **نام شرکت**: [نام کامل]
|
⚡ **نام محصول**: [نام کامل محصول]
|
||||||
📞 **تلفن**: [شماره تماس]
|
🏭 **تولیدکننده**: [نام شرکت]
|
||||||
📧 **ایمیل**: [آدرس ایمیل]
|
📊 **مشخصات فنی**:
|
||||||
🏠 **آدرس**: [آدرس کامل]
|
- ولتاژ: [مثلاً 380V]
|
||||||
🏭 **صنعت**: [نوع صنعت]
|
- جریان نامی: [مثلاً 400A]
|
||||||
💼 **محصولات/خدمات**: [فهرست محصولات و خدمات]
|
|
||||||
|
|
||||||
اگر اطلاعات شرکتها یا صنایع مربوطه از پایگاه داده در دسترس است، حتماً از آن استفاده کرده و منبع آن را مشخص کنید.`,
|
- درجه حفاظت: [مثلاً IP54]
|
||||||
|
- استاندارد: [مثلاً IEC 61439]
|
||||||
|
💼 **کاربرد**: [مثلاً صنعتی، تجاری، مسکونی]
|
||||||
|
💰 **قیمت**: [در صورت موجود بودن]
|
||||||
|
|
||||||
// New company guidance system prompt
|
|
||||||
COMPANY_GUIDANCE_SYSTEM_PROMPT: `شما یک دستیار هوشمند برای راهنمایی کاربران درباره شرکتها و صنایع موجود در پلتفرم DZone هستید.
|
|
||||||
|
|
||||||
## ماموریت شما:
|
اگر اطلاعات محصولات تابلو برق یا پایگاه داده در دسترس است، حتماً از آن استفاده کرده و منبع آن را مشخص کنید.`,
|
||||||
- راهنمایی کاربران برای یافتن شرکتهای مناسب
|
|
||||||
- ارائه اطلاعات کامل درباره شرکتها، محصولات و خدمات
|
|
||||||
- معرفی صنایع مختلف و شرکتهای فعال در هر حوزه
|
|
||||||
- کمک به انتخاب بهترین شرکت برای نیازهای کاربران
|
|
||||||
|
|
||||||
## اطلاعات شرکتها و صنایع:
|
|
||||||
{context}
|
|
||||||
|
|
||||||
## تاریخچه مکالمه:
|
|
||||||
{conversation_history}
|
|
||||||
|
|
||||||
## سوال کاربر:
|
|
||||||
{question}
|
|
||||||
|
|
||||||
## دستورالعمل پاسخ:
|
|
||||||
بر اساس اطلاعات شرکتها و صنایع موجود، پاسخی جامع و کاربردی به زبان فارسی ارائه دهید:
|
|
||||||
|
|
||||||
**نکات مهم:**
|
|
||||||
- اگر کاربر درباره شرکت خاصی سوال میپرسد، اطلاعات کامل آن شرکت (نام، آدرس، تلفن، محصولات، خدمات) را ارائه دهید
|
|
||||||
- اگر سوال درباره صنعت خاصی است، شرکتهای فعال در آن صنعت را معرفی کنید
|
|
||||||
- در صورت جستجوی محصول یا خدمت، شرکتهای مرتبط را پیشنهاد دهید
|
|
||||||
- همیشه اطلاعات تماس (تلفن، ایمیل، آدرس) شرکتها را ارائه دهید
|
|
||||||
- از ایموجیهای مناسب برای بهتر شدن خوانایی استفاده کنید
|
|
||||||
- پاسخ خود را ساختاربندی و منظم ارائه دهید
|
|
||||||
|
|
||||||
پاسخ شما:`,
|
|
||||||
|
|
||||||
// Company data templates
|
|
||||||
COMPANY_DATA_TEMPLATES: {
|
|
||||||
COMPANY_INFO: `نام شرکت: {name}
|
|
||||||
مدیر عامل: {ceo}
|
|
||||||
ایمیل: {email}
|
|
||||||
تلفن: {phone}
|
|
||||||
شماره ثبت: {registrationNumber}
|
|
||||||
تاریخ تاسیس: {establishmentDate}
|
|
||||||
آدرس: {address}
|
|
||||||
وبسایت: {website}
|
|
||||||
توضیحات: {description}
|
|
||||||
صنعت فعالیت: {industry}
|
|
||||||
وضعیت: {status}
|
|
||||||
کسب و کار والد: {business}
|
|
||||||
|
|
||||||
این شرکت در پلتفرم DZone ثبت شده و آماده ارائه خدمات و محصولات خود به مشتریان میباشد.`,
|
|
||||||
|
|
||||||
COMPANY_PRODUCT: `محصول شرکت {companyName}:
|
|
||||||
نام محصول: {productTitle}
|
|
||||||
شرکت تولیدکننده: {companyName}
|
|
||||||
صنعت: {industry}
|
|
||||||
توضیحات شرکت: {companyDescription}
|
|
||||||
آدرس شرکت: {companyAddress}
|
|
||||||
تلفن تماس: {companyPhone}
|
|
||||||
ایمیل: {companyEmail}
|
|
||||||
|
|
||||||
این محصول توسط شرکت {companyName} در صنعت {industry} تولید و ارائه میشود.`,
|
|
||||||
|
|
||||||
COMPANY_SERVICE: `خدمات شرکت {companyName}:
|
|
||||||
نام خدمت: {serviceTitle}
|
|
||||||
شرکت ارائهدهنده: {companyName}
|
|
||||||
صنعت: {industry}
|
|
||||||
توضیحات شرکت: {companyDescription}
|
|
||||||
آدرس شرکت: {companyAddress}
|
|
||||||
تلفن تماس: {companyPhone}
|
|
||||||
ایمیل: {companyEmail}
|
|
||||||
|
|
||||||
این خدمت توسط شرکت {companyName} در صنعت {industry} ارائه میشود.`,
|
|
||||||
|
|
||||||
INDUSTRY_INFO: `صنعت: {title}
|
|
||||||
وضعیت: {status}
|
|
||||||
تعداد شرکتهای فعال: {companiesCount}
|
|
||||||
کسب و کار والد: {business}
|
|
||||||
|
|
||||||
شرکتهای فعال در این صنعت:
|
|
||||||
{companiesList}
|
|
||||||
|
|
||||||
این صنعت شامل شرکتهایی است که در حوزه {title} فعالیت میکنند و خدمات و محصولات مختلفی ارائه میدهند.`,
|
|
||||||
},
|
|
||||||
|
|
||||||
// Company guidance documents
|
|
||||||
COMPANY_GUIDANCE_DOCUMENTS: {
|
|
||||||
COMPANY_GUIDE: `راهنمای شرکتها در پلتفرم DZone:
|
|
||||||
|
|
||||||
🏢 **اطلاعات شرکتها**:
|
|
||||||
در پلتفرم DZone شرکتهای مختلفی در صنایع متنوع فعالیت میکنند. هر شرکت دارای اطلاعات کاملی شامل:
|
|
||||||
- نام و مشخصات کامل شرکت
|
|
||||||
- اطلاعات تماس (تلفن، ایمیل، آدرس)
|
|
||||||
- صنعت فعالیت و حوزه کاری
|
|
||||||
- محصولات و خدمات ارائه شده
|
|
||||||
- وضعیت فعالیت و مجوزهای لازم
|
|
||||||
|
|
||||||
💼 **محصولات و خدمات**:
|
|
||||||
هر شرکت میتواند محصولات و خدمات متنوعی ارائه دهد:
|
|
||||||
- محصولات: کالاها و تولیدات شرکت
|
|
||||||
- خدمات: سرویسها و راهکارهای ارائه شده
|
|
||||||
- اطلاعات تماس برای استعلام و سفارش
|
|
||||||
- جزئیات کامل درباره هر محصول و خدمت
|
|
||||||
|
|
||||||
🏭 **دستهبندی صنایع**:
|
|
||||||
شرکتها بر اساس صنعت فعالیت دستهبندی شدهاند:
|
|
||||||
- هر صنعت شامل شرکتهای مرتبط
|
|
||||||
- امکان جستجو بر اساس نوع صنعت
|
|
||||||
- مشاهده تمام شرکتهای یک صنعت خاص
|
|
||||||
- اطلاعات کامل درباره حوزه فعالیت`,
|
|
||||||
|
|
||||||
COMPANY_FAQ: `سوالات متداول درباره شرکتها:
|
|
||||||
|
|
||||||
❓ **چگونه اطلاعات یک شرکت را پیدا کنم؟**
|
|
||||||
میتوانید با ذکر نام شرکت یا صنعت مورد نظر، اطلاعات کامل شامل آدرس، تلفن و محصولات آن را دریافت کنید.
|
|
||||||
|
|
||||||
❓ **چه شرکتهایی در یک صنعت خاص فعالیت میکنند؟**
|
|
||||||
با ذکر نام صنعت، لیست کامل شرکتهای فعال در آن حوزه را مشاهده خواهید کرد.
|
|
||||||
|
|
||||||
❓ **چگونه با یک شرکت تماس بگیرم؟**
|
|
||||||
اطلاعات تماس شامل تلفن، ایمیل و آدرس تمام شرکتها در پلتفرم موجود است.
|
|
||||||
|
|
||||||
❓ **چه محصولات و خدماتی ارائه میشود؟**
|
|
||||||
هر شرکت لیست کاملی از محصولات و خدمات خود ارائه داده که قابل مشاهده است.
|
|
||||||
|
|
||||||
❓ **چگونه شرکت مناسب برای نیاز خودم پیدا کنم؟**
|
|
||||||
با توصیف نیاز خود یا نوع محصول/خدمت مورد نظر، شرکتهای مرتبط را معرفی خواهم کرد.`,
|
|
||||||
|
|
||||||
SEARCH_GUIDE: `راهنمای جستجو و یافتن شرکتها:
|
|
||||||
|
|
||||||
🔍 **نحوه جستجو**:
|
|
||||||
- جستجو بر اساس نام شرکت
|
|
||||||
- جستجو بر اساس نوع صنعت
|
|
||||||
- جستجو بر اساس محصول یا خدمت
|
|
||||||
- جستجو بر اساس منطقه جغرافیایی
|
|
||||||
|
|
||||||
📊 **اطلاعات قابل دریافت**:
|
|
||||||
- اطلاعات کامل شرکت (نام، آدرس، تلفن)
|
|
||||||
- لیست محصولات و توضیحات
|
|
||||||
- لیست خدمات ارائه شده
|
|
||||||
- صنعت و حوزه فعالیت
|
|
||||||
- وضعیت فعالیت شرکت
|
|
||||||
|
|
||||||
🎯 **توصیههای مفید**:
|
|
||||||
- برای یافتن شرکت مناسب، نیاز خود را واضح بیان کنید
|
|
||||||
- از کلمات کلیدی مرتبط با صنعت استفاده کنید
|
|
||||||
- در صورت نیاز، اطلاعات تماس برای پیگیری بیشتر درخواست کنید
|
|
||||||
- برای مقایسه، چندین شرکت در یک صنعت را بررسی کنید`,
|
|
||||||
|
|
||||||
INDUSTRY_GUIDE: `راهنمای صنایع و حوزههای فعالیت:
|
|
||||||
|
|
||||||
🏭 **انواع صنایع موجود**:
|
|
||||||
در پلتفرم DZone شرکتهای مختلفی در صنایع متنوع حضور دارند:
|
|
||||||
- صنایع تولیدی و ساختمانی
|
|
||||||
- خدمات فناوری اطلاعات
|
|
||||||
- صنایع غذایی و کشاورزی
|
|
||||||
- خدمات مالی و بیمه
|
|
||||||
- حمل و نقل و لجستیک
|
|
||||||
- آموزش و تربیت
|
|
||||||
- سلامت و درمان
|
|
||||||
- و سایر صنایع
|
|
||||||
|
|
||||||
💡 **مزایای دستهبندی صنعتی**:
|
|
||||||
- یافتن آسان شرکتهای مرتبط
|
|
||||||
- مقایسه خدمات در یک صنعت
|
|
||||||
- انتخاب بهترین گزینه برای نیاز شما
|
|
||||||
- دسترسی به اطلاعات تخصصی هر حوزه
|
|
||||||
|
|
||||||
📈 **نحوه استفاده**:
|
|
||||||
- ابتدا صنعت مورد نظر خود را مشخص کنید
|
|
||||||
- سپس شرکتهای فعال در آن صنعت را بررسی کنید
|
|
||||||
- محصولات و خدمات مناسب را انتخاب کنید
|
|
||||||
- برای اطلاعات بیشتر با شرکت تماس بگیرید`,
|
|
||||||
},
|
|
||||||
|
|
||||||
// Logging messages for LangChain service
|
|
||||||
LANGCHAIN_MESSAGES: {
|
|
||||||
LOADING_DATA: "Loading company and industry data for model training...",
|
|
||||||
NO_DATA_FOUND: "No data found for model training",
|
|
||||||
DOCUMENTS_SPLIT: "{totalDocs} documents split into {chunks} chunks",
|
|
||||||
VECTOR_STORE_READY: "Vector store successfully initialized - ready to guide users about companies and industries",
|
|
||||||
VECTOR_STORE_ERROR: "Error initializing vector store",
|
|
||||||
DOCUMENTS_LOADED: "{count} documents loaded from company and industry database",
|
|
||||||
LOADING_ERROR: "Error loading company and industry documents",
|
|
||||||
SERVICE_NOT_INITIALIZED: "LangChain service is not initialized",
|
|
||||||
RESPONSE_ERROR: "Error generating LangChain response",
|
|
||||||
STREAM_RESPONSE_ERROR: "Error generating LangChain stream response",
|
|
||||||
REFRESHING_VECTOR_STORE: "Refreshing vector store with new company and industry data...",
|
|
||||||
},
|
|
||||||
|
|
||||||
// Source type labels in Farsi
|
|
||||||
SOURCE_TYPE_LABELS: {
|
|
||||||
company: "شرکت",
|
|
||||||
product: "محصول",
|
|
||||||
service: "خدمت",
|
|
||||||
industry: "صنعت",
|
|
||||||
company_guide: "راهنمای شرکتها",
|
|
||||||
company_faq: "سوالات متداول",
|
|
||||||
search_guide: "راهنمای جستجو",
|
|
||||||
industry_guide: "راهنمای صنایع",
|
|
||||||
},
|
|
||||||
|
|
||||||
// Default values for missing data
|
|
||||||
DEFAULT_VALUES: {
|
|
||||||
NO_WEBSITE: "ندارد",
|
|
||||||
UNSPECIFIED: "مشخص نشده",
|
|
||||||
ACTIVE: "فعال",
|
|
||||||
INACTIVE: "غیرفعال",
|
|
||||||
},
|
|
||||||
|
|
||||||
// WEBSOCKET_EVENTS: {
|
|
||||||
// // Connection events
|
|
||||||
// CONNECT: "connect",
|
|
||||||
// DISCONNECT: "disconnect",
|
|
||||||
// CONNECTION_ERROR: "connection_failed",
|
|
||||||
|
|
||||||
// // Authentication events
|
|
||||||
// AUTHENTICATE: "authenticate",
|
|
||||||
// AUTHENTICATED: "authenticated",
|
|
||||||
// UNAUTHORIZED: "unauthorized",
|
|
||||||
|
|
||||||
// // Session events
|
|
||||||
// CREATE_SESSION: "create_session",
|
|
||||||
// SESSION_CREATED: "session_created",
|
|
||||||
// JOIN_CHAT: "join_chat",
|
|
||||||
// CHAT_JOINED: "chat_joined",
|
|
||||||
// LEAVE_CHAT: "leave_chat",
|
|
||||||
// CHAT_LEFT: "chat_left",
|
|
||||||
|
|
||||||
// // Message events
|
|
||||||
// SEND_MESSAGE: "send_message",
|
|
||||||
// MESSAGE_RECEIVED: "message_received",
|
|
||||||
// BOT_RESPONSE_START: "bot_response_start",
|
|
||||||
// BOT_RESPONSE_CHUNK: "bot_response_chunk",
|
|
||||||
// BOT_RESPONSE_END: "bot_response_end",
|
|
||||||
// BOT_RESPONSE: "bot_response",
|
|
||||||
|
|
||||||
// // Status events
|
|
||||||
// TYPING_START: "typing_start",
|
|
||||||
// TYPING_STOP: "typing_stop",
|
|
||||||
// USER_JOINED: "user_joined",
|
|
||||||
// USER_LEFT: "user_left",
|
|
||||||
|
|
||||||
// // Error events
|
|
||||||
// ERROR: "error",
|
|
||||||
// WEBSOCKET_ERROR: "websocket_error",
|
|
||||||
// SESSION_ERROR: "session_error",
|
|
||||||
// MESSAGE_ERROR: "message_error",
|
|
||||||
// },
|
|
||||||
|
|
||||||
ERROR_MESSAGES: {
|
ERROR_MESSAGES: {
|
||||||
SESSION_NOT_FOUND: "جلسه چت یافت نشد",
|
SESSION_NOT_FOUND: "جلسه چت یافت نشد",
|
||||||
|
|||||||
@@ -16,19 +16,24 @@ export class LLMService {
|
|||||||
constructor(@inject(IOCTYPES.ChatbotDataContextService) private dataContextService: DataContextService) {
|
constructor(@inject(IOCTYPES.ChatbotDataContextService) private dataContextService: DataContextService) {
|
||||||
this.logger = new Logger("LLMService");
|
this.logger = new Logger("LLMService");
|
||||||
this.config = {
|
this.config = {
|
||||||
model: process.env.OPENAI_MODEL || CHATBOT_CONSTANTS.DEFAULT_MODEL,
|
model: process.env.OPENAI_MODEL || "openai/gpt-4o-mini",
|
||||||
temperature: Number(process.env.OPENAI_TEMPERATURE || CHATBOT_CONSTANTS.DEFAULT_TEMPERATURE),
|
temperature: Number(process.env.OPENAI_TEMPERATURE || "0.7"),
|
||||||
maxTokens: Number(process.env.OPENAI_MAX_TOKENS || CHATBOT_CONSTANTS.DEFAULT_MAX_TOKENS),
|
maxTokens: Number(process.env.OPENAI_MAX_TOKENS || "2000"),
|
||||||
topP: Number(process.env.OPENAI_TOP_P || "0.95"),
|
topP: Number(process.env.OPENAI_TOP_P || "0.95"),
|
||||||
apiKey: process.env.OPENAI_API_KEY || "",
|
apiKey:
|
||||||
|
process.env.OPENAI_API_KEY ||
|
||||||
|
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiI2OTFlMzBjOGI1NDRmYzJkY2JlMTQ2MGUiLCJ0eXBlIjoiYWlfa2V5IiwiaWF0IjoxNzYzNTg2MjQ4fQ.XRMe-TVV9FXCMdueI_xbxycBLj7KJEACXYlkxv3QZrE",
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!this.config.apiKey) {
|
if (!this.config.apiKey) {
|
||||||
throw new Error("OPENAI_API_KEY is required");
|
throw new Error("OPENAI_API_KEY is required");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const baseURL = process.env.OPENAI_BASE_URL || "https://ai.liara.ir/api/v1/691e30a204c9b93ad278578b";
|
||||||
|
|
||||||
this.openai = new OpenAI({
|
this.openai = new OpenAI({
|
||||||
apiKey: this.config.apiKey,
|
apiKey: this.config.apiKey,
|
||||||
|
baseURL: baseURL,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user