showcase/shell-docs/src/content/docs/integrations/crewai-flows/advanced/emit-messages.mdx
While most agent interactions happen automatically through shared state updates as the agent runs, you can also manually send messages from within your agent code to provide immediate feedback to users.
<video
src="https://cdn.copilotkit.ai/docs/copilotkit/images/coagents/emit-messages.mp4"
className="rounded-lg shadow-xl"
loop
playsInline
controls
autoPlay
muted
/>
<Callout>
This video shows the result of npx copilotkit@latest init with the
implementation section applied to it!
</Callout>
In CrewAI, messages are only emitted when a function is completed. CopilotKit allows you to manually emit messages in the middle of a function's execution to provide immediate feedback to the user.
Manually emitted messages are great for when you don't want to wait for the function to complete and you:
<Tabs groupId="language_crewai-flows_agent" items={['Python']} default="Python" persist>
<Tab value="Python">
```python
from litellm import completion
from crewai.flow.flow import start
from copilotkit.crewai import copilotkit_emit_message # [!code highlight]
# ...
@start()
async def start(self):
# [!code highlight:2]
intermediate_message = "Thinking really hard..."
await copilotkit_emit_message(intermediate_message)
# simulate a long running task
await asyncio.sleep(2)
response = copilotkit_stream(
completion(
model="openai/gpt-5.4",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
*self.state["messages"]
],
stream=True
)
)
message = response.choices[0]["message"]
self.state["messages"].append(message)
```
</Tab>
</Tabs>
</Step>
<Step>
### Give it a try!
Now when you talk to your agent you'll notice that it immediately responds with the message "Thinking really hard..."
before giving you a response 2 seconds later.
</Step>