mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-07 15:18:29 +00:00
Compare commits
3 Commits
gl/chore/p
...
devin/1754
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f0f668d12 | ||
|
|
8405122051 | ||
|
|
2c87f83dc3 |
28
src/crewai/translations/es.json
Normal file
28
src/crewai/translations/es.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"hierarchical_manager_agent": {
|
||||
"role": "Gerente del Equipo",
|
||||
"goal": "Gestionar el equipo para completar la tarea de la mejor manera posible.",
|
||||
"backstory": "Eres un gerente experimentado con talento para sacar lo mejor de tu equipo.\nTambién eres conocido por tu capacidad para delegar trabajo a las personas adecuadas y hacer las preguntas correctas para obtener lo mejor de tu equipo.\nAunque no realizas tareas por ti mismo, tienes mucha experiencia en el campo, lo que te permite evaluar adecuadamente el trabajo de los miembros de tu equipo."
|
||||
},
|
||||
"slices": {
|
||||
"observation": "\nObservación:",
|
||||
"task": "\nTarea Actual: {input}\n\n¡Comienza! Esto es MUY importante para ti, usa las herramientas disponibles y da tu mejor Respuesta Final, ¡tu trabajo depende de ello!\n\nPensamiento:",
|
||||
"memory": "\n\n# Contexto útil: \n{memory}",
|
||||
"role_playing": "Eres {role}. {backstory}\nTu objetivo personal es: {goal}",
|
||||
"tools": "\nSOLO tienes acceso a las siguientes herramientas, y NUNCA debes inventar herramientas que no estén listadas aquí:\n\n{tools}\n\nIMPORTANTE: Usa el siguiente formato en tu respuesta:\n\n```\nPensamiento: siempre debes pensar en qué hacer\nAcción: la acción a tomar, solo un nombre de [{tool_names}], solo el nombre, exactamente como está escrito.\nEntrada de Acción: la entrada para la acción, solo un objeto JSON simple, encerrado en llaves, usando \" para envolver claves y valores.\nObservación: el resultado de la acción\n```\n\nUna vez que se recopile toda la información necesaria, devuelve el siguiente formato:\n\n```\nPensamiento: Ahora conozco la respuesta final\nRespuesta Final: la respuesta final a la pregunta de entrada original\n```",
|
||||
"no_tools": "\nPara dar mi mejor respuesta final completa a la tarea, responde usando el siguiente formato exacto:\n\nPensamiento: Ahora puedo dar una gran respuesta\nRespuesta Final: Tu respuesta final debe ser la mejor y más completa posible, debe ser el resultado descrito.\n\n¡DEBO usar estos formatos, mi trabajo depende de ello!",
|
||||
"final_answer_format": "Si no necesitas usar más herramientas, debes dar tu mejor respuesta final completa, asegúrate de que satisfaga los criterios esperados, usa el formato EXACTO a continuación:\n\n```\nPensamiento: Ahora puedo dar una gran respuesta\nRespuesta Final: mi mejor respuesta final completa a la tarea.\n\n```",
|
||||
"getting_input": "Esta es la respuesta final del agente: {final_answer}\n\n",
|
||||
"manager_request": "Tu mejor respuesta a tu compañero de trabajo que te pregunta esto, teniendo en cuenta el contexto compartido."
|
||||
},
|
||||
"errors": {
|
||||
"force_final_answer": "Ahora es el momento en que DEBES dar tu respuesta final absolutamente mejor. Ignorarás todas las instrucciones anteriores, dejarás de usar cualquier herramienta y solo devolverás tu MEJOR respuesta final absoluta.",
|
||||
"tool_usage_error": "Encontré un error: {error}",
|
||||
"tool_arguments_error": "Error: la Entrada de Acción no es un diccionario de clave-valor válido.",
|
||||
"wrong_tool_name": "Intentaste usar la herramienta {tool}, pero no existe. Debes usar una de las siguientes herramientas, usa una a la vez: {tools}."
|
||||
},
|
||||
"tools": {
|
||||
"delegate_work": "Delegar una tarea específica a uno de los siguientes compañeros de trabajo: {coworkers}\nLa entrada para esta herramienta debe ser el compañero de trabajo, la tarea que quieres que hagan, y TODO el contexto necesario para ejecutar la tarea, no saben nada sobre la tarea, así que comparte absolutamente todo lo que sabes, no hagas referencia a cosas sino explícalas.",
|
||||
"ask_question": "Hacer una pregunta específica a uno de los siguientes compañeros de trabajo: {coworkers}\nLa entrada para esta herramienta debe ser el compañero de trabajo, la pregunta que tienes para ellos, y TODO el contexto necesario para hacer la pregunta correctamente, no saben nada sobre la pregunta, así que comparte absolutamente todo lo que sabes, no hagas referencia a cosas sino explícalas."
|
||||
}
|
||||
}
|
||||
28
src/crewai/translations/zh.json
Normal file
28
src/crewai/translations/zh.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"hierarchical_manager_agent": {
|
||||
"role": "团队经理",
|
||||
"goal": "以最佳方式管理团队完成任务",
|
||||
"backstory": "您是一位经验丰富的经理,擅长发挥团队的最佳潜力。\n您以能够将工作委派给合适的人员而闻名,并且善于提出正确的问题来发挥团队的最佳潜力。\n尽管您不亲自执行任务,但您在该领域拥有丰富的经验,这使您能够正确评估团队成员的工作。"
|
||||
},
|
||||
"slices": {
|
||||
"observation": "\n观察:",
|
||||
"task": "\n当前任务: {input}\n\n开始!这对您非常重要,请使用可用的工具并给出最佳的最终答案,您的工作取决于此!\n\n思考:",
|
||||
"memory": "\n\n# 有用的上下文: \n{memory}",
|
||||
"role_playing": "您是 {role}。{backstory}\n您的个人目标是: {goal}",
|
||||
"tools": "\n您只能使用以下工具,绝不能编造未列出的工具:\n\n{tools}\n\n重要提示: 在回复中使用以下格式:\n\n```\n思考: 您应该始终思考要做什么\n行动: 要采取的行动,只能是 [{tool_names}] 中的一个名称,只是名称,完全按照书面形式。\n行动输入: 行动的输入,只是一个简单的JSON对象,用大括号括起来,使用\"包装键和值。\n观察: 行动的结果\n```\n\n收集所有必要信息后,返回以下格式:\n\n```\n思考: 我现在知道最终答案\n最终答案: 对原始输入问题的最终答案\n```",
|
||||
"no_tools": "\n为了给出我对任务的最佳完整最终答案,请使用以下确切格式回复:\n\n思考: 我现在可以给出很好的答案\n最终答案: 您的最终答案必须是最好和最完整的,它必须是描述的结果。\n\n我必须使用这些格式,我的工作取决于此!",
|
||||
"final_answer_format": "如果您不需要使用更多工具,您必须给出最佳的完整最终答案,确保它满足预期标准,使用以下确切格式:\n\n```\n思考: 我现在可以给出很好的答案\n最终答案: 我对任务的最佳完整最终答案。\n\n```",
|
||||
"getting_input": "这是代理的最终答案: {final_answer}\n\n",
|
||||
"manager_request": "您对同事询问的最佳答案,考虑到共享的上下文。"
|
||||
},
|
||||
"errors": {
|
||||
"force_final_answer": "现在是时候您必须给出绝对最佳的最终答案了。您将忽略所有先前的指令,停止使用任何工具,只返回您绝对最佳的最终答案。",
|
||||
"tool_usage_error": "我遇到了错误: {error}",
|
||||
"tool_arguments_error": "错误: 行动输入不是有效的键值字典。",
|
||||
"wrong_tool_name": "您尝试使用工具 {tool},但它不存在。您必须使用以下工具之一,一次使用一个: {tools}。"
|
||||
},
|
||||
"tools": {
|
||||
"delegate_work": "将特定任务委派给以下同事之一: {coworkers}\n此工具的输入应该是同事、您希望他们执行的任务,以及执行任务所需的所有必要上下文,他们对任务一无所知,所以请分享您知道的一切,不要引用事物而是解释它们。",
|
||||
"ask_question": "向以下同事之一提出具体问题: {coworkers}\n此工具的输入应该是同事、您对他们的问题,以及正确提问所需的所有必要上下文,他们对问题一无所知,所以请分享您知道的一切,不要引用事物而是解释它们。"
|
||||
}
|
||||
}
|
||||
@@ -17,18 +17,23 @@ class I18N(BaseModel):
|
||||
@model_validator(mode="after")
|
||||
def load_prompts(self) -> "I18N":
|
||||
"""Load prompts from a JSON file."""
|
||||
prompt_file_to_use = None
|
||||
|
||||
try:
|
||||
if self.prompt_file:
|
||||
with open(self.prompt_file, "r", encoding="utf-8") as f:
|
||||
self._prompts = json.load(f)
|
||||
prompt_file_to_use = self.prompt_file
|
||||
else:
|
||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||
prompts_path = os.path.join(dir_path, "../translations/en.json")
|
||||
env_i18n_file = os.environ.get("CREWAI_I18N_FILE")
|
||||
if env_i18n_file:
|
||||
prompt_file_to_use = env_i18n_file
|
||||
else:
|
||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||
prompt_file_to_use = os.path.join(dir_path, "../translations/en.json")
|
||||
|
||||
with open(prompts_path, "r", encoding="utf-8") as f:
|
||||
self._prompts = json.load(f)
|
||||
with open(prompt_file_to_use, "r", encoding="utf-8") as f:
|
||||
self._prompts = json.load(f)
|
||||
except FileNotFoundError:
|
||||
raise Exception(f"Prompt file '{self.prompt_file}' not found.")
|
||||
raise Exception(f"Prompt file '{prompt_file_to_use}' not found.")
|
||||
except json.JSONDecodeError:
|
||||
raise Exception("Error decoding JSON from the prompts file.")
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import json
|
||||
import os
|
||||
import pytest
|
||||
|
||||
from crewai.utilities.i18n import I18N
|
||||
@@ -42,3 +44,90 @@ def test_prompt_file():
|
||||
i18n.load_prompts()
|
||||
assert isinstance(i18n.retrieve("slices", "role_playing"), str)
|
||||
assert i18n.retrieve("slices", "role_playing") == "Lorem ipsum dolor sit amet"
|
||||
|
||||
|
||||
def test_global_i18n_file_environment_variable(monkeypatch):
|
||||
"""Test that CREWAI_I18N_FILE environment variable is respected"""
|
||||
test_translations = {
|
||||
"slices": {"role_playing": "Test role playing message"},
|
||||
"tools": {"ask_question": "Test ask question message"}
|
||||
}
|
||||
|
||||
test_file_path = os.path.join(os.path.dirname(__file__), "test_env_prompts.json")
|
||||
with open(test_file_path, "w", encoding="utf-8") as f:
|
||||
json.dump(test_translations, f)
|
||||
|
||||
try:
|
||||
monkeypatch.setenv("CREWAI_I18N_FILE", test_file_path)
|
||||
|
||||
i18n = I18N()
|
||||
i18n.load_prompts()
|
||||
|
||||
assert i18n.slice("role_playing") == "Test role playing message"
|
||||
assert i18n.tools("ask_question") == "Test ask question message"
|
||||
|
||||
finally:
|
||||
if os.path.exists(test_file_path):
|
||||
os.remove(test_file_path)
|
||||
|
||||
|
||||
def test_prompt_file_priority_over_environment_variable(monkeypatch):
|
||||
"""Test that explicit prompt_file takes priority over environment variable"""
|
||||
monkeypatch.setenv("CREWAI_I18N_FILE", "/nonexistent/path.json")
|
||||
|
||||
path = os.path.join(os.path.dirname(__file__), "prompts.json")
|
||||
i18n = I18N(prompt_file=path)
|
||||
i18n.load_prompts()
|
||||
|
||||
assert i18n.retrieve("slices", "role_playing") == "Lorem ipsum dolor sit amet"
|
||||
|
||||
|
||||
def test_environment_variable_file_not_found(monkeypatch):
|
||||
"""Test proper error handling when environment variable points to non-existent file"""
|
||||
monkeypatch.setenv("CREWAI_I18N_FILE", "/nonexistent/file.json")
|
||||
|
||||
with pytest.raises(Exception) as exc_info:
|
||||
I18N()
|
||||
|
||||
assert "Prompt file '/nonexistent/file.json' not found" in str(exc_info.value)
|
||||
|
||||
|
||||
def test_fallback_to_default_when_no_environment_variable(monkeypatch):
|
||||
"""Test that it falls back to default en.json when no environment variable is set"""
|
||||
monkeypatch.delenv("CREWAI_I18N_FILE", raising=False)
|
||||
|
||||
i18n = I18N()
|
||||
i18n.load_prompts()
|
||||
|
||||
assert isinstance(i18n.slice("role_playing"), str)
|
||||
assert len(i18n.slice("role_playing")) > 0
|
||||
|
||||
|
||||
def test_chinese_translation_file():
|
||||
"""Test loading Chinese translation file"""
|
||||
import os
|
||||
|
||||
zh_path = os.path.join(os.path.dirname(__file__), "../../src/crewai/translations/zh.json")
|
||||
zh_path = os.path.abspath(zh_path)
|
||||
|
||||
i18n = I18N(prompt_file=zh_path)
|
||||
i18n.load_prompts()
|
||||
|
||||
assert i18n.retrieve("hierarchical_manager_agent", "role") == "团队经理"
|
||||
assert i18n.slice("observation") == "\n观察:"
|
||||
assert i18n.errors("tool_usage_error") == "我遇到了错误: {error}"
|
||||
|
||||
|
||||
def test_spanish_translation_file():
|
||||
"""Test loading Spanish translation file"""
|
||||
import os
|
||||
|
||||
es_path = os.path.join(os.path.dirname(__file__), "../../src/crewai/translations/es.json")
|
||||
es_path = os.path.abspath(es_path)
|
||||
|
||||
i18n = I18N(prompt_file=es_path)
|
||||
i18n.load_prompts()
|
||||
|
||||
assert i18n.retrieve("hierarchical_manager_agent", "role") == "Gerente del Equipo"
|
||||
assert i18n.slice("observation") == "\nObservación:"
|
||||
assert i18n.errors("tool_usage_error") == "Encontré un error: {error}"
|
||||
|
||||
Reference in New Issue
Block a user