משא ומתן עם השרת
-
האם ניתן להגדיר בשלוחה שישלח נתון א
השרת יענה תשובה
ולפי בחירת המשתמש ימשיכו הלאה עוד ועוד?כלומר כיצד אני מגדיר בעצם בקשות לפרמטרים נוספים בהתאם להתקדמות השיחה?
האם לבקש עוד נתונים
האם לשלוח הודעת אישור
וכד' -
@795501400 אם לדוג' הדפסת כך:
read=t-הקש את בחירתך=AAA,yes,1,1,7,Number,yes,yes,*/,*#123456
והמשתמש בחר ב-2 אז לאחר הבחירה המערכת תפנה שוב לשרת בתוספת פרמטר של הבחירה
AAA=2
, כך ניתן ליצור דיאלוג ע"י בדיקה האם התקבל כבר פרמטרAAA
ומה הוא מכיל או שלא התקבל -
@CUBASE כעת נשלח אלי פרמטר AAA
כעת כיון שהוא מכיל 2 לפי מה שרשום לי אני צריך לשאול שאלה חדשה
אבל אם היה רשום 1
היה פשוט הודעת OK מהשרת כמובן עם נוסח מה חוזר
אני עדין לא מצליח להבין את התעוד כיצד אני עושה זאת -
@795501400 אני לא מבין, קראת את התיעוד של שלוחת API?
יש כל מיני דרכים להשמיע למשתמש תשובה, אפשר לענות הודעה פשוטה ואז להגדיר בשלוחה מה לבצע בעקבות התשובה, אפשר בתשובה עצמה להגיד למערכת מה לעשות, תקרא את השרשור של מודול API ואם יש לך שאלה ספציפית אז תשאל...
-
@CUBASE קראתי
אפילו שלחתי לAI שוב ושוב את הדברים
לפי מה שאני מבין משםשרשור פעולות בפעולה מסוג read לא ניתן לשרשר פעולות לביצוע. לאחר ביצוע פעולה אחת המערכת שולחת מיד את הנתון לשרת ולא מבצעת את הפעולה השניה לדוגמה read=f-000=foo,yes,8,4,7,Number,yes,no,*/&read=f-001=bar,yes,8,4,7,Number,yes,no,*/& המערכת תקבל ותשלח רק את הפרמטר foo ולא את הפרמטר bar
וזה בעיה
יש לי את הקלאס הבאdef yemot_api_handler(request): params = {} if request.method == 'POST': params = request.POST elif request.method == 'GET': params = request.GET else: logger.error("Yemot API Handler received unsupported method: %s", request.method) return HttpResponse(status=405) logger.info("Yemot API Handler received params: %s", dict(params.items())) api_call_id = params.get('ApiCallId') api_real_did = params.get('ApiRealDID') api_enter_id = params.get('ApiEnterID') action_code = params.get('action_type') if action_code is None: logger.info("action_type missing, returning 'read' command to Yemot.") read_command = "read=t-לדיווח כניסה הקישו 1, לדיווח יציאה הקישו 2=action_type,,Digits,1,1,Digits,yes,yes" return HttpResponse(read_command, content_type="text/plain; charset=utf-8") if not api_real_did or not api_enter_id: logger.error("Missing required parameters after read: DID=%s, EnterID=%s", api_real_did, api_enter_id) return HttpResponse("id_list_message=t-שגיאה בקבלת נתונים חיוניים", content_type="text/plain; charset=utf-8") try: enrollment_query_kwargs = { 'major__yemot_did': api_real_did, 'enter_id_in_major': api_enter_id, 'is_active_in_major': True, 'major__is_active': True } enrollment = StudentMajorEnrollment.objects.select_related('student', 'major').get(**enrollment_query_kwargs) except StudentMajorEnrollment.DoesNotExist: logger.warning("Enrollment not found using query: %s", enrollment_query_kwargs) return HttpResponse("id_list_message=t-הזיהוי שהוקש אינו קיים או אינו פעיל במערכת כולל זו", content_type="text/plain; charset=utf-8") except StudentMajorEnrollment.MultipleObjectsReturned: logger.error("CRITICAL: Multiple active enrollments found for query: %s", enrollment_query_kwargs) return HttpResponse("id_list_message=t-שגיאה חמורה בנתונים, נא פנה למנהל המערכת", content_type="text/plain; charset=utf-8") except Exception as e: logger.exception("Unexpected error finding enrollment for query: %s", enrollment_query_kwargs) return HttpResponse("id_list_message=t-שגיאה כללית בגישה לנתונים", content_type="text/plain; charset=utf-8") action_type_str = None confirmation_message = "t-הפעולה נכשלה" timestamp = timezone.now() time_str = timezone.localtime(timestamp).strftime("%H:%M") if action_code == '1': action_type_str = "Entry" confirmation_message = f"t-נרשמה כניסה בשעה {time_str}" elif action_code == '2': action_type_str = "Exit" confirmation_message = f"t-נרשמה יציאה בשעה {time_str}" else: logger.warning("Invalid action code '%s' received for enrollment %s", action_code, enrollment.id) confirmation_message = "t-הבחירה שהוקשה שגויה" if action_type_str: try: AttendanceEvent.objects.create( enrollment=enrollment, action_type=action_type_str, timestamp=timestamp, api_call_id=api_call_id ) logger.info("Recorded %s for enrollment %s (Student: %s, Major: %s)", action_type_str, enrollment.id, enrollment.student.name, enrollment.major.name) except Exception as e: logger.exception("DATABASE ERROR: Failed to save AttendanceEvent for enrollment %s", enrollment.id) confirmation_message = "t-אירעה שגיאה פנימית ברישום, נא פנה למנהל" yemot_response_text = f"id_list_message={confirmation_message}" yemot_response_text += "&go_to_folder=hangup" return HttpResponse(yemot_response_text, content_type="text/plain; charset=utf-8")
זה עובד
אבל שאני רוצה לטפל במקרה של כניסה כפולה זה אומר שעלי לשלוח בקשה חדשה לגמרי לשרת
כלומר בחרת כניסה אבל במערכת רשומה כניסה כבר בתאריך X סעה Y מה ברצונך לעשות וכו?
כיצד אני עושה זאת? -
@795501400 אין לי מושג בפייתון, אולי תנסה לפרט יותר מה הבעיה שלך בתקווה שאוכל לעזור...
-
@CUBASE כיון שמודל שעון נוכחות לא עובד כמו שצריך
אני בונה כזה עצמאי אצלי על השרת
אני מנסה לטפל מה קרה אם הדיווח לא תקין
למשל דיווח נוסף על כניסה או דיווח נוסף על יציאה (כלומר חוסר בדיווח קודם)
כיצד אני בעצם פותח דו שיח נוסף עם השרת אחרי שהוא דיווח לי על יציאה
באופן רגיל אני עונה לו את ההודעה התקבל דיווח בהצלחה
אבל פה אני בעצם רוצה לומר לו יש בעיה
מה לעשות?
א. ב. או ג?
כיצד אני עושה את זה? -
@795501400 אתה מחזיר לו read עם ההודעה שיש בעיה בדיווח ונותן לו להקיש את הפרטים הנצרכים, אתה יכול גם להחזיר id_list_message עם הודעת שגיאה ולשרשר אחריו read עם האפשרויות להקשה, היתרון בכך הוא שניתן לדלג על ההודעה ובכל זאת לשמוע את התפריט של אפשרויות ההקשה (הכוונה שלא ניתן לשרשר ב-read זה אחריו,** לפני** read כן ניתן לשרשר)
לפי איך שזה נראה אתה הבנת שאחרי שענית read אז לא ניתן להמשיך את הדו שיח, הכוונה שלא ניתן לשרשר פעולות נוספות כמו id_list_message או go_to_folder ע"י כתיבת הפעולות בתשובה עצמה, כלומר לא תוכל לענות כך:read=f-000=foo,yes,8,4,7,Number,yes,no,*/&read=f-001=bar,yes,8,4,7,Number,yes,no,*/&
או כך:
read=f-000=foo,yes,8,4,7,Number,yes,no,*/&go_to_folder=hangup
-
@CUBASE אני יכול להחזיר עוד read ועוד ועוד?
-
@795501400 כן, אבל כמו שכתבתי לא בתשובה אחת אלא אתה מחזיר read, מקבל את הקשת המשתמש ומחזיר לו read חדש
-
@CUBASE ראשית מתנצל על הבורות. שנית, איך אני מממש את המשא ומתן הזה? אם לקחתי מידע מהמאזין, הכנתי ממנו שאילתא למסד נתונים ועכשיו אני רוצה לשאול את המאזין איזה מבין הנתונים שחזרו מהמסד נתונים הוא רוצה, אז לשאול זה לא בעיה (דרך הread) השאלה איך אני גורם לשרת לזכור אילו נתונים נמצאו? הרי כל קריאה לשרת מריצה את הקוד מחדש לא? ואם 2 יתקשרו במקביל/בסמוך, איך השרת ידע לא "להתבלבל" בין הבקשות שלהם ולעשות לכל אחד את מה שצריך לעשות לו?
-
@795501400 @עידו מניסוח השאלות אני מבין שאתם כותבים/לומדים עם AI, לכן אני ממליץ לכם ללמוד כבר להשתמש בnode-js עם הספריה https://github.com/ShlomoCode/yemot-router2 במקום עם py, זה עולם אחר לחלוטין של תקשורת עם המערכת ואין צורך להתעסק בהפניית הבקשות read ושאר ירקות, רק לכתוב קוד בצורה מסודרת ונקיה,
(יש כאן גם טמפלייט פשוט וקליל לאפליקציית node כזו)
-
@אביי-ורבא האמת אני משתמש בphp והייתי מעדיף את C#
-
@אביי-ורבא כתב במשא ומתן עם השרת:
@795501400 @עידו מניסוח השאלות אני מבין שאתם כותבים/לומדים עם AI, לכן אני ממליץ לכם ללמוד כבר להשתמש בnode-js עם הספריה https://github.com/ShlomoCode/yemot-router2 במקום עם py, זה עולם אחר לחלוטין של תקשורת עם המערכת ואין צורך להתעסק בהפניית הבקשות read ושאר ירקות, רק לכתוב קוד בצורה מסודרת ונקיה,
(יש כאן גם טמפלייט פשוט וקליל לאפליקציית node כזו)
נראה מעניין מאוד, אבל איך זה עוזר בעניין המשא ומתן ו"שאר ירקות"? לא כ"כ הבנתי מה הולך שם ואיך זה עובד.
-
@עידו אתה מכיר קצת nodejs + express?
אם לא תשאל את GPT על הקוד של הטמפלייט, הוא יוכל להסביר לך על מבנה הראוטר עצמו
בקובץ src/callHandler.js תוכל לראות לוגיקה בסיסית (של תגובה עם id_list_message) שאר המתודות די דומות, תעבוד עם התיעוד ברדמי של הספריה + GPT, מהר מאוד תבין מי נגד מי,
אם תסתבך, אתה יכול לשאול בפורום ואשתדל לעזור
-
@אביי-ורבא הבעיה היא שמה שאני מכיר הוא פייתון
NODE לא זכיתי לדעת
וודאי שלא לשלב את זני אלו בפרוייקט אחדהחלק של שעון הנוכחות זה רק חלק ממערכת שלמה שכתובה בשפת פייתון כך שאינני יכול לשנות אותם לNIDE
-
@עידו כתב במשא ומתן עם השרת:
@CUBASE ראשית מתנצל על הבורות. שנית, איך אני מממש את המשא ומתן הזה? אם לקחתי מידע מהמאזין, הכנתי ממנו שאילתא למסד נתונים ועכשיו אני רוצה לשאול את המאזין איזה מבין הנתונים שחזרו מהמסד נתונים הוא רוצה, אז לשאול זה לא בעיה (דרך הread) השאלה איך אני גורם לשרת לזכור אילו נתונים נמצאו? הרי כל קריאה לשרת מריצה את הקוד מחדש לא? ואם 2 יתקשרו במקביל/בסמוך, איך השרת ידע לא "להתבלבל" בין הבקשות שלהם ולעשות לכל אחד את מה שצריך לעשות לו?
כל בקשת read מבצעת פניה חדשה לשרת עם כל הנתונים שהתקבלו עד עכשו בתוספת הנתון האחרון, כך שהמערכת מבצעת את הפעולה כאילו פנית מראש עם כל הנתונים, אתה יכול לראות את זה בצורה מאד ברורה ב LogApi שנמצא בתיקיית Log במערכת, תראה שם את הפניה הראשונה לשרת, תשובת השרת - read, ובשורה הבאה פניה חוזרת לשרת עם כל הנתונים פלוס הנתון האחרון.
-
@795501400 כתב במשא ומתן עם השרת:
החלק של שעון הנוכחות זה רק חלק ממערכת שלמה שכתובה בשפת פייתון כך שאינני יכול לשנות אותם לNIDE
אתה יכול להקים יישום nodejs עם הספריה שידבר עם ימות המשיח וכדי לבצע פעולות/לקבל מידע יתקשר עם API כלשהוא שאפליקציית הפייתון תחשוף לו
מעין תיווך -
@צדיק-תמים יש לי כרגע המון המון API כתובים ועובדים תקין
גם התקשורת הזאת עובדת
אני מקבל את הנתונים
רק אני לא הצלחתי להבין כיצד לשלוח לו שאלה חדשה אחר כך(עדין לא הבנתי - אבל כרגע אני לא בודק בלייב האם זה כניסה כפולה או יציאה כפולה - זה מטופל בדוח היומי - כך שלהתחיל להקים שרות בשפה שאינני מכיר בשביל הסבר אחד שחסר לי - קצת הרבה בשבילי)
-
@795501400 כתב במשא ומתן עם השרת:
@CUBASE כעת נשלח אלי פרמטר AAA
כעת כיון שהוא מכיל 2 לפי מה שרשום לי אני צריך לשאול שאלה חדשה
אבל אם היה רשום 1
היה פשוט הודעת OK מהשרת כמובן עם נוסח מה חוזר
אני עדין לא מצליח להבין את התעוד כיצד אני עושה זאתאם ידוע לך מראש מה יקרה אם ילחץ 2 אז אתה יכול להשתמש ב
read_answer_AAA_2=what_to_do, example: go_to_folder=/2
ככה לכל פרמטר שנשלח לשרת בread.
את זה אגב, כותבים בשלוחה עצמה.
אגב, לפעמים התיעוד הישן של המודל יותר טוב מהחדש.