diff options
Diffstat (limited to 'cli.py')
| -rwxr-xr-x | cli.py | 104 |
1 files changed, 104 insertions, 0 deletions
@@ -0,0 +1,104 @@ +#!/usr/bin/env python +# COPYRIGHT 2025 Thomas Grothe +import argparse +import os +import sys +import ai_api_module + +#this is the CLI program used to interact with the GAI python module. + +default_model=None + +def main(): + """Main function to parse arguments and execute commands""" + parser = argparse.ArgumentParser(description="CLI for calling AI APIs with file attachment support") + 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("--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') + 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("--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("--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 + 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") + 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() + else: + print('error: ' + str(res[1])) + return + + 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() + else: + print('error: ' + str(res[1])) + return + + + # Process query + if args.query or args.extra_query: + query = args.query + if args.extra_query: + if query: + query += " " + " ".join(args.extra_query) + else: + query = " ".join(args.extra_query) + + response = ai_api_module.query( + args.modelid, + query, + args.topp, + args.temperature, + not args.no_stream and args.stream, + ) + + if response and not args.stream: + print(response) + else: + parser.print_help() + +if __name__ == "__main__": + main() |
