update cmd hitl

This commit is contained in:
zachary62 2025-05-27 00:07:27 -04:00
parent 039bb1b206
commit 55bd7c6819
6 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,26 @@
from pocketflow import Flow
from .nodes import GetTopicNode, GenerateJokeNode, GetFeedbackNode
def create_joke_flow() -> Flow:
"""Creates and returns the joke generation flow."""
# Create nodes
get_topic_node = GetTopicNode()
generate_joke_node = GenerateJokeNode()
get_feedback_node = GetFeedbackNode()
# Connect nodes
# GetTopicNode -> GenerateJokeNode (default action)
get_topic_node >> generate_joke_node
# GenerateJokeNode -> GetFeedbackNode (default action)
generate_joke_node >> get_feedback_node
# GetFeedbackNode actions:
# "Approve" -> Ends the flow (no further connection)
# "Disapprove" -> GenerateJokeNode
# get_feedback_node.connect_to(generate_joke_node, action="Disapprove")
get_feedback_node - "Disapprove" >> generate_joke_node # Alternative syntax
# Create flow starting with the input node
joke_flow = Flow(start=get_topic_node)
return joke_flow

View File

@ -0,0 +1,24 @@
from .flow import create_joke_flow
def main():
"""Main function to run the joke generator application."""
print("Welcome to the Command-Line Joke Generator!")
# Initialize the shared store as per the design
shared = {
"topic": None,
"current_joke": None,
"disliked_jokes": [],
"user_feedback": None
}
# Create the flow
joke_flow = create_joke_flow()
# Run the flow
joke_flow.run(shared)
print("\nThanks for using the Joke Generator!")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,61 @@
from pocketflow import Node
from .utils.call_llm import call_llm
class GetTopicNode(Node):
"""Prompts the user to enter the topic for the joke."""
def exec(self, _shared):
return input("What topic would you like a joke about? ")
def post(self, shared, _prep_res, exec_res):
shared["topic"] = exec_res
# No specific action needed, default will move to next connected node
return "default"
class GenerateJokeNode(Node):
"""Generates a joke based on the topic and any previous feedback."""
def prep(self, shared):
topic = shared.get("topic", "anything") # Default to "anything" if no topic
disliked_jokes = shared.get("disliked_jokes", [])
prompt = f"Please generate a joke about {topic}."
if disliked_jokes:
disliked_str = "; ".join(disliked_jokes)
prompt = f"The user did not like the following jokes: [{disliked_str}]. Please generate a new, different joke about {topic}."
return prompt
def exec(self, prep_res):
return call_llm(prep_res) # prep_res is the prompt
def post(self, shared, _prep_res, exec_res):
shared["current_joke"] = exec_res
print(f"\nJoke: {exec_res}")
return "default"
class GetFeedbackNode(Node):
"""Presents the joke to the user and asks for approval."""
# prep is not strictly needed as current_joke is printed by GenerateJokeNode
# but we can read it if we want to display it again here for example.
# def prep(self, shared):
# return shared.get("current_joke")
def exec(self, _prep_res):
while True:
feedback = input("Did you like this joke? (yes/no): ").strip().lower()
if feedback in ["yes", "y", "no", "n"]:
return feedback
print("Invalid input. Please type 'yes' or 'no'.")
def post(self, shared, _prep_res, exec_res):
if exec_res in ["yes", "y"]:
shared["user_feedback"] = "approve"
print("Great! Glad you liked it.")
return "Approve" # Action to end the flow
else: # "no" or "n"
shared["user_feedback"] = "disapprove"
current_joke = shared.get("current_joke")
if current_joke:
if "disliked_jokes" not in shared:
shared["disliked_jokes"] = []
shared["disliked_jokes"].append(current_joke)
print("Okay, let me try another one.")
return "Disapprove" # Action to loop back to GenerateJokeNode

View File

@ -0,0 +1,7 @@
# Add any project-specific dependencies here.
# For example:
# openai
# anthropic
pocketflow>=0.0.1
openai>=1.0.0

View File

@ -0,0 +1,17 @@
import os
from openai import OpenAI
def call_llm(prompt: str) -> str:
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "your-api-key"))
r = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}]
)
return r.choices[0].message.content
if __name__ == "__main__":
print("Testing real LLM call:")
joke_prompt = "Tell me a short joke about a programmer."
print(f"Prompt: {joke_prompt}")
response = call_llm(joke_prompt)
print(f"Response: {response}")