Files
Python/chatgpt.py
T

170 lines
5.9 KiB
Python
Raw Normal View History

2025-07-07 09:27:45 -07:00
#!/usr/bin/python3
2025-07-07 09:38:21 -07:00
# Description: A command-line interface to https://chat.openai.com/chat
2025-07-07 09:27:45 -07:00
# Usage: python3 chatgpt.py
# Author: Justin Oros
# Source: https://github.com/JustinOros
import openai
import os
2025-07-07 10:05:05 -07:00
import sys
from pathlib import Path
2025-07-07 09:27:45 -07:00
def get_api_key():
api_key = os.getenv("OPENAI_API_KEY")
2025-07-07 10:05:05 -07:00
if api_key:
return api_key
# Prompt user for input
print("OpenAI API key not found.")
print("Please paste your OpenAI API key below.")
print("If you don't have one, you can create it here: https://platform.openai.com/account/api-keys")
api_key = input("Enter your API key: ").strip()
# Save the key to shell config for next time
shell = os.getenv("SHELL", "")
shell_config = None
if "zsh" in shell:
shell_config = Path.home() / ".zshrc"
elif "bash" in shell:
shell_config = Path.home() / ".bashrc"
else:
print("Unknown shell; please manually add the following to your shell config:")
print(f'export OPENAI_API_KEY="{api_key}"')
return api_key
export_line = f'\nexport OPENAI_API_KEY="{api_key}"\n'
try:
with open(shell_config, "a") as f:
f.write(export_line)
print(f"✅ API key saved to {shell_config}. It will be available next time you launch the terminal.")
except Exception as e:
print(f"⚠️ Failed to save API key to {shell_config}: {e}")
print("You can set it manually by adding:")
print(f'export OPENAI_API_KEY="{api_key}"')
return api_key
2025-07-07 09:27:45 -07:00
def show_help():
help_text = """
Available Commands:
- 'new' : Start a new conversation (clear the chat history).
2025-07-07 12:21:07 -07:00
- 'exit', 'quit', 'bye' : End the conversation and exit the script.
2025-07-07 09:27:45 -07:00
- 'help' : Show this help message with a list of commands.
- 'model' : Show the current model or available models.
- 'model=<model_name>' : Switch to the specified model (e.g., 'model=gpt-4').
2025-07-07 12:21:07 -07:00
- 'output' : Save the last ChatGPT response to a file (auto-named).
- 'output=<filename>' : Save the last ChatGPT response to the given filename.
2025-07-07 09:27:45 -07:00
"""
print(help_text)
def chat_with_gpt():
current_model = "gpt-3.5-turbo"
2025-07-07 09:38:21 -07:00
available_models = ["gpt-3.5-turbo", "gpt-4"]
2025-07-07 10:05:05 -07:00
last_response = ""
2025-07-07 09:38:21 -07:00
2025-07-07 09:27:45 -07:00
print(f"ChatGPT: Hello. You are currently using the '{current_model}' model.")
print("Type 'help' for a list of internal commands.")
2025-07-07 09:38:21 -07:00
conversation_history = []
2025-07-07 09:27:45 -07:00
while True:
user_input = input("User: ")
if user_input.lower() == "help":
show_help()
continue
if user_input.lower() == "new":
print("ChatGPT: Starting a new conversation...")
2025-07-07 09:38:21 -07:00
conversation_history = []
last_response = ""
2025-07-07 09:27:45 -07:00
print(f"ChatGPT: Hello. You are using the '{current_model}' model. How can I help you today?")
continue
if user_input.lower() in ["exit", "quit", "bye"]:
print("ChatGPT: Goodbye!")
break
if user_input.lower().startswith("model="):
2025-07-07 12:21:07 -07:00
model_name = user_input.split("=", 1)[1].strip()
2025-07-07 09:27:45 -07:00
if model_name in available_models:
current_model = model_name
print(f"ChatGPT: Switched to the '{current_model}' model.")
else:
print(f"ChatGPT: '{model_name}' is not a valid model. Available models are: {', '.join(available_models)}.")
continue
if user_input.lower() == "model":
print(f"ChatGPT: You are currently using the '{current_model}' model.")
print(f"Available models: {', '.join(available_models)}.")
continue
2025-07-07 12:21:07 -07:00
if user_input.lower().startswith("output"):
2025-07-07 09:38:21 -07:00
if not last_response:
print("ChatGPT: No response available to save.")
continue
2025-07-07 12:21:07 -07:00
# Determine extension based on code block
def get_extension(content):
if "```python" in content:
return "py"
elif "```html" in content:
return "html"
elif "```json" in content:
return "json"
elif "```bash" in content:
return "sh"
else:
return "txt"
# Parse optional filename
if "=" in user_input:
filename = user_input.split("=", 1)[1].strip()
if "." not in filename:
ext = get_extension(last_response)
filename = f"{filename}.{ext}"
2025-07-07 09:38:21 -07:00
else:
2025-07-07 12:21:07 -07:00
ext = get_extension(last_response)
filename = f"chatgpt-output.{ext}"
2025-07-07 09:38:21 -07:00
try:
content = last_response
if "```" in content:
2025-07-07 12:21:07 -07:00
# Extract only the content within the triple backticks
2025-07-07 09:38:21 -07:00
content = content.split("```")[1]
if "\n" in content:
2025-07-07 10:05:05 -07:00
content = "\n".join(content.split("\n")[1:])
2025-07-07 09:38:21 -07:00
content = content.strip("`").strip()
with open(filename, "w") as f:
f.write(content)
print(f"ChatGPT: Output saved to '{filename}'")
except Exception as e:
print(f"ChatGPT: Failed to save output: {e}")
continue
2025-07-07 09:27:45 -07:00
conversation_history.append({"role": "user", "content": user_input})
try:
response = openai.ChatCompletion.create(
2025-07-07 09:38:21 -07:00
model=current_model,
2025-07-07 09:27:45 -07:00
messages=conversation_history,
max_tokens=150
)
chatgpt_reply = response['choices'][0]['message']['content']
print(f"ChatGPT: {chatgpt_reply}")
2025-07-07 09:38:21 -07:00
last_response = chatgpt_reply
2025-07-07 09:27:45 -07:00
conversation_history.append({"role": "assistant", "content": chatgpt_reply})
except Exception as e:
print(f"Error: {e}")
break
if __name__ == "__main__":
2025-07-07 10:05:05 -07:00
openai.api_key = get_api_key()
2025-07-07 09:27:45 -07:00
chat_with_gpt()
2025-07-07 12:21:07 -07:00