CrewAI Basic
Hook NjiraAI into CrewAI tool execution for enforcement and tracing.
This example shows how to enforce policies on CrewAI tool calls.
Full code
import asyncio
import os
from crewai import Agent, Crew, Task, Tool
from njiraai import NjiraAI
from njiraai_crewai import NjiraToolHooks
async def main():
njira = NjiraAI(
api_key=os.environ["NJIRA_API_KEY"],
project_id=os.environ["NJIRA_PROJECT_ID"],
mode="active",
)
# Create hooks for tool enforcement
hooks = NjiraToolHooks(njira)
# Define a tool
def search(query: str) -> str:
return f"Search results for: {query}"
search_tool = Tool(
name="search",
description="Searches the web",
func=search,
)
# Apply hooks to tools
wrapped_tools = hooks.wrap_tools([search_tool])
# Create agent with wrapped tools
researcher = Agent(
role="Researcher",
goal="Find information about topics",
backstory="You are a research assistant",
tools=wrapped_tools,
)
# Create task
task = Task(
description="Search for information about NjiraAI",
agent=researcher,
expected_output="A summary of NjiraAI",
)
# Run crew
crew = Crew(agents=[researcher], tasks=[task])
result = crew.kickoff()
print(f"Result: {result}")
# Flush traces
await njira.flush()
if __name__ == "__main__":
asyncio.run(main())
Run it
cd sdks/python/examples/crewai-basic
uv sync
NJIRA_API_KEY=your-key NJIRA_PROJECT_ID=your-project OPENAI_API_KEY=your-openai-key uv run python main.py
What's happening
NjiraToolHookswraps CrewAI tools with pre/post enforcement- Tool inputs and outputs are validated against configured policies
- Traces capture the full crew execution flow