Skip to main content

ChefProcess

ChefProcess adds AI capabilities to your Capela applications. It provides a way to integrate AI into your app, allowing it to understand and respond to user input.

Components

ChefProcess consists of:

  • ChefProcess: Handles AI interactions
  • ChefMessage: Messages between your app and the AI
  • Image Class: Defines the AI's capabilities and behavior
  • Message List: Stores conversation history

Creating an AI-Enabled App

1. Define an Image Class

The Image Class defines the AI's capabilities. Its docstring describes the AI's personality and capabilities, and its methods provide specific functionality.

from builtins import Node, Field

class MyAIImage(Node):
"""
You are a helpful assistant designed to be a personal trainer.
You help users with fitness goals, training schedules, and exercise advice.
"""

def get_exercise_info(self, exercise_id: str) -> str:
"""Get information about an exercise."""
if exercise_id not in ALL_EXERCISES:
raise ValueError(f"Exercise with ID {exercise_id} not found.")

return f"Here's how to do the {exercise_id} exercise."

2. Create a ChefProcess Instance

from builtins import Node, Field, ChefProcess, ChefMessage, MessageHeader, ChefMessageBodyText, List

class MyAIApp(Node):
image: MyAIImage = Field(default_factory=MyAIImage)
process: ChefProcess = Field(default_factory=ChefProcess)
messages: List[ChefMessage] = Field(default_factory=list)

def init_process(self):
this.process = ChefProcess(image=this.image.make_reference())

3. Set Up Message Handling

def send_message(self, message: str) -> None:
msg = ChefMessage(
header=MessageHeader(
source=this.make_reference(),
destination=this.process.make_reference(),
in_reply_to=None,
reply_to=this.make_reference(),
),
body=ChefMessageBodyText(text=message)
)

this.messages.append(msg)
this.process.send_message(msg)

Complete Example

from builtins import Node, Field, ChefProcess, ChefMessage, MessageHeader, ChefMessageBodyText, List

ALL_EXERCISES = ["biceps_curl", "tricep_extension", "shoulder_press"]

class ChefTestImage(Node):
"""
You are a helpful assistant designed to be a personal trainer.
You help users with fitness goals, training schedules, and exercise advice.
"""

def swap_exercise(self, exercise_id: str) -> str:
"""Switch to a different exercise."""
if exercise_id not in ALL_EXERCISES:
raise ValueError(f"Exercise with ID {exercise_id} not found.")

return f"You are now in the exercise with ID {exercise_id}."

def get_exercise_info(self, exercise_id: str) -> str:
"""Get information about an exercise."""
if exercise_id not in ALL_EXERCISES:
raise ValueError(f"Exercise with ID {exercise_id} not found.")

return f"Here's how to do the {exercise_id} exercise."

class ChefChat(Node):
image: ChefTestImage = Field(default_factory=ChefTestImage)
process: ChefProcess = Field(default_factory=ChefProcess)
messages: List[ChefMessage] = Field(default_factory=list)

def reset(self):
this.process = ChefProcess(image=this.image.make_reference())
this.messages = []

def add_message(self, message: str, sender_name: str = "Unknown"):
if sender_name == "Unknown":
sender_name = this.make_reference()

msg = ChefMessage(
header=MessageHeader(
source=sender_name,
destination=this.make_reference(),
in_reply_to=None,
reply_to=this.make_reference(),
),
body=ChefMessageBodyText(text=message)
)

this.messages.append(msg)
this.process.send_message(msg)
return {"status": "success", "message": "Message added successfully"}