Files
aragrp/components/playground/mock-ai.ts
T
alirez.brandCursor a47ec493c5 feat: add version history drawer with release notes
Introduce a footer-triggered Version History drawer with categorized release notes, hardcoded release data, and semver tracking at v0.3.0. Also ships blog blockquote/table styling, site-wide typography, home page image updates, header refinements, and related bug fixes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 02:46:20 +03:30

57 lines
2.8 KiB
TypeScript

import type { ChatMessage, SendMessageOptions } from "./types";
const MOCK_RESPONSES = [
"درخواست شما دریافت شد. این پاسخ آزمایشی است و پس از اتصال به سرویس واقعی، خروجی دقیق‌تری دریافت خواهید کرد.",
"بر اساس متن ارسالی، می‌توانم یک خلاصه کوتاه ارائه دهم. در نسخه فعلی، این بخش به‌صورت شبیه‌سازی‌شده پاسخ می‌دهد.",
"سناریوی انتخاب‌شده برای آزمایش مناسب است. می‌توانید تنظیمات مدل و حالت پاسخ را از پنل کناری تغییر دهید.",
];
function pickMockResponse(userText: string): string {
const lower = userText.toLowerCase();
if (lower.includes("خلاصه") || lower.includes("summary")) {
return "خلاصه آزمایشی: متن شما شامل چند نکته کلیدی است که می‌توان آن‌ها را در قالب گزارش کوتاه ارائه داد. پس از اتصال API، این بخش با مدل واقعی تکمیل می‌شود.";
}
if (lower.includes("ایمیل") || lower.includes("email")) {
return "پیش‌نویس ایمیل آزمایشی:\n\nبا سلام و احترام،\n\nاز پیام شما سپاسگزاریم. در حال بررسی درخواست هستیم و به‌زودی پاسخ کامل ارسال خواهد شد.\n\nبا تشکر";
}
if (lower.includes("پشتیبانی") || lower.includes("مشتری")) {
return "پاسخ پیشنهادی پشتیبانی: مشکل شما ثبت شد. لطفاً شماره پیگیری را نگه دارید. تیم ما در اسرع وقت با شما تماس خواهد گرفت.";
}
const index = userText.length % MOCK_RESPONSES.length;
return MOCK_RESPONSES[index]!;
}
function delay(ms: number, signal?: AbortSignal): Promise<void> {
return new Promise((resolve, reject) => {
const timer = setTimeout(resolve, ms);
signal?.addEventListener("abort", () => {
clearTimeout(timer);
reject(new DOMException("Aborted", "AbortError"));
});
});
}
/**
* Mock AI handler — swap this function body for a real API call later.
* Example future signature: POST /api/playground/chat with messages + options.
*/
export async function sendMessageToAI(
messages: ChatMessage[],
options?: SendMessageOptions
): Promise<string> {
const lastUserMessage = [...messages].reverse().find((m) => m.role === "user");
const userText = lastUserMessage?.content ?? "";
const baseDelay = 700 + Math.min(userText.length * 8, 1200);
const temperature = options?.settings?.temperature ?? 0.7;
const adjustedDelay = Math.round(baseDelay * (0.8 + temperature * 0.4));
await delay(adjustedDelay, options?.signal);
return pickMockResponse(userText);
}