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

  1. NjiraToolHooks wraps CrewAI tools with pre/post enforcement
  2. Tool inputs and outputs are validated against configured policies
  3. Traces capture the full crew execution flow