* DocChatAgent: able to ingest Pandas dataframe, by first converting to Documents
see [tests/main/test_doc_chat_agent.py](https://github.com/langroid/langroid/blob/main/tests/main/test_doc_chat_agent.py),
* LanceDocChatAgent: ingest Pandas dataframe directly (without needing to convert to Documents)
see [tests/main/test_lance_doc_chat_agent](https://github.com/langroid/langroid/blob/main/tests/main/test_lance_doc_chat_agent.py)
* Task: new control mechanisms, which should replace the need for `llm_delegate`, `single_round`, but also enables more complex workflows, and is more clear and intuitive:
- when initializing a task, you can set 2 new params: `done_if_response` = list of Entities (Entity class), meaning if ANY of these entities
produces a non-empty response, the task is done. E.g. if you set it to [Entity.LLM],
this means the task is done as soon as there is a non-empty response from the LLM of the Task's Agent.
Similarly, `done_if_no_response` is a list of Entities, meaning if ANY of them produce an empty response, the task is done.
- An Agent's responders (`llm_response`, `user_response`, `agent_response` or tools) can now insert a string __PASS__ in their response, which tells the Task orchestrator to "pass-thru" the current pending message and not update it.
These mechanisms are illustrated in these tests, showing various scenarios of multi-agent + tools: [tests/main/test_task.py](https://github.com/langroid/langroid/blob/main/tests/main/test_task.py),