new.
This commit is contained in:
		
							parent
							
								
									2834e28db2
								
							
						
					
					
						commit
						6834081960
					
				
							
								
								
									
										2
									
								
								browse.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								browse.h
									
									
									
									
									
								
							| @ -47,7 +47,7 @@ char * web_search(char * q){ | |||||||
|     if(!json_result){ |     if(!json_result){ | ||||||
|         json_object_put(json_ret); |         json_object_put(json_ret); | ||||||
|         free(ret); |         free(ret); | ||||||
|         return web_search_news(q);         |         return web_search(q);         | ||||||
|     } |     } | ||||||
|     json_object_put(json_ret); |     json_object_put(json_ret); | ||||||
|     return ret; |     return ret; | ||||||
|  | |||||||
							
								
								
									
										41
									
								
								db_utils.h
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								db_utils.h
									
									
									
									
									
								
							| @ -7,6 +7,9 @@ | |||||||
| 
 | 
 | ||||||
| const char * db_file = "~/.r.db"; | const char * db_file = "~/.r.db"; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | json_object* db_execute(const char *query); | ||||||
|  | 
 | ||||||
| char * db_file_expanded(){ | char * db_file_expanded(){ | ||||||
|     char * expanded = expand_home_directory(db_file); |     char * expanded = expand_home_directory(db_file); | ||||||
|     static char result[4096]; |     static char result[4096]; | ||||||
| @ -51,7 +54,7 @@ json_object * db_set(const char *key, const char *value) { | |||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     char *sql = sqlite3_mprintf("INSERT INTO kv_store (key, value) VALUES (%Q, %Q)", key, value); |     char *sql = sqlite3_mprintf("INSERT INTO kv_store (key, value) VALUES (%Q, %Q) ON CONFLICT(key) DO UPDATE SET value = %Q WHERE key = %Q", key, value, value,key); | ||||||
|     rc = sqlite3_exec(db, sql, 0, 0, &err_msg); |     rc = sqlite3_exec(db, sql, 0, 0, &err_msg); | ||||||
|     sqlite3_free(sql); |     sqlite3_free(sql); | ||||||
| 
 | 
 | ||||||
| @ -97,6 +100,11 @@ json_object* db_get(const char *key) { | |||||||
| json_object* db_query(const char *query) { | json_object* db_query(const char *query) { | ||||||
|     sqlite3 *db; |     sqlite3 *db; | ||||||
|     sqlite3_stmt *stmt; |     sqlite3_stmt *stmt; | ||||||
|  | 
 | ||||||
|  |     if(strncmp(query, "SELECT", 6)){ | ||||||
|  |         return db_execute(query); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     json_object *result = json_object_new_array(); |     json_object *result = json_object_new_array(); | ||||||
| 
 | 
 | ||||||
|     int rc = sqlite3_open(db_file_expanded(), &db); |     int rc = sqlite3_open(db_file_expanded(), &db); | ||||||
| @ -138,4 +146,33 @@ json_object* db_query(const char *query) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| #endif // DB_UTILS_H
 | json_object* db_execute(const char *query) { | ||||||
|  |     sqlite3 *db; | ||||||
|  |     char *err_msg = 0; | ||||||
|  |     int rc = sqlite3_open(db_file_expanded(), &db); | ||||||
|  |     json_object *result = json_object_new_object(); | ||||||
|  | 
 | ||||||
|  |     if (rc != SQLITE_OK) { | ||||||
|  |         json_object_object_add(result, "error", json_object_new_string("Cannot open database")); | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     rc = sqlite3_exec(db, query, 0, 0, &err_msg); | ||||||
|  |     if (rc != SQLITE_OK) { | ||||||
|  |         json_object_object_add(result, "error", json_object_new_string(err_msg)); | ||||||
|  |         sqlite3_free(err_msg); | ||||||
|  |     } else { | ||||||
|  |         json_object_object_add(result, "success", json_object_new_string("Query executed successfully")); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     sqlite3_close(db); | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | char * db_get_schema(){ | ||||||
|  |     json_object * tables =db_query("SELECT * FROM sqlite_master WHERE type='table'"); | ||||||
|  |     char * result = strdup(json_object_get_string(tables)); | ||||||
|  |     json_object_put(tables); | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								main.c
									
									
									
									
									
								
							| @ -192,7 +192,6 @@ void render(char *content) | |||||||
|     if(SYNTAX_HIGHLIGHT_ENABLED) |     if(SYNTAX_HIGHLIGHT_ENABLED) | ||||||
|     { |     { | ||||||
|         parse_markdown_to_ansi(content); |         parse_markdown_to_ansi(content); | ||||||
|         printf("\n\n"); |  | ||||||
|     }else{ |     }else{ | ||||||
|         printf("%s", content); |         printf("%s", content); | ||||||
|     } |     } | ||||||
| @ -317,13 +316,17 @@ bool openai_include(char *path) { | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| void init() { | void init() { | ||||||
|     setbuf(stdout, NULL); |     setbuf(stdout, NULL); | ||||||
|     line_init(); |     line_init(); | ||||||
|     auth_init(); |     auth_init(); | ||||||
|     const char *locale = setlocale(LC_ALL, NULL); |     db_initialize(); | ||||||
|     char payload[4096] = {0}; |     char * schema = db_get_schema(); | ||||||
|     sprintf(payload, "Your locale is %s. User lang is %s.", locale, locale); |     char payload[1024*1024] = {0}; | ||||||
|  |     sprintf(payload, "Your have a database that you can mutate using the query tool and the get and set tool. This is the schema in json format: %s. Dialect is sqlite.", schema); | ||||||
|  |     free(schema); | ||||||
|     fprintf(stderr, "%s", "Loading... ⏳"); |     fprintf(stderr, "%s", "Loading... ⏳"); | ||||||
|     openai_system(payload); |     openai_system(payload); | ||||||
|     if(!openai_include(".rcontext.txt")){ |     if(!openai_include(".rcontext.txt")){ | ||||||
| @ -353,7 +356,7 @@ void handle_sigint(int sig) { | |||||||
| 
 | 
 | ||||||
| int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||||||
|     signal(SIGINT, handle_sigint); |     signal(SIGINT, handle_sigint); | ||||||
|     db_initialize(); | 
 | ||||||
|     init(); |     init(); | ||||||
|     if (try_prompt(argc, argv)) |     if (try_prompt(argc, argv)) | ||||||
|         return 0; |         return 0; | ||||||
|  | |||||||
| @ -114,7 +114,14 @@ void parse_markdown_to_ansi(const char *markdown) { | |||||||
|             continue; |             continue; | ||||||
|         }else if(!strncmp(ptr, "```", 3)) { |         }else if(!strncmp(ptr, "```", 3)) { | ||||||
|             inside_code = !inside_code; |             inside_code = !inside_code; | ||||||
|  |             if(inside_code){ | ||||||
|             ptr = strstr(ptr, "\n") + 1; |             ptr = strstr(ptr, "\n") + 1; | ||||||
|  |             }else{ | ||||||
|  |                 ptr+=3; | ||||||
|  |             } | ||||||
|  |             if(*ptr == '\0'){ | ||||||
|  |                break;  | ||||||
|  |             }  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (inside_code) { |         if (inside_code) { | ||||||
|  | |||||||
							
								
								
									
										65
									
								
								tools.h
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								tools.h
									
									
									
									
									
								
							| @ -44,6 +44,7 @@ struct json_object* tool_description_db_set(); | |||||||
| struct json_object* tool_description_db_query(); | struct json_object* tool_description_db_query(); | ||||||
| struct json_object* tool_description_db_get(); | struct json_object* tool_description_db_get(); | ||||||
| struct json_object* tool_description_web_search_news(); | struct json_object* tool_description_web_search_news(); | ||||||
|  | struct json_object* tool_description_web_search(); | ||||||
| 
 | 
 | ||||||
| struct json_object* tools_descriptions() { | struct json_object* tools_descriptions() { | ||||||
|     struct json_object* root = json_object_new_array(); |     struct json_object* root = json_object_new_array(); | ||||||
| @ -61,6 +62,7 @@ struct json_object* tools_descriptions() { | |||||||
|     json_object_array_add(root, tool_description_db_query()); |     json_object_array_add(root, tool_description_db_query()); | ||||||
|     json_object_array_add(root, tool_description_db_get()); |     json_object_array_add(root, tool_description_db_get()); | ||||||
|     json_object_array_add(root, tool_description_web_search_news()); |     json_object_array_add(root, tool_description_web_search_news()); | ||||||
|  |     json_object_array_add(root, tool_description_web_search()); | ||||||
|     return root; |     return root; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -111,6 +113,57 @@ struct json_object* tool_description_web_search_news() { | |||||||
|     return root; |     return root; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | char* tool_function_web_search(char* query) { | ||||||
|  |     if (query == NULL) { | ||||||
|  |         return strdup("Query cannot be NULL."); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     char* result = web_search_news(query); | ||||||
|  |     if (result == NULL) { | ||||||
|  |         return strdup("Failed to fetch news."); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct json_object* tool_description_web_search() { | ||||||
|  |     struct json_object* root = json_object_new_object(); | ||||||
|  |     json_object_object_add(root, "type", json_object_new_string("function")); | ||||||
|  | 
 | ||||||
|  |     struct json_object* function = json_object_new_object(); | ||||||
|  |     json_object_object_add(function, "name", json_object_new_string("web_search")); | ||||||
|  |     json_object_object_add(function, "description", json_object_new_string("Searches for information based on a query using search engines like google.")); | ||||||
|  | 
 | ||||||
|  |     struct json_object* parameters = json_object_new_object(); | ||||||
|  |     json_object_object_add(parameters, "type", json_object_new_string("object")); | ||||||
|  | 
 | ||||||
|  |     struct json_object* properties = json_object_new_object(); | ||||||
|  |     struct json_object* query = json_object_new_object(); | ||||||
|  |     json_object_object_add(query, "type", json_object_new_string("string")); | ||||||
|  |     json_object_object_add(query, "description", json_object_new_string("The url encoded query string to search for information.")); | ||||||
|  |     json_object_object_add(properties, "query", query); | ||||||
|  | 
 | ||||||
|  |     json_object_object_add(parameters, "properties", properties); | ||||||
|  | 
 | ||||||
|  |     struct json_object* required = json_object_new_array(); | ||||||
|  |     json_object_array_add(required, json_object_new_string("query")); | ||||||
|  |     json_object_object_add(parameters, "required", required); | ||||||
|  | 
 | ||||||
|  |     json_object_object_add(parameters, "additionalProperties", json_object_new_boolean(0)); | ||||||
|  | 
 | ||||||
|  |     json_object_object_add(function, "parameters", parameters); | ||||||
|  |     json_object_object_add(function, "strict", json_object_new_boolean(1)); | ||||||
|  | 
 | ||||||
|  |     json_object_object_add(root, "function", function); | ||||||
|  | 
 | ||||||
|  |     return root; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| char* tool_function_db_get(char* key) { | char* tool_function_db_get(char* key) { | ||||||
|     json_object* result = db_get(key); |     json_object* result = db_get(key); | ||||||
| @ -1070,6 +1123,18 @@ struct json_object* tools_execute(struct json_object* tools_array) { | |||||||
|                         free(news_result); |                         free(news_result); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |             }else if (!strcmp(function_name, "web_search")){ | ||||||
|  |                 struct json_object* arguments_obj; | ||||||
|  |                 if (json_object_object_get_ex(function_obj, "arguments", &arguments_obj)) { | ||||||
|  |                     struct json_object* arguments = json_tokener_parse(json_object_get_string(arguments_obj)); | ||||||
|  |                     struct json_object* query_obj; | ||||||
|  |                     if (json_object_object_get_ex(arguments, "query", &query_obj)) { | ||||||
|  |                         char* query = (char*)json_object_get_string(query_obj); | ||||||
|  |                         char* news_result = tool_function_web_search(query); | ||||||
|  |                         json_object_object_add(tool_result, "content", json_object_new_string(news_result)); | ||||||
|  |                         free(news_result); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             }else if (!strcmp(function_name, "db_get")) { |             }else if (!strcmp(function_name, "db_get")) { | ||||||
|     struct json_object* arguments_obj; |     struct json_object* arguments_obj; | ||||||
|     if (json_object_object_get_ex(function_obj, "arguments", &arguments_obj)) { |     if (json_object_object_get_ex(function_obj, "arguments", &arguments_obj)) { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user