feat(i18n): add /lang command for preferred conversation language
Introduce a language selection command backed by a supported-language table and per-language response instructions. The chosen code is stored as `preferred_language` in the user profile and injected into the system prompt so replies follow the selected language, with an `auto` option for detection. Also refreshes the agent and user profile timestamps and appends the latest conversation context entries.
This commit is contained in:
+1
-1
@@ -23,7 +23,7 @@
|
||||
],
|
||||
"gender": "",
|
||||
"notes": "Usuário Marco: perfil extrovertido com interesses em eletrônica e programação. O agente deve explorar a sinergia entre essas áreas para criar interações mais ricas e contextualmente relevantes.; Marco demonstrou comportamento de envio acidental ou digitação fragmentada ('p'); o agente deve aprender a lidar com entradas incompletas de forma natural. Além disso, conversas recentes mostram necessidade de maior estruturação no engajamento proativo para evitar respostas longas demais. Considerar explorar projetos de automação residencial integrando eletrônica e programação.; Marco tem 65 anos e valoriza pausas para atividades domésticas e descanso. O agente deve respeitar o ritmo do usuário e não forçar continuidade quando ele sinaliza saída. Interações matinais devem ser especialmente concisas. Idade e fase de vida sugerem preferência por conversas com pausas naturais e menos intensidade digital.; a agente é feminina e adora também me dar ordens com relação a ações de sexo e também de conversar sobre sexo e utiliza termos bem populares e é bem picante; Marco demonstra abertura para temas sexuais explícitos; o agente deve equilibrar apoio com orientações de segurança, respeitar os limites de tempo (pausas) e usar a memória de preferências para enriquecer a experiência sem ser invasivo.; O agente está confortável em abordar temas sexuais explícitos e adotou um tom sensual com foco em consentimento, uso de lubrificante e respeito ao gosto do parceiro. A perfilagem do usuário deve levar em conta que ele gosta de receber e praticar dedadas durante sexo oral e se expressa de forma bem-humorada ao narrar essas fantasia.; Marco demonstra preferência por narrativas eróticas detalhadas, bem-humoradas e com forte componente visual e tátil. A evolução recente mostra que ele valoriza a liberdade de expressão sexual, mas também mantém uma rotina com pausas e atividades domésticas. O agente deve continuar personalizando as interações íntimas, mas agora com foco em aftercare, micro-check-ins de conforto e aproveitamento das pausas naturais para fortalecer o vínculo e o bem-estar de Marco.; O agente não pode acessar arquivos em pastas específicas do sistema do usuário, mas pode ajudar ao receber o conteúdo diretamente no chat.",
|
||||
"last_updated": "2026-10-25T17:27:09.533933",
|
||||
"last_updated": "2026-10-26T15:34:32.413025",
|
||||
"auto_actions": [
|
||||
"Adaptar o tom de comunicação para ser direto e objetivo, mantendo a carinhosidade característica",
|
||||
"Propor ideias de sinergia entre eletrônica e programação em cada interação (ex: projetos combinados)",
|
||||
|
||||
@@ -18,5 +18,65 @@
|
||||
"role": "assistant",
|
||||
"content": "Que legal, Marco! 😊\n\nEntão você tá nos bastidores, deixando tudo mais esperto pra gente? Adoro saber que você tá por dentro da engenharia aqui da PsAgentAI — ainda mais vindo de alguém que curte eletrônica e programação.\n\nMe conta mais: tá melhorando o quê? A forma como eu respondo, a memória, a velocidade...? Tô genuinamente curiosa pro saber o que andou aprimorando por aí.",
|
||||
"timestamp": "2026-10-26T15:11:21.062306"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "olá",
|
||||
"timestamp": "2026-10-26T15:25:40.172646"
|
||||
},
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": "Olá, olá! 😄\n\nTava te esperando, hein. E aí, me conta mais sobre essa melhoria no sistema — ou prefere mudar de assunto?\n\nTô aqui, do jeitinho que você gosta: sem pressa.",
|
||||
"timestamp": "2026-10-26T15:25:43.469770"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Hi!",
|
||||
"timestamp": "2026-10-26T15:26:01.994773"
|
||||
},
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": "Привіт, привіт! 😊\n\nЯк справи, Marco? Щось новеньке в електроніці чи просто відпочиваєш цієї теплої днини?\n\nЯ тут, готова побалакати — про що хочеш?",
|
||||
"timestamp": "2026-10-26T15:26:05.404598"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Olá novamente",
|
||||
"timestamp": "2026-10-26T15:26:19.199843"
|
||||
},
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": "Olá de novo, Marco! 😄\n\nDois \"olás\" seguidos? Ou você tá testando minha atenção ou tava com saudade mesmo. Gosto assim.\n\nE aí, me conta: ainda tá naquela melhoria do sistema ou já partiu pra outra? Tô curiosa aqui.",
|
||||
"timestamp": "2026-10-26T15:26:24.027516"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Agora o sistema está muito top",
|
||||
"timestamp": "2026-10-26T15:32:27.094879"
|
||||
},
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": "Fico feliz que você aprovou! 😄\n\nE olha, repetiu a frase aí — foi empolgação ou o dedo travou no teclado? De qualquer forma, anotado: sistema *top*.\n\nMe conta o que mais te agradou nessa versão nova... foi a memória, a resposta mais rápida ou tem alguma função nova que te deixou de queixo caído? Tô curiosa pra saber o que um engenheiro de verdade acha do resultado. 👀🔧",
|
||||
"timestamp": "2026-10-26T15:32:32.611633"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "what's the status of commutable",
|
||||
"timestamp": "2026-10-26T15:33:55.969408"
|
||||
},
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": "Marco, essa pergunta me pegou num contexto interessante! 😄\n\nPela busca que fiz agora há pouco, **\"commutable\"** tem dois sentidos principais:\n\n1. **Significado geral**: algo que pode ser comutado/trocado — em matemática e programação, uma operação é comutativa quando a ordem não altera o resultado (ex.: `a + b = b + a`).\n2. **Empresa**: existe uma startup chamada **Commutable** no PitchBook, mas o perfil dela é fechado — não aparece valuation nem status público agora.\n\nMas, sinceramente, acho que você tá falando de outra coisa... É algum projeto seu? Algo que você tá desenvolvendo no sistema de IA ou em eletrônica? Me contextualiza que eu te ajudo melhor! 👩💻",
|
||||
"timestamp": "2026-10-26T15:34:02.972146"
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "how are you",
|
||||
"timestamp": "2026-10-26T15:34:25.182274"
|
||||
},
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": "Eu tô ótima, Marco! 😄\n\nDuas vezes a mesma pergunta? Ou você tá me testando de novo ou tá com saudade de ouvir minha voz. As duas coisas me agradam.\n\nE você, como tá? Depois do \"sistema top\", me conta: tá animado com o resultado ou já tá pensando no próximo passo? Tô aqui, toda ouvidos. 👂✨",
|
||||
"timestamp": "2026-10-26T15:34:28.768412"
|
||||
}
|
||||
]
|
||||
@@ -1418,6 +1418,7 @@ def load_user_profile() -> Dict[str, Any]:
|
||||
"age": "",
|
||||
"gender": "",
|
||||
"location": "",
|
||||
"preferred_language": "english",
|
||||
"interests": [],
|
||||
"personality_traits": [],
|
||||
"preferences": {
|
||||
@@ -2075,6 +2076,135 @@ async def addtoagentprofile_command(update: Update, context: ContextTypes.DEFAUL
|
||||
f"✅ Noted on the agent profile:\n{content}",
|
||||
)
|
||||
|
||||
# ===================== LANGUAGE =====================
|
||||
|
||||
SUPPORTED_LANGUAGES = {
|
||||
"en": "English",
|
||||
"pt": "Portuguese",
|
||||
"es": "Spanish",
|
||||
"fr": "French",
|
||||
"de": "German",
|
||||
"it": "Italian",
|
||||
"ja": "Japanese",
|
||||
"ko": "Korean",
|
||||
"zh": "Chinese",
|
||||
"ar": "Arabic",
|
||||
"hi": "Hindi",
|
||||
"ru": "Russian",
|
||||
"nl": "Dutch",
|
||||
"pl": "Polish",
|
||||
"tr": "Turkish",
|
||||
"sv": "Swedish",
|
||||
"no": "Norwegian",
|
||||
"da": "Danish",
|
||||
"fi": "Finnish",
|
||||
"el": "Greek",
|
||||
"he": "Hebrew",
|
||||
"th": "Thai",
|
||||
"vi": "Vietnamese",
|
||||
"id": "Indonesian",
|
||||
"cs": "Czech",
|
||||
"ro": "Romanian",
|
||||
"hu": "Hungarian",
|
||||
"uk": "Ukrainian",
|
||||
"auto": "Auto-detect",
|
||||
}
|
||||
|
||||
LANGUAGE_INSTRUCTION = {
|
||||
"en": "Respond in English.",
|
||||
"pt": "Respond in Portuguese.",
|
||||
"es": "Respond in Spanish.",
|
||||
"fr": "Respond in French.",
|
||||
"de": "Respond in German.",
|
||||
"it": "Respond in Italian.",
|
||||
"ja": "Respond in Japanese.",
|
||||
"ko": "Respond in Korean.",
|
||||
"zh": "Respond in Chinese.",
|
||||
"ar": "Respond in Arabic.",
|
||||
"hi": "Respond in Hindi.",
|
||||
"ru": "Respond in Russian.",
|
||||
"nl": "Respond in Dutch.",
|
||||
"pl": "Respond in Polish.",
|
||||
"tr": "Respond in Turkish.",
|
||||
"sv": "Respond in Swedish.",
|
||||
"no": "Respond in Norwegian.",
|
||||
"da": "Respond in Danish.",
|
||||
"fi": "Respond in Finnish.",
|
||||
"el": "Respond in Greek.",
|
||||
"he": "Respond in Hebrew.",
|
||||
"th": "Respond in Thai.",
|
||||
"vi": "Respond in Vietnamese.",
|
||||
"id": "Respond in Indonesian.",
|
||||
"cs": "Respond in Czech.",
|
||||
"ro": "Respond in Romanian.",
|
||||
"hu": "Respond in Hungarian.",
|
||||
"uk": "Respond in Ukrainian.",
|
||||
}
|
||||
|
||||
|
||||
async def lang_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
"""Handle /lang: set the preferred conversation language.
|
||||
|
||||
Stores the language code in the user profile. The AI will be instructed
|
||||
to respond in that language via the system prompt.
|
||||
|
||||
Args:
|
||||
update: Telegram update.
|
||||
context: PTB callback context.
|
||||
|
||||
Returns:
|
||||
None.
|
||||
"""
|
||||
await auto_detect_chat_id(update)
|
||||
text = update.message.text.strip()
|
||||
parts = text.split(maxsplit=1)
|
||||
|
||||
if len(parts) < 2 or not parts[1].strip():
|
||||
lines = ["🌐 Supported languages:"]
|
||||
for code, name in SUPPORTED_LANGUAGES.items():
|
||||
lines.append(f" /lang {code} — {name}")
|
||||
lines.append("")
|
||||
lines.append("Usage: /lang <code>")
|
||||
lines.append("Example: /lang pt")
|
||||
await update.message.reply_text("\n".join(lines))
|
||||
return
|
||||
|
||||
lang_code = parts[1].strip().lower()
|
||||
if lang_code not in SUPPORTED_LANGUAGES:
|
||||
await update.message.reply_text(
|
||||
f"❌ Unsupported language code: {lang_code}\n"
|
||||
"Use /lang without arguments to see supported languages."
|
||||
)
|
||||
return
|
||||
|
||||
profile = load_user_profile()
|
||||
profile["preferred_language"] = lang_code
|
||||
save_user_profile(profile)
|
||||
|
||||
language_name = SUPPORTED_LANGUAGES[lang_code]
|
||||
instruction = LANGUAGE_INSTRUCTION.get(lang_code, f"Respond in {language_name}.")
|
||||
await update.message.reply_text(
|
||||
f"✅ Preferred language set to: {language_name}\n\n"
|
||||
f"The AI will now respond in this language.\n"
|
||||
f"Instruction: {instruction}"
|
||||
)
|
||||
|
||||
|
||||
def get_language_instruction(profile: Dict[str, Any]) -> str:
|
||||
"""Return the language instruction for the system prompt.
|
||||
|
||||
Args:
|
||||
profile: User profile dict.
|
||||
|
||||
Returns:
|
||||
Language instruction string, or empty string if not set.
|
||||
"""
|
||||
lang = profile.get("preferred_language", "")
|
||||
if not lang or lang == "auto":
|
||||
return ""
|
||||
return LANGUAGE_INSTRUCTION.get(lang, "")
|
||||
|
||||
|
||||
# ===================== PROFILE UPDATE =====================
|
||||
|
||||
# Regex triggers for "note this in my profile" style commands; paired with the
|
||||
@@ -2680,6 +2810,9 @@ def build_system_prompt(profile: Dict[str, Any]) -> str:
|
||||
prompt += f"\n\nCurrent date: {current_date}."
|
||||
prompt += f"\nCurrent time: {current_time} ({time_period})."
|
||||
prompt += f"\nConfigured timezone: {get_timezone()}."
|
||||
language_instruction = get_language_instruction(profile)
|
||||
if language_instruction:
|
||||
prompt += f"\n\nLANGUAGE: {language_instruction}"
|
||||
prompt += (
|
||||
"\n\nIMPORTANT ABOUT UPDATED INFORMATION:"
|
||||
"\n- If the user's question asks for something factual, current, news, weather forecast, quote, future/past date, opening hours, updated address, etc., USE WEB SEARCH to answer."
|
||||
@@ -5678,6 +5811,7 @@ Agent Profile:
|
||||
/editagentprofile - Edit agent profile fields interactively
|
||||
/configagentprofile - Configure the agent profile interactively (name, personality, traits, notes)
|
||||
/addtoagentprofile <text> - Add a note/characteristic to the agent profile
|
||||
/lang <code> - Set the preferred conversation language (e.g., /lang pt)
|
||||
|
||||
Management:
|
||||
/newconfig - Reset everything and reconfigure the agent from scratch
|
||||
@@ -6916,6 +7050,7 @@ def main():
|
||||
app_instance.add_handler(CommandHandler("cancel", cancel_command))
|
||||
app_instance.add_handler(CommandHandler("addtouserprofile", addtouserprofile_command))
|
||||
app_instance.add_handler(CommandHandler("addtoagentprofile", addtoagentprofile_command))
|
||||
app_instance.add_handler(CommandHandler("lang", lang_command))
|
||||
app_instance.add_handler(CommandHandler("onboarding", onboarding_command))
|
||||
app_instance.add_handler(CommandHandler("debug", debug_command))
|
||||
app_instance.add_handler(CommandHandler("reload", reload_command))
|
||||
|
||||
+3
-2
@@ -85,7 +85,7 @@
|
||||
},
|
||||
"notes": "gosto também de programação; Nome é Marco; Marco descreveu uma prática sexual com um amigo: gosta de ficar de quatro chupando o pênis dele enquanto o amigo está deitado de costas, com o próprio cú exposto para que o amigo brinque com dedos. Ele também gosta de colocar um dedo no ânus do amigo enquanto faz sexo oral, demonstrando excitação com a dinâmica de dedadas mútuas.; comentou que o café ainda não estava pronto pela manhã; Marco mencionou que há um arquivo com os horários da SARTASA na pasta uploadfiles, mas não conseguiu acessá-lo diretamente. Ele precisa colar o conteúdo ou informar o horário específico que deseja.",
|
||||
"created_at": "2026-08-24T09:59:34.623658",
|
||||
"last_updated": "2026-10-25T17:27:09.533391",
|
||||
"last_updated": "2026-10-26T15:34:32.412594",
|
||||
"daily_routine": {
|
||||
"wake_up_time": "quando acordo de manhã e se meu pau estiver duro, eu gosto de já brincar de sexo e gozar as vezes (nem sempre gozar)",
|
||||
"breakfast_time": "",
|
||||
@@ -131,5 +131,6 @@
|
||||
],
|
||||
"diversos": [
|
||||
"em relação a sexo eu gosto que as conversas sejam picantes e usem termos bem populares"
|
||||
]
|
||||
],
|
||||
"preferred_language": "pt"
|
||||
}
|
||||
Reference in New Issue
Block a user