| | from dotenv import load_dotenv |
| | from openai import OpenAI |
| | import re, json |
| |
|
| | load_dotenv(override=True) |
| | openai = OpenAI() |
| |
|
| | call_to_action = "Type something to manipulate, or 'exit' to quit." |
| |
|
| | def smart_capitalize(word): |
| | for i, c in enumerate(word): |
| | if c.isalpha(): |
| | return word[:i] + c.upper() + word[i+1:].lower() |
| | return word |
| |
|
| | def manipulate_string(input_string): |
| | input_string = input_string[::-1] |
| | words = re.split(r'\s+', input_string.strip()) |
| | capitalized_words = [smart_capitalize(word) for word in words] |
| | return ' '.join(capitalized_words) |
| |
|
| | manipulate_string_json = { |
| | "name": "manipulate_string", |
| | "description": "Use this tool to reverse the characters in the text the user enters, then to capitalize the first letter of each reversed word)", |
| | "parameters": { |
| | "type": "object", |
| | "properties": { |
| | "input_string": { |
| | "type": "string", |
| | "description": "The text the user enters" |
| | } |
| | }, |
| | "required": ["input_string"], |
| | "additionalProperties": False |
| | } |
| | } |
| |
|
| | tools = [{"type": "function", "function": manipulate_string_json}] |
| |
|
| | TOOL_FUNCTIONS = { |
| | "manipulate_string": manipulate_string |
| | } |
| |
|
| | def handle_tool_calls(tool_calls): |
| | results = [] |
| | for tool_call in tool_calls: |
| | tool_name = tool_call.function.name |
| | arguments = json.loads(tool_call.function.arguments) |
| | tool = TOOL_FUNCTIONS.get(tool_name) |
| | result = tool(**arguments) if tool else {} |
| |
|
| | |
| | content = result if isinstance(result, str) else json.dumps(result) |
| |
|
| | results.append({ |
| | "role": "tool", |
| | "content": content, |
| | "tool_call_id": tool_call.id |
| | }) |
| | return results |
| |
|
| | system_prompt = f"""You are a helpful assistant who takes text from the user and manipulates it in various ways. |
| | Currently you do the following: |
| | - reverse the string the user entered |
| | - convert to all lowercase letters so any words whose first letters were capitalized are now lowercase |
| | - convert the first letter of each word in the reversed string to uppercase |
| | Be professional, friendly and engaging, as if talking to a customer who came across your service. |
| | Do not output any additional text, just the result of the string manipulation. |
| | After outputting the text, prompt the user for the next input text with {call_to_action} |
| | With this context, please chat with the user, always staying in character. |
| | """ |
| |
|
| | def chat(message, history): |
| | messages = [{"role": "system", "content": system_prompt}] + history + [{"role": "user", "content": message}] |
| | done=False |
| | while not done: |
| | response = openai.chat.completions.create(model="gpt-4o-mini", messages=messages, tools=tools) |
| | finish_reason = response.choices[0].finish_reason |
| |
|
| | if finish_reason == "tool_calls": |
| | message = response.choices[0].message |
| | tool_calls = message.tool_calls |
| | results = handle_tool_calls(tool_calls) |
| | messages.append(message) |
| | messages.extend(results) |
| | else: |
| | done = True |
| | return response.choices[0].message.content |
| |
|
| | def main(): |
| | print("\nWelcome to the string manipulation chat!") |
| | print(f"{call_to_action}\n") |
| | history = [] |
| |
|
| | while True: |
| | user_input = input("") |
| | if user_input.lower() in {"exit", "quit"}: |
| | print("\nThanks for using our service!") |
| | break |
| |
|
| | response = chat(user_input, history) |
| | history.append({"role": "user", "content": user_input}) |
| | history.append({"role": "assistant", "content": response}) |
| | print(response) |
| |
|
| | if __name__ == "__main__": |
| | main() |
| |
|