summaryrefslogtreecommitdiff
path: root/cli.py
diff options
context:
space:
mode:
Diffstat (limited to 'cli.py')
-rwxr-xr-xcli.py137
1 files changed, 91 insertions, 46 deletions
diff --git a/cli.py b/cli.py
index 843dd68..b940d55 100755
--- a/cli.py
+++ b/cli.py
@@ -3,11 +3,12 @@
import argparse
import os
import sys
+import json
import ai_api_module
#this is the CLI program used to interact with the GAI python module.
-default_model=None
+default_model = "gemini-2.0-flash-exp"
def main():
"""Main function to parse arguments and execute commands"""
@@ -15,69 +16,95 @@ def main():
parser.add_argument(
"--apikey", default=os.getenv("GEMINI_API_KEY"), help="API key for the service"
)
- parser.add_argument("--modelid", default=default_model, help=f"ID of the model to use (default={default_model}")
+ parser.add_argument("--modelid", default=default_model, help=f"ID of the model to use (default={default_model})")
parser.add_argument("--list-models", action="store_true", help="list the available models")
- parser.add_argument("--assistantid", default="default_chatbot", help="ID of the assistant")
- parser.add_argument("--list-assistants", "--list-a", "--list-assistant", action='store_true', help='list all the available assistants')
- parser.add_argument('--list-conversations', '--list-conversation', '--list-convo', '--list-c', action='store_true', help='list previous conversations')
+
+ # Conversation management
+ parser.add_argument("--new", "-n", action="store_true", help="Start a new conversation")
+ parser.add_argument("--save-conversation", metavar="FILE", help="Save conversation to file")
+ parser.add_argument("--load-conversation", metavar="FILE", help="Load conversation from file")
+ parser.add_argument("--list-conversations", action="store_true", help="List saved conversations")
+ parser.add_argument("--clear", action="store_true", help="Clear conversation history")
+ parser.add_argument("--system-instruction", metavar="TEXT", help="Set system instruction for the conversation")
+
+ # Query parameters
parser.add_argument("--query", "-q", default="", help="Query to be sent to the assistant")
parser.add_argument("--topp", type=float, default=0.9, help="Top P value for the model")
- parser.add_argument(
- "--temperature", type=float, default=0.7, help="Temperature value for the model"
- )
+ parser.add_argument("--temperature", type=float, default=0.7, help="Temperature value for the model")
+ parser.add_argument("--max-tokens", type=int, default=8192, help="Maximum output tokens")
parser.add_argument("--stream", action="store_true", help="Enable streaming response")
parser.add_argument("--no-stream", action="store_true", help="Disable streaming response")
- parser.add_argument("--output_mode", "-o", nargs=1, action="store", default='text', help="just output the json")
+ parser.add_argument("--output_mode", "-o", default='text', help="Output mode (text or json)")
+ parser.add_argument("--count-tokens", action="store_true", help="Count tokens in query without sending")
- #parser.add_argument("--file-health", action="store_true", help="")
- #parser.add_argument("--file-list", action="store_true", help="List all uploaded files")
- #parser.add_argument("--file-upload", help="Upload a file to the service")
- #parser.add_argument("--file-status", help="Check status of a file by ID")
- #parser.add_argument("--file-purpose", default="assistants", help="Purpose of the file")
- #parser.add_argument("--attach-files", nargs="*", help="File IDs to attach to the query")
-
- parser.add_argument("--new", "-n", help="force new session and new chat", action="store_true", default=False) #TODO: solidify a good approach here
-
parser.add_argument("extra_query", nargs="*")
args = parser.parse_args()
- # Try to get API key if not provided
+ # Get API key
if args.apikey:
ai_api_module.api_key = args.apikey
else:
ai_api_module.get_api_key()
if not ai_api_module.api_key:
- print("Error: API key not provided")
+ print("Error: API key not provided. Set GEMINI_API_KEY environment variable.")
sys.exit(1)
- if args.list_models:
- res = ai_api_module.list_models(args.output_mode)
- if res[0]:
- for m in res[1]:
- print(str(m))
- #print(f" ModelID: {m['id']}\n Description: {m['description']}\n Tokens: {m['max_completion_tokens']}\n Modalities: {str(m['modalities'])}")
- print()
+ # Handle system instruction
+ if args.system_instruction:
+ ai_api_module.set_system_instruction(args.system_instruction)
+ print(f"System instruction set")
+
+ # Handle conversation management
+ if args.new:
+ ai_api_module.clear_conversation()
+ print("Started new conversation")
+
+ if args.load_conversation:
+ if ai_api_module.load_conversation(args.load_conversation):
+ print(f"Loaded conversation from {args.load_conversation}")
else:
- print('error: ')
- print(str(res[1].text))
- return
-
+ print(f"Failed to load conversation from {args.load_conversation}")
+ sys.exit(1)
+
if args.list_conversations:
- res = ai_api_module.list_conversations(args.output_mode)
- print(res)
- return
-
- if args.list_assistants:
- res = ai_api_module.list_assistants(args.output_mode)
- if res[0]:
- for a in res[1]:
- print(f" ID: {a['id']}\n Name: {a['display_name']}")
- print()
+ success, result = ai_api_module.list_saved_conversations()
+ if success:
+ if not result:
+ print("No saved conversations found")
+ else:
+ print("Saved conversations:")
+ for conv in result:
+ print(f" {conv['filename']}")
+ print(f" Saved: {conv['saved_at']}")
+ print(f" Messages: {conv['message_count']}")
+ print()
else:
- print('error: ' + str(res[1]))
+ print(f"Error: {result}")
+ return
+
+ if args.clear:
+ ai_api_module.clear_conversation()
+ print("Conversation history cleared")
+ return
+
+ # List models
+ if args.list_models:
+ success, result = ai_api_module.list_models(args.output_mode)
+ if success:
+ for model in result:
+ if args.output_mode == 'json':
+ print(json.dumps(model, indent=2))
+ else:
+ print(f"Model: {model['display_name']}")
+ print(f" Name: {model['name']}")
+ print(f" Description: {model.get('description', 'N/A')}")
+ print(f" Input tokens: {model.get('input_token_limit', 'N/A')}")
+ print(f" Output tokens: {model.get('output_token_limit', 'N/A')}")
+ print()
+ else:
+ print(f'Error: {result}')
return
-
# Process query
if args.query or args.extra_query:
@@ -87,17 +114,35 @@ def main():
query += " " + " ".join(args.extra_query)
else:
query = " ".join(args.extra_query)
-
+
+ # Count tokens if requested
+ if args.count_tokens:
+ success, count = ai_api_module.count_tokens(args.modelid, query)
+ if success:
+ print(f"Token count: {count}")
+ else:
+ print(f"Error counting tokens: {count}")
+ return
+
+ # Determine streaming
+ use_stream = args.stream and not args.no_stream
+
response = ai_api_module.query(
args.modelid,
query,
args.topp,
args.temperature,
- not args.no_stream and args.stream,
+ use_stream,
+ args.max_tokens,
)
- if response and not args.stream:
+ if response and not use_stream:
print(response)
+
+ # Auto-save conversation if requested
+ if args.save_conversation:
+ filepath = ai_api_module.save_conversation(args.save_conversation)
+ print(f"\nConversation saved to {filepath}")
else:
parser.print_help()