Модель чата возвращает пустой контент, когда я добавляю отложенное сообщение ToolMessage из запланированного обратного вPython

Программы на Python
Anonymous
 Модель чата возвращает пустой контент, когда я добавляю отложенное сообщение ToolMessage из запланированного обратного в

Сообщение Anonymous »

У меня есть планировщик, который запускает функцию инструмента позже (вне исходного обмена моделью пользователя и пользователем).
Когда наступает запланированное время, он отправляет ToolMessage обратно в модель чата, но модель возвращает пустое сообщение (content="") вместо ответа.
Это поток сообщений:

Код: Выделить всё

[HumanMessage] → [AIMessage(initiate scheduling)] →
[ToolMessage (scheduled a function)] →
[AIMessage(confirms scheduling)] → ... →
[ToolMessage (from scheduled function)]
Последнее сообщение ToolMessage создается при срабатывании запланированного обратного вызова.
Именно здесь и возникает проблема — модель просто возвращает пустую строку.
Запланированный обратный вызов:

Код: Выделить всё

def _task_reminder_callback(thread_id: str, task_description: str):
print(f"\n\n === AGENT: TASK REMINDER! (for thread: {thread_id}) === ")
print(f" TASK: {task_description} ")
print(" ======================================================= \n\n")

config = {"configurable": {"thread_id": thread_id, "user_id": "user_123"}}
workflow_instance = app_state.get("WORKFLOW")

state = workflow_instance.get_state(config)

# Find the most recent tool call for schedule_reminder
tool_call_id = None
if state and state.values and "messages" in state.values:
for msg in reversed(state.values["messages"]):
if hasattr(msg, 'tool_calls') and msg.tool_calls:
for tool_call in msg.tool_calls:
if tool_call.get('name') == 'schedule_reminder':
tool_call_id = tool_call.get('id')
break
if tool_call_id:
break

print(f'[DEBUG] tool_call_id: {tool_call_id}')

if workflow_instance:
try:
reminder_message = ToolMessage(
content=(
f"REMINDER: generate a natural sounding message to remind user "
f"that it's time to do this task:\n\n {task_description}.\n\n"
),
tool_call_id=tool_call_id
)

result = workflow_instance.invoke({"messages": reminder_message}, config=config)

print(f" === Successfully invoked workflow for reminder in thread {thread_id} === \n\n {result} === \n\n")
except Exception as e:
print(f"ERROR in _task_reminder_callback for thread {thread_id}: {e} !!! \n\n")
else:
print(f"ERROR: WORKFLOW not initialized. Cannot run reminder for thread {thread_id}")
Проблема
Когда эта запланированная функция запускается и я вызываю workflow_instance.invoke() с ToolMessage, модель чата возвращает пустое сообщение с содержимым AIMessage(content="") — она не «реагирует», как обычно, когда сообщение инструмента приходит непосредственно во время разговора поток.
Выход:

Код: Выделить всё

HumanMessage(content='ok', additional_kwargs={}, response_metadata={}, id='40ff741d-f298-4fe5-ad54-4e5539aa483c'), AIMessage(content='', additional_kwargs={'function_call': {'name': 'schedule_reminder', 'arguments': '{"time_str": "2025-10-26 13:06:00", "task_description": "drink water"}'}}, response_metadata={'prompt_feedback': {'block_reason': 0, 'safety_ratings': []}, 'finish_reason': 'STOP', 'model_name': 'gemini-2.0-flash', 'safety_ratings': []}, id='lc_run--464ab3c1-8fb3-4c4c-9876-2424c96ac78c-0', tool_calls=[{'name': 'schedule_reminder', 'args': {'time_str': '2025-10-26 13:06:00', 'task_description': 'drink water'}, 'id': 'a1e09652-4b50-4b5c-b2b9-29a280f1b1f6', 'type': 'tool_call'}], usage_metadata={'input_tokens': 1851, 'output_tokens': 30, 'total_tokens': 1881, 'input_token_details': {'cache_read': 0}}), ToolMessage(content="Error: 1 validation error for ScheduleReminderSchema\ntime_str\n  Value error, Time must be in the future. Current time is 2025-10-26 13:06:01.077565 [type=value_error, input_value='2025-10-26 13:06:00', input_type=str]\n    For further information visit https://errors.pydantic.dev/2.11/v/value_error\n Please fix your mistakes.", name='schedule_reminder', id='831e3acd-915c-4063-af40-6bdbd7b221ac', tool_call_id='a1e09652-4b50-4b5c-b2b9-29a280f1b1f6', status='error'), AIMessage(content='I am sorry. I made a mistake. The time must be in the future.  Let me try again.', additional_kwargs={'function_call': {'name': 'schedule_reminder', 'arguments': '{"time_str": "2025-10-26 13:10:00", "task_description": "drink water"}'}}, response_metadata={'prompt_feedback': {'block_reason': 0, 'safety_ratings': []}, 'finish_reason': 'STOP', 'model_name': 'gemini-2.0-flash', 'safety_ratings': []}, id='lc_run--4d55aeef-5b66-4a52-81d4-8f0265bc1b9e-0', tool_calls=[{'name': 'schedule_reminder', 'args': {'time_str': '2025-10-26 13:10:00', 'task_description': 'drink water'}, 'id': '5484ca4f-bdbb-4f64-9f75-66bec5bfbb00', 'type': 'tool_call'}], usage_metadata={'input_tokens': 2010, 'output_tokens': 53, 'total_tokens': 2063, 'input_token_details': {'cache_read': 0}}), ToolMessage(content="Successfully scheduled reminder: 'drink water' at 2025-10-26 13:10:00.", name='schedule_reminder', id='15469566-c614-455e-a311-590cc4cbdac8', tool_call_id='5484ca4f-bdbb-4f64-9f75-66bec5bfbb00'), AIMessage(content='I have scheduled a reminder for you to drink water at 2025-10-26 13:10:00.', additional_kwargs={}, response_metadata={'prompt_feedback': {'block_reason': 0, 'safety_ratings': []}, 'finish_reason': 'STOP', 'model_name': 'gemini-2.0-flash', 'safety_ratings': []}, id='lc_run--ff375360-aa24-4a47-9687-204b669c7c47-0', usage_metadata={'input_tokens': 2074, 'output_tokens': 33, 'total_tokens': 2107, 'input_token_details': {'cache_read': 0}}), ToolMessage(content="REMINDER: generate a natural sounding message to remind user that it's time to do this task:\n\n drink water.\n\n", id='b88ab321-c855-4fb0-b8b0-fe0d1836513d', tool_call_id='3d82238b-5b14-4e4c-a56b-a11545184409'), AIMessage(content='', additional_kwargs={}, response_metadata={'prompt_feedback': {'block_reason': 0, 'safety_ratings': []}, 'finish_reason': 'STOP', 'model_name': 'gemini-2.0-flash', 'safety_ratings': []}, id='lc_run--c1aaa8f5-261e-4b68-a163-61b47e493480-0', usage_metadata={'input_tokens': 2106, 'output_tokens': 0, 'total_tokens': 2106, 'input_token_details': {'cache_read': 0}})]}
Вопрос
Как правильно повторно внедрить отложенное сообщение ToolMessage в рабочий процесс, чтобы модель реагировала так же, как при обычном использовании инструмента?
Есть ли что-то особенное в том, как необходимо связать Tool_call_id или историю сообщений, чтобы модель знала, что делать?
Или мне нужно отправить сообщение другого типа (например, SystemMessage или AssistantMessage) при повторной активации модели после задержки?

Подробнее здесь: https://stackoverflow.com/questions/797 ... rom-a-sche

Вернуться в «Python»