Spaces:
Running
Running
| 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 # no letters to capitalize | |
| 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 {} | |
| # Remove quotes if result is a plain string | |
| 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() | |