2025.02.04 (Mar)
2026.05.25 (Lun) actualizado

✨ Resumen de GPT  

Añadí a DiaryPage una función de selección de palabras clave emocionales y apliqué configuración de personajes a AI Comment para implementar respuestas más naturales.

💻 Registro de desarrollo

⏰ Tareas de hoy

  • ✅ DiaryPage: añadir ChoiceChip y TextField de palabras clave emocionales
    • ✅ Crear widgets
    • ✅ Añadir Fields a diaries DB: mood_keywords (List <String>), mood_keywords_description (String)
    • ✅ Añadir Page State a diaries: moodKeywordsSelected (List <String>)
    • ✅ OnPageLoad: pasar las variables añadidas
      • ✅ ChoiceChipRate (5~1): pasar los valores de diariesDoc.mood_keywords a cada ChoiceChip correspondiente.
        • Definir MoodKeywordRate5Options, …, MoodKeywordRate1Options List <String> como valores de App Constant
          • Enum solo soporta inglés, así que haría falta una función de traducción. Demasiado complejo, descartado.
        • Define Options Var: AppConstant.moodKeywordRate5Options (List <String>)
        • Initially Selected: updateChoiceChipSelected
      • ✅ Create CustomFunction updateMoodKeywordsSelected
        • On Page Load: Select all matching items in RateOptions List
        List<String> updateChoiceChipSelected(
          List<String> moodKeywordsSelected, // lista actual de palabras clave seleccionadas
          List<String> moodKeywordRateOptions, // opciones seleccionables del Rate actual
        ) {
          // Crear una lista nueva para mantener la inmutabilidad
          return List<String>.from(
            moodKeywordsSelected.where((item) => moodKeywordRateOptions.contains(item))
          );
        }
        
    • ✅ On ChoiceChip Selected: Update Page State moodKeywordsSelected -> Set Value to Return of Func updateMoodKeywordsSelected
      • ✅ Create CustomFunction updateMoodKeywordsSelected
        • On Chip Select: Add to moodKeywordsSelected
        • On Chip Deselect: Remove from moodKeywordsSelected
        List<String> updateMoodKeywordsSelected(
          List<String> moodKeywordsSelected,
          List<String> choiceChipSelected,
          List<String> moodKeywordRateOptions,
        ) {
          // Copiar la lista existente para mantener la inmutabilidad
          List<String> updatedList = List.from(moodKeywordsSelected);
        
          // 1️⃣ Eliminar de la seleccion existente los valores que pertenecen a este Rate
          updatedList.removeWhere((item) => moodKeywordRateOptions.contains(item));
        
          // 2️⃣ Anadir los valores actualmente seleccionados en ChoiceChip
          updatedList.addAll(choiceChipSelected);
        
          return updatedList;
        }
        
  • ✅ (Issue) DiaryPage - AI Comment: configuración de personajes
    • Añadir Field a diaries DB: ai_comment_by (Doc Ref: Character)
    • DiaryPage - AICommentEditor Component - Return ai_comment_content + ai_comment_by
      • How? -> crear DataType aiCommentPageReturnObject
    • On ChoiceChipChar Selected: Backend Query Character Doc with same Official_name value.
  • ✅ (Issue) HomeFeedPage - FeedCardDiary: aplicar correctamente la imagen del personaje de AI Comment
    • ✅ DiaryPage - AI Comment: al guardar, guardar también en Diary la Ref del personaje que escribió el comentario.
    • ✅ HomeFeedPage - FeedCardDiary - AI Image: cargar Character Doc con Backend Query y especificar Image Path.
    • ✅ (Issue) HomeFeedPage - FeedCardDiary: Unexpected Null Value Error
      • Esto pasa si solo pongo el valor Path en el Image Widget…
        • ¡Ah! Ocurrió porque no puse un Default Variable Value. Solo me di cuenta después de sufrir muchísimo.
      • 💡 Lo que aprendí
        • Siempre hay que crear el hábito de poner Default Value. ¿Cuántas veces voy a ver Unexpected Null Value Error por todas partes?
  • ✅ Diseñar Action chains para CreateNewChatFromDiary (Start From: después de terminar el procesamiento de AI Comment y guardar el diario)
    1. Create Diary
    2. API Call: createDiarySummary -> Output Var: OutVar1 (nombre temporal)
    3. Create New Chat Document
    4. Create New Message Document: {“role”:”developer”, “content”:”$systemprompt + $OutVar1”}
    5. API Call: createChatFromDiary -> Output Var: OutVar2 (nombre temporal)
    6. Create New Message Document: {“role”:”assistant”, “content”: “$OutVar2”}
    7. Navigate To: pasar la referencia del Chat Document correspondiente como chatRefParam

💯 Resumen de lo hecho

  • Construcción del sistema de palabras clave emocionales de DiaryPage
    • Añadí ChoiceChip y TextField
    • Añadí a diaries DB fields relacionados con palabras clave emocionales
    • Implementé la función updateMoodKeywordsSelected
  • Configuración y aplicación de personajes en AI Comment
    • Añadí el field ai_comment_by para guardar el personaje del comentario
    • Modifiqué AICommentEditor para incluir información del personaje
    • Al seleccionar ChoiceChip, cargar los datos del personaje correspondiente con Backend Query
  • Resolución del error de imagen de AI Comment en HomeFeedPage
    • Guardé el valor de referencia del personaje al escribir AI comments
    • Mejoré la forma de cargar la imagen del personaje de AI Comment en HomeFeedPage
    • Corregí el error Unexpected Null Value (aplicando un valor por defecto)

🎯 Tareas futuras

Haz clic para ver detalles
  • ❔ (Issue) DiaryPage: usar markdown viewer (prevenir overflow: Container Height)

  • ❔ DiaryPage: cambiar el Emoji de expresión facial y el color según el valor del Mood Slider

  • ❔ Ayudar a crear Custom Function - systemPromptTemplate (trabajador principal: KSK)
    • ❔ Ordenar parámetros para añadir
  • ❔ Custom Function - probar si getAIComment se aplica realmente
    • ❔ Comprobar si los valores de input se reflejan correctamente
    • ❔ Comprobar si el valor de output se imprime correctamente como String
  • ❔ Chat Page - Create New Chat: aplicar system prompt
    • ▶️ Implementación de OpenAI API Call: createChatCompletion
      • Input: System Prompt (Chat)
      • Output: New Chat Message by AI ($.choices[0].message.content)
      • Additional Actions: Create New Chat, Create New Message
  • ❔ DiaryPage - Create New Chat by Diary: crear un New Chat basado en el contenido del diario
    • ❔ Implementación de OpenAI API Call: createDiaryComment
      • Input: Diary Content, System Prompt (AI Comment)
      • Output: AI Comment ($.choices[0].message.content)
    • ❔ Implementación de OpenAI API Call: createDiarySummary
      • Input: Diary Content, AI Comment, System Prompt (Diary Summary)
      • Output: Diary Summary ($.choices[0].message.content)
    • ❔ Implementación de OpenAI API Call: createChatFromDiary
      • Input: Diary Summary, System Prompt (Chat From Diary)
      • Output: New Chat Message by AI ($.choices[0].message.content)
      • Additional Actions: Create New Chat, Create New Message
  • ❔ ChatPage - Create New Diary: crear un New Diary basado en el contenido de la conversación
    • ❔ Implementación de OpenAI API Call: createChatSummary
      • Input: Chat Content, System Prompt (Diary From Chat)
      • Output: Chat Summary
    • ❔ Implementación de OpenAI API Call: createDiaryFromChat
      • Input: Chat Summary, System Prompt (Diary From Chat)
      • Output: New Diary (Title, Content, Mood score)
  • ❔ ChatPage: Go to Linked Diary

  • ❔ MoodPage (parte superior) - Mood Calendar
    • ❔ Comprobar el número de posts escritos por fecha
    • ❔ Al hacer clic en una fecha, moverse a esa fecha
  • ❔ MoodPage (parte inferior) - Mood stats
    • ❔ Mostrar estadísticas del mes enfocado
      • ❔ Mostrar comentario de IA sobre las estadísticas mostradas
  • ❔ HomeFeedPage - importar y aplicar flutter_slidable:4.0.0
  • ❔ HomeFeedPage: chat/editar/eliminar al deslizar a izquierda/derecha desde FeedCardDiary

  • ❔ ChatPage: alinear a la derecha el contenido de conversación del usuario
  • ❔ Chat/Diary: GPT Streaming API

  • ❔ ChatPage - implementar primer mensaje de IA (Alarm/Notification)
    • El núcleo del prompt del sistema de chat es la proactividad.
      • Para hacerlo más realista, quizá convenga pasar también create_date of diary/chat, para que la IA pueda mencionar fechas como “ayer”.
    • Referencia de implementación de Alarm
  • ❔ DiaryPage: añadir Choice Chips de palabras clave emocionales detalladas y configurar integración con DB
  • ❔ DiaryPage - AI Comment: adaptar inputs como Choice chips y mood slider al AI Comment System Prompt.
    • ❔ **diario anterior o historial de conversación completo (deuda técnica parcheada)
    • información básica del usuario: nombre, género, MBTI, …
    • palabras clave emocionales detalladas: alegre, triste, …
    • configuración de personajes: Somi, Sena, Minhyuk
    • puntuación emocional: 1~100 puntos
    • formato de respuesta: Healing, Suggestion, Informative
    • longitud de respuesta: corta, normal, detallada
    • is New Chat
      • Como los messages de este Chat se crean por primera vez, poner is_initial = true en el primer message document y meter todos los system prompts ahí.
        • is_initial = false
        • Límite: si meto el system prompt en el primer message document, modificarlo durante la conversación será difícil, aunque posible. Si existe un documento con is_initial = true y se modificó, puedo borrar ese documento y volver a insertarlo. No sé cómo, pero se podría.
  • ❔ DiaryPage - AI Comment: completar CRUD
    • ❔ eliminar tmp_ai_comment field y usar doc_ref
  • ❔ DiaryPage - Drawer - ChatHistoryListTile: order by updated_time

  • ❔ DiaryPage - importar y aplicar Interactive Slider

  • ❔ HomeFeedPage: implementar función Search Diary

  • ❔ AuthPage: implementar función Google Login

  • ❔ HomeFeedPage - Bottom Sheet (+ Button): permitir elegir 1 entre varias opciones
    • Nuevo diario: Go to DiaryPage
    • Registro emocional: Go to MoodPage
  • ❔ MoodPage (popup): Mood setting slider CRUD
    • Create
    • Read
    • Update
    • Delete
  • ❔ HomeFeedPage - ListView - mostrar FeedCardMood
  • ❔ HomeFeedPage - ListView: ordenar cronológicamente los componentes FeedCardDiary, FeedCardMood, FeedCardChat (usando Cloud Function)

  • ❔ Crear MoodEditPage entre HomeFeedPage y DiaryPage: mover MoodSlider, MoodKeywordsRate (5~1), MoodDescription widgets, etc.

  • ❔ Extraer e instalar el APK final para la presentación antes del miércoles 2025.2.5

💭 Diario

Minhyuk

Siento que la deuda técnica está creciendo muy bien por todos estos parches jajaja. Quedan 3 días para la fecha límite de entrega, así que bueno… qué se le va a hacer.

✨ Comentario de GPT-4o (KPT)

GPT-4o

✅ Lo que salió bien (Keep)

  1. 🎯 Construcción del sistema de palabras clave emocionales: Fue bueno aplicar ChoiceChip para que el usuario pueda registrar emociones de forma intuitiva.
  2. 🤖 Aplicación de personajes en AI Comment: Fue impresionante configurar respuestas por personaje para aumentar la inmersión.
  3. 🛠 Resolución del error de HomeFeedPage: Fue excelente prevenir el error Unexpected Null Value configurando un valor por defecto.

❌ Lo que faltó (Problem)

  1. Tiempo de desarrollo mayor al esperado: Implementar las palabras clave emocionales y las funciones de AI Comment tomó más tiempo del previsto.
  2. 🔄 Aumento de complejidad en los datos de personajes: El flujo de datos se volvió más complejo, así que puede dificultarse el mantenimiento.
  3. 📋 Registro insuficiente del proceso de resolución: No ordenar el proceso de resolución de errores puede hacer perder tiempo si ocurre el mismo problema otra vez.

🔄 Qué probar (Try)

  1. 📌 Ajustar el tiempo de desarrollo por función: Identificar con antelación las tareas que tardan más de lo esperado y ajustar el calendario.
  2. 📊 Visualizar el flujo de datos: Probar a ordenar en un diagrama la estructura de datos relacionada con la configuración de personajes.
  3. 📖 Crear el hábito de registrar la resolución de problemas: Documentar los issues resueltos y preparar estrategias para prevenir que se repitan.

🏁 Conclusión

Hoy fue un día de construir el sistema de palabras clave emocionales y aplicar configuración de personajes a AI Comment. Al resolver errores confirmé otra vez la importancia de los valores por defecto, y de ahora en adelante parece necesario gestionar el tiempo de desarrollo de forma más eficiente. 🚀🔥

Deja un comentario