read mail with issue tree pipeline works

This commit is contained in:
tsukasa
2023-11-20 22:01:18 +08:00
parent 9c00187041
commit a63e9b6745
12 changed files with 215 additions and 140 deletions
+12 -8
View File
@@ -14,6 +14,7 @@ import sys
from .agent_base import AgentMsg, AgentMsgStatus, AgentMsgType, FunctionItem, LLMResult, AgentPrompt, AgentReport, \
AgentTodo, AgentTodoResult, AgentWorkLog, BaseAIAgent
from .chatsession import AIChatSession
from .compute_task import ComputeTaskResult,ComputeTaskResultCode
from .ai_function import AIFunction
@@ -287,6 +288,7 @@ class AIAgent(BaseAIAgent):
return None
def _get_inner_functions(self) -> dict:
if self.owner_env is None:
return None,0
@@ -357,6 +359,7 @@ class AIAgent(BaseAIAgent):
else:
return task_result
def get_agent_prompt(self) -> AgentPrompt:
return self.agent_prompt
@@ -520,7 +523,7 @@ class AIAgent(BaseAIAgent):
if todo_count > 0:
have_known_info = True
known_info_str += f"## todo\n{todos_str}\n"
inner_functions,function_token_len = self._get_inner_functions()
inner_functions,function_token_len = BaseAIAgent.get_inner_functions(self.owner_env)
system_prompt_len = prompt.get_prompt_token_len()
input_len = len(msg.body)
if msg.msg_type == AgentMsgType.TYPE_GROUPMSG:
@@ -540,7 +543,7 @@ class AIAgent(BaseAIAgent):
logger.debug(f"Agent {self.agent_id} do llm token static system:{system_prompt_len},function:{function_token_len},history:{history_token_len},input:{input_len}, totoal prompt:{system_prompt_len + function_token_len + history_token_len} ")
#task_result:ComputeTaskResult = await ComputeKernel.get_instance().do_llm_completion(prompt,self.llm_model_name,self.max_token_size,inner_functions)
task_result = await self._do_llm_complection(prompt,inner_functions,msg)
task_result = await self._do_llm_complection(prompt,msg,inner_functions=inner_functions)
if task_result.result_code != ComputeTaskResultCode.OK:
error_resp = msg.create_error_resp(task_result.error_str)
return error_resp
@@ -778,9 +781,9 @@ class AIAgent(BaseAIAgent):
todo_tree = workspace.get_todo_tree("/")
prompt.append(AgentPrompt(todo_tree))
inner_functions,function_token_len = self._get_inner_functions()
inner_functions,_ = BaseAIAgent.get_inner_functions(self.owner_env)
task_result:ComputeTaskResult = await self._do_llm_complection(prompt,inner_functions)
task_result:ComputeTaskResult = await self._do_llm_complection(prompt,inner_functions=inner_functions)
if task_result.result_code != ComputeTaskResultCode.OK:
logger.error(f"_llm_review_todos compute error:{task_result.error_str}")
return
@@ -897,7 +900,8 @@ class AIAgent(BaseAIAgent):
prompt.append(todo.detail)
prompt.append(todo.result)
task_result:ComputeTaskResult = await self._do_llm_complection(prompt,workspace.get_inner_functions(),None,True)
inner_functions,_ = BaseAIAgent.get_inner_functions(workspace)
task_result:ComputeTaskResult = await self._do_llm_complection(prompt,inner_functions=inner_functions,is_json_resp=True)
if task_result.result_code != ComputeTaskResultCode.OK:
logger.error(f"_llm_check_todo compute error:{task_result.error_str}")
@@ -1058,7 +1062,7 @@ class AIAgent(BaseAIAgent):
prompt.append(content_prompt)
env_functions = None
#env_functions,function_len = workspace.get_knowledge_base_ai_functions()
task_result:ComputeTaskResult = await self._do_llm_complection(prompt,env_functions,None,True)
task_result:ComputeTaskResult = await self._do_llm_complection(prompt,is_json_resp=True)
if task_result.result_code != ComputeTaskResultCode.OK:
result_obj = {}
result_obj["error_str"] = task_result.error_str
@@ -1091,9 +1095,8 @@ class AIAgent(BaseAIAgent):
prompt.append(known_info_prompt)
content_prompt = AgentPrompt(part_content)
prompt.append(content_prompt)
env_functions = None
#env_functions,function_len = workspace.get_knowledge_base_ai_functions()
task_result:ComputeTaskResult = await self._do_llm_complection(prompt,env_functions,None,True)
task_result:ComputeTaskResult = await self._do_llm_complection(prompt,is_json_resp=True)
if task_result.result_code != ComputeTaskResultCode.OK:
result_obj = {}
result_obj["error_str"] = task_result.error_str
@@ -1222,6 +1225,7 @@ class AIAgent(BaseAIAgent):
return task_result
def need_work(self) -> bool:
if self.do_prompt is not None:
return True
+14 -8
View File
@@ -600,7 +600,7 @@ class BaseAIAgent:
pass
@classmethod
def _get_inner_functions(cls, env:Environment) -> (dict,int):
def get_inner_functions(cls, env:Environment) -> (dict,int):
if env is None:
return None,0
@@ -624,18 +624,24 @@ class BaseAIAgent:
@classmethod
async def do_llm_complection(
cls,
env:Environment,
prompt:AgentPrompt,
org_msg:AgentMsg,
llm_model_name:str,
max_token_size:int
max_token_size:int,
org_msg:AgentMsg=None,
env:Environment=None,
inner_functions=None,
is_json_resp=False,
) -> ComputeTaskResult:
from .compute_kernel import ComputeKernel
#logger.debug(f"Agent {self.agent_id} do llm token static system:{system_prompt_len},function:{function_token_len},history:{history_token_len},input:{input_len}, totoal prompt:{system_prompt_len + function_token_len + history_token_len} ")
inner_functions,inner_functions_len = cls._get_inner_functions(env)
task_result:ComputeTaskResult = await ComputeKernel.get_instance().do_llm_completion(prompt,llm_model_name,max_token_size,inner_functions)
if inner_functions is None and env is not None:
inner_functions,_ = cls.get_inner_functions(env)
if is_json_resp:
task_result:ComputeTaskResult = await ComputeKernel.get_instance().do_llm_completion(prompt,"json",llm_model_name,max_token_size,inner_functions,timeout=None)
else:
task_result:ComputeTaskResult = await ComputeKernel.get_instance().do_llm_completion(prompt,"text",llm_model_name,max_token_size,inner_functions,timeout=None)
if task_result.result_code != ComputeTaskResultCode.OK:
logger.error(f"llm compute error:{task_result.error_str}")
logger.error(f"_do_llm_complection llm compute error:{task_result.error_str}")
#error_resp = msg.create_error_resp(task_result.error_str)
return task_result
@@ -649,7 +655,7 @@ class BaseAIAgent:
task_result = await cls._execute_func(env,inner_func_call_node,call_prompt,inner_functions,org_msg,llm_model_name,max_token_size)
return task_result
@classmethod
async def _execute_func(
cls,
+5 -5
View File
@@ -127,7 +127,7 @@ class ComputeKernel:
self.run(task_req)
return task_req
async def _wait_task(self,task_req:ComputeTask)->ComputeTaskResult:
async def _wait_task(self,task_req:ComputeTask, timeout=60)->ComputeTaskResult:
async def check_timer():
check_times = 0
while True:
@@ -136,8 +136,8 @@ class ComputeKernel:
if task_req.state == ComputeTaskState.ERROR:
break
if check_times >= 120:
if timeout is not None and check_times >= timeout*2:
task_req.state = ComputeTaskState.ERROR
break
@@ -155,9 +155,9 @@ class ComputeKernel:
return time_out_result
async def do_llm_completion(self, prompt: AgentPrompt,resp_mode:str="text", mode_name: Optional[str] = None, max_token: int = 0, inner_functions = None) -> str:
async def do_llm_completion(self, prompt: AgentPrompt,resp_mode:str="text", mode_name: Optional[str]=None, max_token:int=0, inner_functions=None, timeout=60) -> str:
task_req = self.llm_completion(prompt, resp_mode,mode_name, max_token,inner_functions)
return await self._wait_task(task_req)
return await self._wait_task(task_req, timeout)
def text_embedding(self,input:str,model_name:Optional[str] = None):
+3 -3
View File
@@ -200,7 +200,7 @@ class OpenAI_ComputeNode(ComputeNode):
max_token_size = 4000
result_token = max_token_size
client = AsyncOpenAI()
client = AsyncOpenAI(api_key=self.openai_api_key)
try:
if llm_inner_functions is None:
logger.info(f"call openai {mode_name} prompts: {prompts}")
@@ -215,7 +215,7 @@ class OpenAI_ComputeNode(ComputeNode):
messages=prompts,
response_format = response_format,
functions=llm_inner_functions,
#max_tokens=result_token,
max_tokens=result_token,
) # TODO: add temperature to task params?
except Exception as e:
logger.error(f"openai run LLM_COMPLETION task error: {e}")
@@ -267,8 +267,8 @@ class OpenAI_ComputeNode(ComputeNode):
logger.info(f"openai_node get task: {task.display()}")
result = await self._run_task(task)
if result is not None:
task.state = ComputeTaskState.DONE
task.result = result
task.state = ComputeTaskState.DONE
asyncio.create_task(_run_task_loop())