* (Exact) Infinite-loop detection, see [Task._maybe_infinite_loop](https://github.com/langroid/langroid/blob/main/langroid/agent/task.py);
Throw InfiniteLoopException when a possible infinite loop is detected.
By default, loops of up to 10 messages are detected (configurable). Note that "Exact" loop detection means this only detects exactly-repeating cycles of k messages (k <= 10), e.g. a n i m a l m a l m a l m a l...
In other words we don't detect cases where the LLM (or other entity) is generating "essentially the same, but slightly different message" repeatedly.
Configs for Infinite loop detection are in `TaskConfig` in `Task.py`.
* Global settings.max_turns (default -1, meaning not used) can additionally be used to guard against infinite loops. In pytest conftest.py it is set to 100, so any task will run at most 100 turns.
* Tolerant tool detection when `request` field is inside `properties` field
* "" message addressing: any entity can address any other entity of the agent ("llm", "user", "agent"), or any other sub-task by name. This is an alternative to using "SEND_TO:<entity_name>", or using the `RecipientTool` to address messages to a specific recipient. The advantage of using RecipientTool is that since it is a tool, the tool handler fallback method can detect that the tool is not being used, and send a reminder to the LLM to clarify who it is addressing the message to.
* In non-interactive mode, wait for user input if "user" is explicitly addressed
* Misc improvements:
- `ToolMessage` instructions reminding LLM to use `request` field (gpt-4o often forgets).
- `RecipientTool`: allow default recipient
- Bug fix: chainlit examples that had modifiable LLM settings were not using the changed LLM, but now do