Skip to content

Commit

Permalink
Merge pull request #70 from smalltong02/Fine_tuning1.0.4
Browse files Browse the repository at this point in the history
add "get_map_directions" for map tools.
  • Loading branch information
smalltong02 committed Jun 17, 2024
2 parents 242e02c + 86d4f63 commit e001e65
Show file tree
Hide file tree
Showing 13 changed files with 382 additions and 89 deletions.
40 changes: 21 additions & 19 deletions WebUI/Server/chat/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,11 +176,13 @@ async def GetChatPromptFromToolBoxes(json_lists: list = []) ->Union[str, Any, An
return None, "", []
result_list = []
func_name = []
result_dict = []
for item in json_lists:
name, result = RunFunctionCallingInToolBoxes(item)
name, result, r_dict = RunFunctionCallingInToolBoxes(item)
if result:
func_name.append(name)
result_list.append(result)
result_dict.append(r_dict)
source_documents = []
for result in enumerate(result_list):
source_documents.append(f"function - {func_name[0]}()\n\n{result}")
Expand All @@ -191,40 +193,40 @@ async def GetChatPromptFromToolBoxes(json_lists: list = []) ->Union[str, Any, An
{context}\n
"""
await asyncio.sleep(0.1)
return new_query, func_name[0], source_documents
return new_query, func_name[0], source_documents, result_dict[0]

async def GetQueryFromExternalToolsForCurConfig(answer: str, query: str) ->Union[str, Any, Any, Any]:
if not answer:
return None, "", [], ToolsType.Unknown
return None, "", [], {}, ToolsType.Unknown
config = GetCurrentRunningCfg(True)
if not config:
return None
return None, "", [], {}, ToolsType.Unknown
json_lists = ExtractJsonStrings(answer)
if not json_lists:
return None, "", [], ToolsType.Unknown
return None, "", [], {}, ToolsType.Unknown
if config["search_engine"]["name"] and use_new_search_engine(json_lists):
new_query, tool_name, docs = await GetChatPromptFromFromSearchEngine(json_lists, config["search_engine"]["name"], query)
return new_query, tool_name, docs, ToolsType.ToolSearchEngine
return new_query, tool_name, docs, {}, ToolsType.ToolSearchEngine
if config["knowledge_base"]["name"] and use_knowledge_base(json_lists):
new_query, tool_name, docs = await GetChatPromptFromKnowledgeBase(json_lists, config["knowledge_base"]["name"], query)
return new_query, tool_name, docs, ToolsType.ToolKnowledgeBase
return new_query, tool_name, docs, {}, ToolsType.ToolKnowledgeBase
if config["normal_calling"]["enable"] and use_new_function_calling(json_lists):
new_query, tool_name, docs = await GetChatPromptFromFunctionCalling(json_lists)
return new_query, tool_name, docs, ToolsType.ToolFunctionCalling
return new_query, tool_name, docs, {}, ToolsType.ToolFunctionCalling
if config["code_interpreter"]["name"] and use_code_interpreter(json_lists):
new_query, tool_name, docs = await GetChatPromptFromCodeInterpreter(json_lists)
return new_query, tool_name, docs, ToolsType.ToolCodeInterpreter
return new_query, tool_name, docs, {}, ToolsType.ToolCodeInterpreter
if use_new_toolboxes_calling(json_lists):
new_query, tool_name, docs = await GetChatPromptFromToolBoxes(json_lists)
return new_query, tool_name, docs, ToolsType.ToolToolBoxes
return None, "", [], ToolsType.Unknown
new_query, tool_name, docs, result_dict = await GetChatPromptFromToolBoxes(json_lists)
return new_query, tool_name, docs, result_dict, ToolsType.ToolToolBoxes
return None, "", [], {}, ToolsType.Unknown

async def RunAllEnableToolsInString(func_name: str="", args: dict={}, query: str=""):
if not func_name or not query:
return None, "", [], ToolsType.Unknown
return None, "", [], {}, ToolsType.Unknown
json_data = json.dumps({"name": func_name, "arguments": args})
new_query, tool_name, docs, tooltype = await GetQueryFromExternalToolsForCurConfig(json_data, query)
return new_query, tool_name, docs, tooltype
new_query, tool_name, docs, result_dict, tooltype = await GetQueryFromExternalToolsForCurConfig(json_data, query)
return new_query, tool_name, docs, result_dict, tooltype

async def chat(query: str = Body(..., description="User input: ", examples=["chat"]),
imagesdata: List[str] = Body([], description="image data", examples=["image"]),
Expand Down Expand Up @@ -348,7 +350,7 @@ async def chat_iterator(query: str,
if not btalk:
btalk, new_answer = CallingExternalToolsForCurConfig(answer)
if btalk:
new_query, tool_name, docs, tooltype = await GetQueryFromExternalToolsForCurConfig(answer=answer, query=query)
new_query, tool_name, docs, tool_dict, tooltype = await GetQueryFromExternalToolsForCurConfig(answer=answer, query=query)
if not new_query:
btalk = False
else:
Expand All @@ -357,7 +359,7 @@ async def chat_iterator(query: str,
history.append(History(role="user", content=query))
history.append(History(role="assistant", content=new_answer))
yield json.dumps(
{"clear": new_answer, "chat_history_id": chat_history_id},
{"clear": new_answer, "tool_dict": tool_dict},
ensure_ascii=False)
user_answer = GetUserAnswerForCurConfig(tool_name, tooltype)
yield json.dumps(
Expand All @@ -375,7 +377,7 @@ async def chat_iterator(query: str,
if not btalk:
btalk, new_answer = CallingExternalToolsForCurConfig(answer)
if btalk:
new_query, tool_name, docs, tooltype = await GetQueryFromExternalToolsForCurConfig(answer=answer, query=query)
new_query, tool_name, docs, tool_dict, tooltype = await GetQueryFromExternalToolsForCurConfig(answer=answer, query=query)
if not new_query:
btalk = False
else:
Expand All @@ -384,7 +386,7 @@ async def chat_iterator(query: str,
history.append({'role': "user",'content': query})
history.append({'role': "assistant", 'content': new_answer})
yield json.dumps(
{"clear": new_answer, "chat_history_id": chat_history_id},
{"clear": new_answer, "tool_dict": tool_dict},
ensure_ascii=False)
user_answer = GetUserAnswerForCurConfig(tool_name, tooltype)
yield json.dumps(
Expand Down
2 changes: 1 addition & 1 deletion WebUI/Server/chat/completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from langchain.callbacks import AsyncIteratorCallbackHandler
from typing import AsyncIterable, Optional
import asyncio
from langchain.prompts.chat import PromptTemplate
from langchain.prompts import PromptTemplate
from WebUI.Server.utils import get_prompt_template


Expand Down
23 changes: 15 additions & 8 deletions WebUI/Server/funcall/google_toolboxes/calendar_funcall.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from datetime import datetime
from datetime import datetime, timedelta
from dateutil.tz import gettz
from langchain_core.tools import tool
from googleapiclient.discovery import build
Expand All @@ -10,7 +10,7 @@
CALENDAR_FULL_SCOPES = ["https://www.googleapis.com/auth/calendar"]


def convert_time_to_rfc3339_time(time_str:str) ->str:
def convert_time_to_rfc3339_time(time_str:str) ->datetime:
if not time_str:
return ""
import re
Expand All @@ -20,7 +20,14 @@ def convert_time_to_rfc3339_time(time_str:str) ->str:

local_timezone = gettz()
if pattern_datetime_tz.match(time_str):
return pattern_datetime_tz
dt = datetime.strptime(time_str[:-6], '%Y-%m-%dT%H:%M:%S')
tz_offset = time_str[-6:]
td = timedelta(hours=int(tz_offset[:3]), minutes=int(tz_offset[4:]))
if tz_offset[0] == '-':
dt = dt + td
else:
dt = dt - td
return dt
if pattern_datetime.match(time_str):
time_format = "%Y-%m-%dT%H:%M:%S"
datetime_obj = datetime.strptime(time_str, time_format)
Expand All @@ -32,7 +39,7 @@ def convert_time_to_rfc3339_time(time_str:str) ->str:
combined_datetime = datetime.combine(today_date, time_obj)

time_with_timezone = combined_datetime.replace(tzinfo=local_timezone)
return time_with_timezone.isoformat()
return time_with_timezone

def get_event_from_gcalendar(start_time:str, end_time:str) ->str:
"""get event from google calendar."""
Expand All @@ -51,8 +58,8 @@ def get_event_from_gcalendar(start_time:str, end_time:str) ->str:
if not service:
return "Calendar object create failed. This error is unrecoverable."
event_counts = 1
rfc3339_start = convert_time_to_rfc3339_time(start_time)
rfc3339_end = convert_time_to_rfc3339_time(end_time)
rfc3339_start = convert_time_to_rfc3339_time(start_time).isoformat()
rfc3339_end = convert_time_to_rfc3339_time(end_time).isoformat()
if not rfc3339_start or not rfc3339_end:
return "Invalid time format. Please check the time format."

Expand Down Expand Up @@ -116,10 +123,10 @@ def create_event_to_gcalendar(summary: str, description: str, start_time: str, e
"summary": summary,
"description": description,
"start": {
"dateTime": convert_time_to_rfc3339_time(start_time),
"dateTime": convert_time_to_rfc3339_time(start_time).isoformat(),
},
"end": {
"dateTime": convert_time_to_rfc3339_time(end_time),
"dateTime": convert_time_to_rfc3339_time(end_time).isoformat(),
}
}
event = service.events().insert(calendarId='primary', body=new_event).execute()
Expand Down
18 changes: 9 additions & 9 deletions WebUI/Server/funcall/google_toolboxes/credential.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,27 +115,27 @@ def GetFuncallInToolBoxesName(json_data: str) ->str:
except json.JSONDecodeError:
return ""

def RunFunctionCallingInToolBoxes(json_data: str) ->str:
def RunFunctionCallingInToolBoxes(json_data: str):
try:
func = json.loads(json_data)
func_name = func.get("name", "")
func_arg = func.get("arguments", [])

if func_name in calendar_tool_names:
result = calendar_tool_names[func_name].run(func_arg)
return func_name, result
return func_name, result, {}
if func_name in email_tool_names:
result = email_tool_names[func_name].run(func_arg)
return func_name, result
return func_name, result, {}
if func_name in map_tool_names:
result = map_tool_names[func_name].run(func_arg)
return func_name, result
result, map_dict = map_tool_names[func_name].run(func_arg)
return func_name, result, map_dict
if func_name in drive_tool_names:
result = drive_tool_names[func_name].run(func_arg)
return func_name, result
return func_name, result, {}
if func_name in youtube_tool_names:
result = youtube_tool_names[func_name].run(func_arg)
return func_name, result
return "", ""
return func_name, result, {}
return "", "", {}
except json.JSONDecodeError:
return "", ""
return "", "", {}
Loading

0 comments on commit e001e65

Please sign in to comment.