1Egyb commited on
Commit
9dbab65
·
verified ·
1 Parent(s): f51d0aa

Upload 6 files

Browse files
Files changed (6) hide show
  1. Dockerfile.txt +33 -0
  2. README.md +10 -0
  3. app.py +76 -0
  4. builder.py +29 -0
  5. gitattributes.txt +35 -0
  6. requirements.txt +4 -0
Dockerfile.txt ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # [span_5](start_span)استخدام نسخة بايثون رسمية مستقرة[span_5](end_span)
2
+ FROM python:3.10-slim
3
+
4
+ # [span_6](start_span)تثبيت أدوات النظام الأساسية[span_6](end_span)
5
+ RUN apt-get update && apt-get install -y \
6
+ git \
7
+ zip \
8
+ curl \
9
+ && rm -rf /var/lib/apt/lists/*
10
+
11
+ # [span_7](start_span)إعداد مستخدم جديد لضمان الأمان في Hugging Face[span_7](end_span)
12
+ RUN useradd -m -u 1000 user
13
+ USER user
14
+ ENV PATH="/home/user/.local/bin:${PATH}"
15
+
16
+ WORKDIR /home/user/app
17
+
18
+ # [span_8](start_span)نسخ وتثبيت المتطلبات[span_8](end_span)
19
+ COPY --chown=user:user requirements.txt .
20
+ RUN pip install --no-cache-dir --upgrade pip && \
21
+ pip install --no-cache-dir -r requirements.txt
22
+
23
+ # [span_9](start_span)نسخ باقي الملفات[span_9](end_span)
24
+ COPY --chown=user:user . .
25
+
26
+ # [span_10](start_span)إنشاء مجلد sandbox وتأكيد صلاحيات الوصول[span_10](end_span)
27
+ RUN mkdir -p sandbox && chmod 777 sandbox
28
+
29
+ # [span_11](start_span)منفذ Gradio الافتراضي[span_11](end_span)
30
+ EXPOSE 7860
31
+
32
+ # [span_12](start_span)تشغيل التطبيق[span_12](end_span)
33
+ CMD ["python", "app.py"]
README.md ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Builder.ai
3
+ emoji: 🏃
4
+ colorFrom: green
5
+ colorTo: pink
6
+ sdk: docker
7
+ pinned: false
8
+ ---
9
+
10
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import json
4
+ import re
5
+ import zipfile
6
+ import shutil
7
+ from huggingface_hub import InferenceClient
8
+
9
+ client = InferenceClient(api_key=os.environ.get("HF_TOKEN"))
10
+ project_state = {"files": {}, "last_zip": None}
11
+
12
+ def agents_dialogue(user_msg, file_upload, history):
13
+ if not history: history = []
14
+
15
+ # تنسيق Tuples الكلاسيكي المتوافق مع الجميع: [(user, bot), (user, bot)]
16
+ # سنضيف رسالة المستخدم مع رد أولي من كوين
17
+ current_history = list(history)
18
+ current_history.append((user_msg, "🛠️ **كوين:** أهلاً بك! بدأت العمل على معمارية المشروع..."))
19
+ yield current_history, project_state["files"], project_state.get("last_zip")
20
+
21
+ try:
22
+ # 1. كوين يبني
23
+ qwen_resp = client.chat.completions.create(
24
+ model="Qwen/Qwen2.5-Coder-32B-Instruct",
25
+ messages=[{"role": "user", "content": f"Generate JSON structure for: {user_msg}"}],
26
+ max_tokens=2000
27
+ )
28
+ draft_json = qwen_resp.choices[0].message.content
29
+
30
+ # 2. ديب سيك يتدخل (نضيفها كرسالة جديدة بدون مدخل مستخدم)
31
+ current_history.append((None, "🔍 **ديب سيك:** لحظة، سأقوم بمراجعة الكود وتصحيحه الآن..."))
32
+ yield current_history, project_state["files"], project_state.get("last_zip")
33
+
34
+ ds_resp = client.chat.completions.create(
35
+ model="deepseek-ai/DeepSeek-V3",
36
+ messages=[{"role": "user", "content": f"Audit and fix this JSON: {draft_json}"}],
37
+ max_tokens=2000
38
+ )
39
+
40
+ # 3. النتيجة النهائية
41
+ match = re.search(r'(\{.*\})', ds_resp.choices[0].message.content, re.DOTALL)
42
+ if match:
43
+ project_state["files"] = json.loads(match.group(1))
44
+ current_history.append((None, "✅ **النظام:** تم الاتفاق البرمجي! الملفات جاهزة الآن."))
45
+ yield current_history, project_state["files"], None
46
+
47
+ except Exception as e:
48
+ current_history.append((None, f"❌ **خطأ:** {str(e)}"))
49
+ yield current_history, project_state["files"], None
50
+
51
+ # --- واجهة محصنة ضد أخطاء الإصدارات ---
52
+ with gr.Blocks() as demo:
53
+ gr.Markdown("# 🏢 **Agentic Developer Room (Ultra-Stable)**")
54
+
55
+ # إزالة خاصية type تماماً لضمان التشغيل
56
+ chatbot = gr.Chatbot(label="نقاش الوكلاء", height=500)
57
+
58
+ with gr.Row():
59
+ msg = gr.Textbox(placeholder="اطلب تعديلاً أو ميزة...", scale=4, show_label=False)
60
+ file_btn = gr.UploadButton("📁 ZIP", file_types=[".zip"], scale=1)
61
+
62
+ submit_btn = gr.Button("إطلاق النقاش البرمجي ⚡", variant="primary")
63
+
64
+ with gr.Accordion("📂 ملفات المشروع", open=False):
65
+ json_view = gr.JSON()
66
+ download_btn = gr.File()
67
+
68
+ submit_btn.click(
69
+ agents_dialogue,
70
+ inputs=[msg, file_btn, chatbot],
71
+ outputs=[chatbot, json_view, download_btn]
72
+ )
73
+
74
+ # نقل الـ theme هنا يحل التنبيه في Gradio 6 ويقبل العمل في النسخ الأقدم
75
+ if __name__ == "__main__":
76
+ demo.launch(theme=gr.themes.Soft())
builder.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import zipfile
3
+ import shutil
4
+
5
+ def create_full_project(files_map, project_name="generated_project"):
6
+ base_path = os.path.join("sandbox", project_name)
7
+
8
+ # تنظيف المكان قبل البدء
9
+ if os.path.exists(base_path):
10
+ shutil.rmtree(base_path)
11
+ os.makedirs(base_path, exist_ok=True)
12
+
13
+ # إنشاء الملفات
14
+ for file_path, content in files_map.items():
15
+ full_file_path = os.path.join(base_path, file_path)
16
+ os.makedirs(os.path.dirname(full_file_path), exist_ok=True)
17
+ with open(full_file_path, "w", encoding="utf-8") as f:
18
+ f.write(content)
19
+
20
+ # ضغط المشروع في ZIP
21
+ zip_path = f"{project_name}.zip"
22
+ with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
23
+ for root, dirs, files in os.walk(base_path):
24
+ for file in files:
25
+ zipf.write(os.path.join(root, file),
26
+ os.path.relpath(os.path.join(root, file), base_path))
27
+
28
+ return zip_path, base_path
29
+
gitattributes.txt ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio
2
+ huggingface_hub>=0.25.0
3
+ requests
4
+ python-dotenv