MaenGit commited on
Commit
2643dca
·
1 Parent(s): 2490e69
Files changed (6) hide show
  1. .gitattributes +35 -35
  2. .vscode/settings.json +5 -5
  3. Dockerfile +24 -24
  4. README.md +10 -10
  5. app.py +122 -115
  6. requirements.txt +3 -3
.gitattributes CHANGED
@@ -1,35 +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
 
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
.vscode/settings.json CHANGED
@@ -1,5 +1,5 @@
1
- {
2
- "python-envs.defaultEnvManager": "ms-python.python:conda",
3
- "python-envs.defaultPackageManager": "ms-python.python:conda",
4
- "python-envs.pythonProjects": []
5
- }
 
1
+ {
2
+ "python-envs.defaultEnvManager": "ms-python.python:conda",
3
+ "python-envs.defaultPackageManager": "ms-python.python:conda",
4
+ "python-envs.pythonProjects": []
5
+ }
Dockerfile CHANGED
@@ -1,24 +1,24 @@
1
- FROM ollama/ollama
2
-
3
- # 🔴 IMPORTANT: remove ollama entrypoint
4
- ENTRYPOINT []
5
-
6
- WORKDIR /app
7
-
8
- RUN apt-get update && \
9
- apt-get install -y python3-venv python3-pip build-essential libffi-dev libssl-dev && \
10
- rm -rf /var/lib/apt/lists/*
11
-
12
- RUN python3 -m venv /opt/venv
13
- ENV PATH="/opt/venv/bin:$PATH"
14
-
15
- COPY requirements.txt .
16
- RUN pip install --no-cache-dir -r requirements.txt
17
-
18
- COPY . .
19
-
20
- EXPOSE 8000
21
-
22
- CMD sh -c "ollama serve & sleep 5 && ollama pull qwen2.5:1.5b && uvicorn app:app --host 0.0.0.0 --port $PORT"
23
- # CMD sh -c "ollama serve & sleep 5 && ollama pull qwen2.5:3b && uvicorn app:app --host 0.0.0.0 --port $PORT"
24
- # CMD sh -c "ollama serve & sleep 5 && ollama pull qwen2.5:7b && uvicorn app:app --host 0.0.0.0 --port $PORT"
 
1
+ FROM ollama/ollama
2
+
3
+ # 🔴 IMPORTANT: remove ollama entrypoint
4
+ ENTRYPOINT []
5
+
6
+ WORKDIR /app
7
+
8
+ RUN apt-get update && \
9
+ apt-get install -y python3-venv python3-pip build-essential libffi-dev libssl-dev && \
10
+ rm -rf /var/lib/apt/lists/*
11
+
12
+ RUN python3 -m venv /opt/venv
13
+ ENV PATH="/opt/venv/bin:$PATH"
14
+
15
+ COPY requirements.txt .
16
+ RUN pip install --no-cache-dir -r requirements.txt
17
+
18
+ COPY . .
19
+
20
+ EXPOSE 8000
21
+
22
+ CMD sh -c "ollama serve & sleep 5 && ollama pull qwen2.5:1.5b && uvicorn app:app --host 0.0.0.0 --port $PORT"
23
+ # CMD sh -c "ollama serve & sleep 5 && ollama pull qwen2.5:3b && uvicorn app:app --host 0.0.0.0 --port $PORT"
24
+ # CMD sh -c "ollama serve & sleep 5 && ollama pull qwen2.5:7b && uvicorn app:app --host 0.0.0.0 --port $PORT"
README.md CHANGED
@@ -1,10 +1,10 @@
1
- ---
2
- title: Arabic Analysis Server
3
- emoji: 📈
4
- colorFrom: red
5
- colorTo: purple
6
- sdk: docker
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ ---
2
+ title: Arabic Analysis Server
3
+ emoji: 📈
4
+ colorFrom: red
5
+ colorTo: purple
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 CHANGED
@@ -1,116 +1,123 @@
1
- from fastapi import FastAPI, HTTPException
2
- from pydantic import BaseModel
3
- import httpx
4
- import json
5
- import os
6
- import uvicorn
7
-
8
- app = FastAPI()
9
-
10
- OLLAMA_URL = "http://localhost:11434/api/chat"
11
-
12
- # تعريف شكل البيانات المستلمة
13
- class AnalysisRequest(BaseModel):
14
- user_text: str # النص المجمع من حوار المستخدم فقط
15
-
16
- @app.post("/analyze/personality")
17
- async def analyze_personality(data: AnalysisRequest):
18
- # الـ Prompt باللغة الإنجليزية فقط
19
- # analysis_prompt = f"""
20
- # Analyze the following user text and return a JSON object with EXACTLY these English keys:
21
- # 'decision_making', 'energy', 'focus', 'lifestyle', 'compatible_type'.
22
-
23
- # Requirements:
24
- # 1. The 'summary' field inside each key must be written in ARABIC.
25
- # 2. The 'summary' should be a concise psychological insight (1-2 sentences).
26
- # 3. 'compatible_type' must be a 4-letter MBTI code in ENGLISH (e.g., 'INFJ').
27
-
28
- # User Text:
29
- # \"\"\"{data.user_text}\"\"\"
30
-
31
- # Respond ONLY in valid JSON.
32
- # """
33
-
34
- # analysis_prompt = f"""
35
- # Analyze the following user text based on MBTI personality theory.
36
- # Return a JSON object with EXACTLY these keys:
37
- # 'personality_type', 'decision_making', 'energy', 'focus', 'lifestyle', 'compatible_type'.
38
-
39
- # Requirements:
40
- # 1. 'personality_type': MUST be the 4-letter MBTI code that is the user's identified type.
41
- # 2. The 'summary' field inside 'decision_making', 'energy', 'focus', and 'lifestyle' must be written in ARABIC.
42
- # 3. The 'summary' should be a concise psychological insight (1-2 sentences) in ARABIC just in Arabic.
43
- # 4. 'compatible_type': The 4-letter MBTI code in ENGLISH that best matches the user.
44
-
45
- # User Text:
46
- # \"\"\"{data.user_text}\"\"\"
47
- # Respond ONLY in ARABIC
48
- # Respond ONLY in valid JSON.
49
-
50
- # """
51
- # analysis_prompt = """
52
- # Analyze the following text based on MBTI theory.
53
- # Return ONLY a JSON object with this EXACT structure:
54
- # {{
55
- # "personality_type": "MUST be the 4-letter MBTI code that is the user's identified type. (e.g., 'INFJ')",
56
- # "decision_making": {{ "summary": "تحليل باللغة العربية هنا" }},
57
- # "energy": {{ "summary": "تحليل باللغة العربية هنا" }},
58
- # "focus": {{ "summary": "تحليل باللغة العربية هنا" }},
59
- # "lifestyle": {{ "summary": "تحليل باللغة العربية هنا" }},
60
- # "compatible_type": "MUST be the 4-letter MBTI code that is the user's identified type. (e.g., 'INFJ')"
61
- # }}
62
-
63
- # User Text:"""
64
- # analysis_prompt +=f"""
65
- # \"\"\"{data.user_text}\"\"\"
66
- # """
67
-
68
- analysis_prompt = f"""
69
- أنت محلل شخصيات متخصص. حلل نص المستخدم واستخرج كود MBTI المكون من 4 أحرف فقط.
70
-
71
- المطلوب:
72
- 1. الرد بصيغة JSON فقط.
73
- 2. الكود يجب أن يكون بالإنجليزية (مثل: ENFP).
74
-
75
- النص المراد تحليله:
76
-
77
- {data.user_text}
78
- """
79
- analysis_prompt +="""
80
- قالب الرد:
81
- {
82
- "mbti": "MUST be the 4-letter MBTI code that is the user's identified type. (e.g., 'INFJ')"
83
- }
84
- """
85
-
86
- # print(analysis_prompt)
87
-
88
- payload = {
89
- "model": "qwen2.5:1.5b",#"qwen2.5:3b",#qwen2.5:7b
90
- "messages": [
91
- {"role": "system", "content": "أنت خبير في تحليل الشخصيات النفسية. يجب أن تكون إجابتك دائماً بصيغة JSON صالحة فقط. استخدم اللغة العربية في كتابة التحليلات."},
92
- {"role": "user", "content": analysis_prompt}
93
- ],
94
- "options":{
95
- "temperature":0.3,
96
- },
97
- "stream": False,
98
- "format": "json"
99
- }
100
-
101
- async with httpx.AsyncClient(timeout=400.0) as client:
102
- try:
103
- url = os.environ.get("OLLAMA_URL", OLLAMA_URL)
104
- response = await client.post(url, json=payload)
105
- response.raise_for_status()
106
- result = response.json()
107
-
108
- analysis_content = result.get("message", {}).get("content", "")
109
- # print(json.loads(analysis_content))
110
- return json.loads(analysis_content)
111
-
112
- except Exception as e:
113
- print(e)
114
- raise HTTPException(status_code=500, detail=str(e))
115
-
 
 
 
 
 
 
 
116
  uvicorn.run(app, host="0.0.0.0", port=os.environ.get("PORT",7860)) # منفذ مختلف عن سيرفر الدردشة
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from pydantic import BaseModel
3
+ import httpx
4
+ import json
5
+ import os
6
+ import uvicorn
7
+
8
+ app = FastAPI()
9
+
10
+ OLLAMA_URL = "http://localhost:11434/api/chat"
11
+
12
+ # تعريف شكل البيانات المستلمة
13
+ class AnalysisRequest(BaseModel):
14
+ user_text: str # النص المجمع من حوار المستخدم فقط
15
+
16
+ @app.get("/")
17
+ async def check():
18
+ return {
19
+ "status": "success",
20
+ "state":"ok"
21
+ }
22
+
23
+ @app.post("/analyze/personality")
24
+ async def analyze_personality(data: AnalysisRequest):
25
+ # الـ Prompt باللغة الإنجليزية فقط
26
+ # analysis_prompt = f"""
27
+ # Analyze the following user text and return a JSON object with EXACTLY these English keys:
28
+ # 'decision_making', 'energy', 'focus', 'lifestyle', 'compatible_type'.
29
+
30
+ # Requirements:
31
+ # 1. The 'summary' field inside each key must be written in ARABIC.
32
+ # 2. The 'summary' should be a concise psychological insight (1-2 sentences).
33
+ # 3. 'compatible_type' must be a 4-letter MBTI code in ENGLISH (e.g., 'INFJ').
34
+
35
+ # User Text:
36
+ # \"\"\"{data.user_text}\"\"\"
37
+
38
+ # Respond ONLY in valid JSON.
39
+ # """
40
+
41
+ # analysis_prompt = f"""
42
+ # Analyze the following user text based on MBTI personality theory.
43
+ # Return a JSON object with EXACTLY these keys:
44
+ # 'personality_type', 'decision_making', 'energy', 'focus', 'lifestyle', 'compatible_type'.
45
+
46
+ # Requirements:
47
+ # 1. 'personality_type': MUST be the 4-letter MBTI code that is the user's identified type.
48
+ # 2. The 'summary' field inside 'decision_making', 'energy', 'focus', and 'lifestyle' must be written in ARABIC.
49
+ # 3. The 'summary' should be a concise psychological insight (1-2 sentences) in ARABIC just in Arabic.
50
+ # 4. 'compatible_type': The 4-letter MBTI code in ENGLISH that best matches the user.
51
+
52
+ # User Text:
53
+ # \"\"\"{data.user_text}\"\"\"
54
+ # Respond ONLY in ARABIC
55
+ # Respond ONLY in valid JSON.
56
+
57
+ # """
58
+ # analysis_prompt = """
59
+ # Analyze the following text based on MBTI theory.
60
+ # Return ONLY a JSON object with this EXACT structure:
61
+ # {{
62
+ # "personality_type": "MUST be the 4-letter MBTI code that is the user's identified type. (e.g., 'INFJ')",
63
+ # "decision_making": {{ "summary": "تحليل باللغة العربية هنا" }},
64
+ # "energy": {{ "summary": "تحليل باللغة العربية هنا" }},
65
+ # "focus": {{ "summary": "تحليل باللغة العربية هنا" }},
66
+ # "lifestyle": {{ "summary": "تحليل باللغة العربية هنا" }},
67
+ # "compatible_type": "MUST be the 4-letter MBTI code that is the user's identified type. (e.g., 'INFJ')"
68
+ # }}
69
+
70
+ # User Text:"""
71
+ # analysis_prompt +=f"""
72
+ # \"\"\"{data.user_text}\"\"\"
73
+ # """
74
+
75
+ analysis_prompt = f"""
76
+ أنت محلل شخصيات متخصص. حلل نص المستخدم واستخرج كود MBTI المكون من 4 أحرف فقط.
77
+
78
+ المطلوب:
79
+ 1. الرد بصيغة JSON فقط.
80
+ 2. الكود يجب أن يكون بالإنجليزية (مثل: ENFP).
81
+
82
+ النص المراد تحليله:
83
+
84
+ {data.user_text}
85
+ """
86
+ analysis_prompt +="""
87
+ قالب الرد:
88
+ {
89
+ "mbti": "MUST be the 4-letter MBTI code that is the user's identified type. (e.g., 'INFJ')"
90
+ }
91
+ """
92
+
93
+ # print(analysis_prompt)
94
+
95
+ payload = {
96
+ "model": "qwen2.5:1.5b",#"qwen2.5:3b",#qwen2.5:7b
97
+ "messages": [
98
+ {"role": "system", "content": "أنت خبير في تحليل الشخصيات النفسية. يجب أن تكون إجابتك دائماً بصيغة JSON صالحة فقط. استخدم اللغة العربية في كتابة التحليلات."},
99
+ {"role": "user", "content": analysis_prompt}
100
+ ],
101
+ "options":{
102
+ "temperature":0.3,
103
+ },
104
+ "stream": False,
105
+ "format": "json"
106
+ }
107
+
108
+ async with httpx.AsyncClient(timeout=400.0) as client:
109
+ try:
110
+ url = os.environ.get("OLLAMA_URL", OLLAMA_URL)
111
+ response = await client.post(url, json=payload)
112
+ response.raise_for_status()
113
+ result = response.json()
114
+
115
+ analysis_content = result.get("message", {}).get("content", "")
116
+ # print(json.loads(analysis_content))
117
+ return json.loads(analysis_content)
118
+
119
+ except Exception as e:
120
+ print(e)
121
+ raise HTTPException(status_code=500, detail=str(e))
122
+
123
  uvicorn.run(app, host="0.0.0.0", port=os.environ.get("PORT",7860)) # منفذ مختلف عن سيرفر الدردشة
requirements.txt CHANGED
@@ -1,3 +1,3 @@
1
- fastapi
2
- uvicorn
3
- httpx
 
1
+ fastapi
2
+ uvicorn
3
+ httpx