File size: 3,621 Bytes
8eb5ebd
 
 
 
 
7327eb7
 
 
8eb5ebd
 
 
 
 
 
 
 
7327eb7
8eb5ebd
 
 
 
 
 
 
 
 
 
 
7327eb7
8eb5ebd
 
 
 
 
 
 
 
 
7327eb7
8eb5ebd
 
 
 
7327eb7
8eb5ebd
 
 
 
 
 
 
7327eb7
 
 
 
 
 
 
8eb5ebd
 
 
 
7327eb7
8eb5ebd
 
 
 
31a92f8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import os
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import pipeline

# 🔧 نخلي الكاش في فولدر قابل للكتابة
os.environ["HF_HOME"] = "/data"
os.environ["TRANSFORMERS_CACHE"] = "/data/cache"

app = FastAPI(
    title="📖 حكايتي - API",
    description="مولد قصص للأطفال"
)

MODEL_REPO = "Reem1/hakayti-merged"

# مثال توضيحي few-shot
few_shot_example = """<s>[User]: اسمي كريم وأحب الفضاء. 
اكتب لي قصة طويلة للأطفال (40 جملة على الأقل) مكتوبة بأسلوب قصصي ممتع.
[Assistant]:
كريم كان يحب النظر إلى السماء كل ليلة. كان يجلس في شرفة بيته، يراقب النجوم ويعدها واحدة تلو الأخرى. أحيانًا كان يتخيل أن النجوم مثل مصابيح صغيرة تضيء له الطريق نحو أحلامه الكبيرة.  
في المدرسة، لاحظ المعلم شغف كريم بالفضاء. أعطاه كتابًا مليئًا بالصور الملونة للكواكب والأقمار. انبهر كريم عندما رأى صور كوكب زحل وحلقاته اللامعة، وأخذ يتخيل نفسه يطير حوله.  
قرر كريم أن يصنع نموذجًا صغيرًا للمجموعة الشمسية. جمع كرات صغيرة وطلّاها بالألوان: الأزرق للأرض، الأحمر للمريخ، والأصفر للشمس. علّقها بخيوط في غرفته، فصارت كأنها سماء صغيرة يعيش فيها.  
في أحد الأيام، أعلنت المدرسة عن مسابقة للرسم بعنوان "رحلة إلى الفضاء". رسم كريم لوحة كبيرة يظهر فيها صاروخ ينطلق من الأرض، وحوله أطفال يلوّحون بأيديهم. فاز كريم بالجائزة الأولى، وكان سعيدًا جدًا لأن حلمه بالفضاء أصبح أقرب مما يتخيل.  
في المساء، جلس كريم مع والده على سطح المنزل. أشار والده إلى القمر وقال: "تخيّل يا كريم أن العلماء يدرسون الآن كيف يعيش الناس يومًا ما في الفضاء". ابتسم كريم وأجاب: "سأكون أنا واحدًا منهم".  
وهكذا تعلم كريم أن الحلم يبدأ بخطوة صغيرة، وأن حب المعرفة يمكن أن يفتح له أبوابًا واسعة نحو المستقبل.
</s>"""

# تحميل الموديل مرة واحدة
pipe = pipeline(
    "text-generation",
    model=MODEL_REPO,
    tokenizer=MODEL_REPO,
    max_new_tokens=900,
    temperature=0.9,
    top_p=0.95
)

# body request
class StoryRequest(BaseModel):
    name: str
    hobby: str

# مولد القصة
def generate_story(name, hobby):
    prompt = f"""{few_shot_example}
[User]: اسمي {name} وأحب {hobby}. 
اكتب لي قصة طويلة للأطفال (40 جملة على الأقل) مكتوبة بنفس الأسلوب السابق،
وتأكد أن القصة كلها تدور حول {hobby} فقط.
[Assistant]:"""

    out = pipe(
        prompt,
        max_new_tokens=900,
        temperature=0.9,
        top_p=0.95,
        do_sample=True
    )
    full_text = out[0]["generated_text"]
    story = full_text.split("[Assistant]:")[-1].replace("</s>", "").strip()
    return story

# API endpoint
@app.post("/generate")
def generate_story_api(req: StoryRequest):
    story = generate_story(req.name, req.hobby)
    return {"story": story}