141 lines
7.1 KiB
Python
141 lines
7.1 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import asyncio
|
|
import logging
|
|
|
|
from samples.concepts.setup.chat_completion_services import Services, get_chat_completion_service_and_request_settings
|
|
from semantic_kernel import Kernel
|
|
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
|
|
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
|
|
from semantic_kernel.connectors.ai.prompt_execution_settings import PromptExecutionSettings
|
|
from semantic_kernel.contents.chat_history import ChatHistory
|
|
from semantic_kernel.core_plugins.crew_ai import CrewAIEnterprise
|
|
from semantic_kernel.functions.kernel_parameter_metadata import KernelParameterMetadata
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
|
|
async def using_crew_ai_enterprise():
|
|
# Create an instance of the CrewAI Enterprise Crew
|
|
async with CrewAIEnterprise() as crew:
|
|
#####################################################################
|
|
# Using the CrewAI Enterprise Crew directly #
|
|
#####################################################################
|
|
|
|
# The required inputs for the Crew must be known in advance. This example is modeled after the
|
|
# Enterprise Content Marketing Crew Template and requires the following inputs:
|
|
inputs = {"company": "CrewAI", "topic": "Agentic products for consumers"}
|
|
|
|
# Invoke directly with our inputs
|
|
kickoff_id = await crew.kickoff(inputs)
|
|
print(f"CrewAI Enterprise Crew kicked off with ID: {kickoff_id}")
|
|
|
|
# Wait for completion
|
|
result = await crew.wait_for_crew_completion(kickoff_id)
|
|
print("CrewAI Enterprise Crew completed with the following result:")
|
|
print(result)
|
|
|
|
#####################################################################
|
|
# Using the CrewAI Enterprise as a Plugin #
|
|
#####################################################################
|
|
|
|
# Define the description of the Crew. This will used as the semantic description of the plugin.
|
|
crew_description = (
|
|
"Conducts thorough research on the specified company and topic to identify emerging trends,"
|
|
"analyze competitor strategies, and gather data-driven insights."
|
|
)
|
|
|
|
# The required inputs for the Crew must be known in advance. This example is modeled after the
|
|
# Enterprise Content Marketing Crew Template and requires string inputs for the company and topic.
|
|
# We need to describe the type and purpose of each input to allow the LLM to invoke the crew as expected.
|
|
crew_input_parameters = [
|
|
KernelParameterMetadata(
|
|
name="company",
|
|
type="string",
|
|
type_object=str,
|
|
description="The name of the company that should be researched",
|
|
is_required=True,
|
|
),
|
|
KernelParameterMetadata(
|
|
name="topic",
|
|
type="string",
|
|
type_object=str,
|
|
description="The topic that should be researched",
|
|
is_required=True,
|
|
),
|
|
]
|
|
|
|
# Create the CrewAI Plugin. This builds a plugin that can be added to the Kernel and invoked like any other
|
|
# plugin. The plugin will contain the following functions:
|
|
# - kickoff: Starts the Crew with the specified inputs and returns the Id of the scheduled kickoff.
|
|
# - kickoff_and_wait: Starts the Crew with the specified inputs and waits for the Crew to complete before
|
|
# returning the result.
|
|
# - wait_for_completion: Waits for the specified Crew kickoff to complete and returns the result.
|
|
# - get_status: Gets the status of the specified Crew kickoff.
|
|
crew_plugin = crew.create_kernel_plugin(
|
|
name="EnterpriseContentMarketingCrew",
|
|
description=crew_description,
|
|
parameters=crew_input_parameters,
|
|
)
|
|
|
|
# Configure the kernel for chat completion and add the CrewAI plugin.
|
|
kernel, chat_completion, settings = configure_kernel_for_chat()
|
|
kernel.add_plugin(crew_plugin)
|
|
|
|
# Create a chat history to store the system message, initial messages, and the conversation.
|
|
history = ChatHistory()
|
|
history.add_system_message("You are an AI assistant that can help me with research.")
|
|
history.add_user_message(
|
|
"I'm looking for emerging marketplace trends about Crew AI and their concumer AI products."
|
|
)
|
|
|
|
# Invoke the chat completion service with enough information for the CrewAI plugin to be invoked.
|
|
response = await chat_completion.get_chat_message_content(history, settings, kernel=kernel)
|
|
print(response)
|
|
|
|
# expected output:
|
|
# INFO:semantic_kernel.connectors.ai.open_ai.services.open_ai_handler:OpenAI usage: ...
|
|
# INFO:semantic_kernel.connectors.ai.chat_completion_client_base:processing 1 tool calls in parallel.
|
|
# INFO:semantic_kernel.kernel:Calling EnterpriseContentMarketingCrew-kickoff_and_wait function with args:
|
|
# {"company":"Crew AI","topic":"emerging marketplace trends in consumer AI products"}
|
|
# INFO:semantic_kernel.functions.kernel_function:Function EnterpriseContentMarketingCrew-kickoff_and_wait
|
|
# invoking.
|
|
# INFO:semantic_kernel.core_plugins.crew_ai.crew_ai_enterprise:CrewAI Crew kicked off with Id: *****
|
|
# INFO:semantic_kernel.core_plugins.crew_ai.crew_ai_enterprise:CrewAI Crew with kickoff Id: ***** completed with
|
|
# status: SUCCESS
|
|
# INFO:semantic_kernel.functions.kernel_function:Function EnterpriseContentMarketingCrew-kickoff_and_wait
|
|
# succeeded.
|
|
# Here are some emerging marketplace trends related to Crew AI and their consumer AI products, along with
|
|
# suggested content pieces to explore these trends: ...
|
|
|
|
|
|
def configure_kernel_for_chat() -> tuple[Kernel, ChatCompletionClientBase, PromptExecutionSettings]:
|
|
kernel = Kernel()
|
|
|
|
# You can select from the following chat completion services that support function calling:
|
|
# - Services.OPENAI
|
|
# - Services.AZURE_OPENAI
|
|
# - Services.AZURE_AI_INFERENCE
|
|
# - Services.ANTHROPIC
|
|
# - Services.BEDROCK
|
|
# - Services.GOOGLE_AI
|
|
# - Services.MISTRAL_AI
|
|
# - Services.OLLAMA
|
|
# - Services.ONNX
|
|
# - Services.VERTEX_AI
|
|
# - Services.DEEPSEEK
|
|
# Please make sure you have configured your environment correctly for the selected chat completion service.
|
|
chat_completion_service, request_settings = get_chat_completion_service_and_request_settings(Services.OPENAI)
|
|
|
|
# Configure the function choice behavior. Here, we set it to Auto, where auto_invoke=True by default.
|
|
# With `auto_invoke=True`, the model will automatically choose and call functions as needed.
|
|
request_settings.function_choice_behavior = FunctionChoiceBehavior.Auto()
|
|
|
|
# Pass the request settings to the kernel arguments.
|
|
kernel.add_service(chat_completion_service)
|
|
return kernel, chat_completion_service, request_settings
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(using_crew_ai_enterprise())
|