mirror of
https://github.com/temporal-community/temporal-ai-agent.git
synced 2026-03-15 14:08:08 +01:00
Merge pull request #9 from joshmsmith/main
pushing main changes down to development
This commit is contained in:
@@ -48,13 +48,4 @@ See [the guide to adding goals and tools](./adding-goals-and-tools.md) for more
|
|||||||
## For Temporal SAs
|
## For Temporal SAs
|
||||||
Check out the [slides](https://docs.google.com/presentation/d/1wUFY4v17vrtv8llreKEBDPLRtZte3FixxBUn0uWy5NU/edit#slide=id.g3333e5deaa9_0_0) here and the enablement guide here (TODO).
|
Check out the [slides](https://docs.google.com/presentation/d/1wUFY4v17vrtv8llreKEBDPLRtZte3FixxBUn0uWy5NU/edit#slide=id.g3333e5deaa9_0_0) here and the enablement guide here (TODO).
|
||||||
|
|
||||||
## Tests
|
|
||||||
|
|
||||||
Running the tests requires `poe` and `pytest_asyncio` to be installed.
|
|
||||||
|
|
||||||
python -m pip install poethepoet
|
|
||||||
python -m pip install pytest_asyncio
|
|
||||||
|
|
||||||
Once you have `poe` and `pytest_asyncio` installed you can run:
|
|
||||||
|
|
||||||
poe test
|
|
||||||
|
|||||||
@@ -4,9 +4,10 @@ The agent is set up to allow for multiple goals and to switch back to choosing a
|
|||||||
It may be helpful to review the [architecture](./architecture.md) for a guide and definition of goals, tools, etc.
|
It may be helpful to review the [architecture](./architecture.md) for a guide and definition of goals, tools, etc.
|
||||||
|
|
||||||
## Adding a New Goal Category
|
## Adding a New Goal Category
|
||||||
Goal Categories lets you pick which groups of goals to show. Set via an .env setting, GOAL_CATEGORIES.
|
Goal Categories lets you pick which groups of goals to show. Set via an .env setting, `GOAL_CATEGORIES`.
|
||||||
|
Even if you don't intend to use the goal in a multi-goal scenario, goal categories are useful for others.
|
||||||
1. Pick a unique one that has some business meaning
|
1. Pick a unique one that has some business meaning
|
||||||
2. Use it in your .env file
|
2. Use it in your [.env](./.env) file
|
||||||
3. Add to [.env.example](./.env.example)
|
3. Add to [.env.example](./.env.example)
|
||||||
4. Use it in your Goal definition, see below.
|
4. Use it in your Goal definition, see below.
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ tools=[
|
|||||||
|
|
||||||
## Adding Tools
|
## Adding Tools
|
||||||
|
|
||||||
### Optional Tools
|
### Note on Optional Tools
|
||||||
Tools can be optional - you can indicate this in the tool listing of goal description (see above section re: goal registry) by adding something like, "This step is optional and can be skipped by moving to the next tool." Here is an example from an older iteration of the `goal_hr_schedule_pto` goal, when it was going to have an optional step to check for existing calendar conflicts:
|
Tools can be optional - you can indicate this in the tool listing of goal description (see above section re: goal registry) by adding something like, "This step is optional and can be skipped by moving to the next tool." Here is an example from an older iteration of the `goal_hr_schedule_pto` goal, when it was going to have an optional step to check for existing calendar conflicts:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -84,4 +85,15 @@ There are three ways to manage confirmation of tool runs:
|
|||||||
),
|
),
|
||||||
```
|
```
|
||||||
If you really want to wait for user confirmation, record it on the workflow (as a Signal) and not rely on the LLM to probably get it, use option #3.
|
If you really want to wait for user confirmation, record it on the workflow (as a Signal) and not rely on the LLM to probably get it, use option #3.
|
||||||
I recommend exploring all three. For a demo, I would decide if you want the Arguments confirmation in the UI, and if not I'd generally go with option #2 but use #3 for tools that make business sense to confirm, e.g. those tools that take action/write data.
|
I recommend exploring all three. For a demo, I would decide if you want the Arguments confirmation in the UI, and if not I'd generally go with option #2 but use #3 for tools that make business sense to confirm, e.g. those tools that take action/write data.
|
||||||
|
|
||||||
|
## Add a Goal & Tools Checklist
|
||||||
|
[ ] Add goal in [/tools/goal_registry.py](tools/goal_registry.py) <br />
|
||||||
|
- [ ] If a new category, add Goal Category to [.env](./.env) and [.env.example](./.env.example) <br />
|
||||||
|
- [ ] don't forget the goal list at the bottom of the [goal_registry.py](tools/goal_registry.py) <br />
|
||||||
|
|
||||||
|
[ ] Add Tools listed in the Goal Registry to the [tool_registry.py](tools/tool_registry.py) <br />
|
||||||
|
[ ] Define your tools as Activities in `/tools` <br />
|
||||||
|
[ ] Add your tools to [tool list](tools/__init__.py) in the tool get_handler() <br />
|
||||||
|
|
||||||
|
And that's it! Happy AI Agent building!
|
||||||
|
|||||||
8
setup.md
8
setup.md
@@ -192,7 +192,7 @@ dotnet run
|
|||||||
```
|
```
|
||||||
If you're running your train API above on a different host/port then change the API URL in `Program.cs`. Otherwise, be sure to run it using `python thirdparty/train_api.py`.
|
If you're running your train API above on a different host/port then change the API URL in `Program.cs`. Otherwise, be sure to run it using `python thirdparty/train_api.py`.
|
||||||
|
|
||||||
#### Goals: FIN/Money Movement
|
#### Goals: FIN - Money Movement and Loan Application
|
||||||
Make sure you have the mock users you want (such as yourself) in [the account mock data file](./tools/data/customer_account_data.json).
|
Make sure you have the mock users you want (such as yourself) in [the account mock data file](./tools/data/customer_account_data.json).
|
||||||
|
|
||||||
- `AGENT_GOAL=goal_fin_move_money` - This scenario _can_ initiate a secondary workflow to move money. Check out [this repo](https://github.com/temporal-sa/temporal-money-transfer-java) - you'll need to get the worker running and connected to the same account as the agentic worker.
|
- `AGENT_GOAL=goal_fin_move_money` - This scenario _can_ initiate a secondary workflow to move money. Check out [this repo](https://github.com/temporal-sa/temporal-money-transfer-java) - you'll need to get the worker running and connected to the same account as the agentic worker.
|
||||||
@@ -200,6 +200,12 @@ By default it will _not_ make a real workflow, it'll just fake it. If you get th
|
|||||||
```bash
|
```bash
|
||||||
FIN_START_REAL_WORKFLOW=FALSE #set this to true to start a real workflow
|
FIN_START_REAL_WORKFLOW=FALSE #set this to true to start a real workflow
|
||||||
```
|
```
|
||||||
|
- `AGENT_GOAL=goal_fin_loan_application` - This scenario _can_ initiate a secondary workflow to apply for a loan. Check out [this repo](https://github.com/temporal-sa/temporal-latency-optimization-scenarios) - you'll need to get the worker running and connected to the same account as the agentic worker.
|
||||||
|
By default it will _not_ make a real workflow, it'll just fake it. If you get the worker running and want to start a workflow, in your [.env](./.env):
|
||||||
|
```bash
|
||||||
|
FIN_START_REAL_WORKFLOW=FALSE #set this to true to start a real workflow
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
#### Goals: HR/PTO
|
#### Goals: HR/PTO
|
||||||
Make sure you have the mock users you want in (such as yourself) in [the PTO mock data file](./tools/data/employee_pto_data.json).
|
Make sure you have the mock users you want in (such as yourself) in [the PTO mock data file](./tools/data/employee_pto_data.json).
|
||||||
|
|||||||
18
todo.md
18
todo.md
@@ -1,15 +1,5 @@
|
|||||||
# todo list
|
# todo list
|
||||||
[ ] goal change management tweaks <br />
|
|
||||||
- [x] maybe make the choose_Agent_goal tag not be system/not always included? <br />
|
|
||||||
- [x] try taking out list-agents as a tool because agent_prompt_generators may do it for you <br />
|
|
||||||
- [x] make goal selection not be a system tool but be an option in .env, see how that works, includes taking it out of the goal/toolset for all goals <br />
|
|
||||||
- [x] test single-goal <br />
|
|
||||||
- [x] test claude and grok<br />
|
|
||||||
- [x] document in sample env and docs how to control <br />
|
|
||||||
|
|
||||||
[ ] expand [tests](./tests/agent_goal_workflow_test.py)<br />
|
[ ] expand [tests](./tests/agent_goal_workflow_test.py)<br />
|
||||||
[x] try claude-3-7-sonnet-20250219, see [tool_activities.py](./activities/tool_activities.py) <br />
|
|
||||||
[x] test Grok with changes
|
|
||||||
|
|
||||||
[ ] adding fintech goals <br />
|
[ ] adding fintech goals <br />
|
||||||
- Fraud Detection and Prevention - The AI monitors transactions across accounts, flagging suspicious activities (e.g., unusual spending patterns or login attempts) and autonomously freezing accounts or notifying customers and compliance teams.<br />
|
- Fraud Detection and Prevention - The AI monitors transactions across accounts, flagging suspicious activities (e.g., unusual spending patterns or login attempts) and autonomously freezing accounts or notifying customers and compliance teams.<br />
|
||||||
@@ -17,6 +7,14 @@
|
|||||||
- Portfolio Management and Rebalancing - The AI monitors a customer’s investment portfolio, rebalancing it automatically based on market trends, risk tolerance, and financial goals (e.g., shifting assets between stocks, bonds, or crypto).<br />
|
- Portfolio Management and Rebalancing - The AI monitors a customer’s investment portfolio, rebalancing it automatically based on market trends, risk tolerance, and financial goals (e.g., shifting assets between stocks, bonds, or crypto).<br />
|
||||||
|
|
||||||
[ ] new loan/fraud check/update with start <br />
|
[ ] new loan/fraud check/update with start <br />
|
||||||
|
[ ] financial advise - args being freeform customer input about their financial situation, goals
|
||||||
|
[ ] tool is maybe a new tool asking the LLM to advise
|
||||||
|
|
||||||
|
|
||||||
|
[ ] LLM failure->autoswitch: <br />
|
||||||
|
- detect failure in the activity using failurecount <br />
|
||||||
|
- activity switches to secondary LLM defined in .env
|
||||||
|
- activity reports switch to workflow
|
||||||
|
|
||||||
[ ] for demo simulate failure - add utilities/simulated failures from pipeline demo <br />
|
[ ] for demo simulate failure - add utilities/simulated failures from pipeline demo <br />
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ from .hr.checkpaybankstatus import checkpaybankstatus
|
|||||||
from .fin.check_account_valid import check_account_valid
|
from .fin.check_account_valid import check_account_valid
|
||||||
from .fin.get_account_balances import get_account_balance
|
from .fin.get_account_balances import get_account_balance
|
||||||
from .fin.move_money import move_money
|
from .fin.move_money import move_money
|
||||||
|
from .fin.submit_loan_application import submit_loan_application
|
||||||
|
|
||||||
from .give_hint import give_hint
|
from .give_hint import give_hint
|
||||||
from .guess_location import guess_location
|
from .guess_location import guess_location
|
||||||
@@ -53,7 +54,9 @@ def get_handler(tool_name: str):
|
|||||||
if tool_name == "FinCheckAccountBalance":
|
if tool_name == "FinCheckAccountBalance":
|
||||||
return get_account_balance
|
return get_account_balance
|
||||||
if tool_name == "FinMoveMoneyOrder":
|
if tool_name == "FinMoveMoneyOrder":
|
||||||
return move_money
|
return move_money
|
||||||
|
if tool_name == "FinCheckAccountSubmitLoanApproval":
|
||||||
|
return submit_loan_application
|
||||||
if tool_name == "GiveHint":
|
if tool_name == "GiveHint":
|
||||||
return give_hint
|
return give_hint
|
||||||
if tool_name == "GuessLocation":
|
if tool_name == "GuessLocation":
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ class MoneyMovementWorkflowParameterObj:
|
|||||||
# this assumes it's a valid account - use check_account_valid() to verify that first
|
# this assumes it's a valid account - use check_account_valid() to verify that first
|
||||||
async def move_money(args: dict) -> dict:
|
async def move_money(args: dict) -> dict:
|
||||||
|
|
||||||
print("in move_money")
|
|
||||||
account_key = args.get("accountkey")
|
account_key = args.get("accountkey")
|
||||||
account_type: str = args.get("accounttype")
|
account_type: str = args.get("accounttype")
|
||||||
amount = args.get("amount")
|
amount = args.get("amount")
|
||||||
|
|||||||
103
tools/fin/submit_loan_application.py
Normal file
103
tools/fin/submit_loan_application.py
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
from datetime import date, timedelta
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
import json
|
||||||
|
from temporalio.client import (
|
||||||
|
Client,
|
||||||
|
WithStartWorkflowOperation,
|
||||||
|
WorkflowHandle,
|
||||||
|
WorkflowUpdateFailedError,
|
||||||
|
)
|
||||||
|
from temporalio import common
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import Optional
|
||||||
|
import asyncio
|
||||||
|
from temporalio.exceptions import WorkflowAlreadyStartedError
|
||||||
|
from shared.config import get_temporal_client
|
||||||
|
|
||||||
|
|
||||||
|
# Define data structures to match the Java workflow's expected input/output
|
||||||
|
# see https://github.com/temporal-sa/temporal-latency-optimization-scenarios for more details
|
||||||
|
@dataclass
|
||||||
|
class TransactionRequest:
|
||||||
|
amount: float
|
||||||
|
sourceAccount: str
|
||||||
|
targetAccount: str
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TxResult:
|
||||||
|
transactionId: str
|
||||||
|
status: str
|
||||||
|
|
||||||
|
#demonstrate starting a workflow and early return pattern while the workflow continues
|
||||||
|
async def submit_loan_application(args: dict) -> dict:
|
||||||
|
account_key = args.get("accountkey")
|
||||||
|
amount = args.get("amount")
|
||||||
|
|
||||||
|
loan_status: dict = await start_workflow(amount=amount,account_name=account_key)
|
||||||
|
|
||||||
|
if loan_status.get("error") is None:
|
||||||
|
return {'status': loan_status.get("loan_application_status"), 'detailed_status': loan_status.get("application_details"), 'next_step': loan_status.get("advisement"), 'confirmation_id': loan_status.get("transaction_id")}
|
||||||
|
else:
|
||||||
|
print(loan_status)
|
||||||
|
return loan_status
|
||||||
|
|
||||||
|
|
||||||
|
# Async function to start workflow
|
||||||
|
async def start_workflow(amount: str, account_name: str, )-> dict:
|
||||||
|
|
||||||
|
# Connect to Temporal
|
||||||
|
client = await get_temporal_client()
|
||||||
|
start_real_workflow = os.getenv("FIN_START_REAL_WORKFLOW")
|
||||||
|
if start_real_workflow is not None and start_real_workflow.lower() == "false":
|
||||||
|
START_REAL_WORKFLOW = False
|
||||||
|
return {'loan_application_status': "applied", 'application_details': "loan application is submitted and initial validation is complete",'transaction_id': "APPLICATION"+account_name, 'advisement': "You'll receive a confirmation for final approval in three business days", }
|
||||||
|
else:
|
||||||
|
START_REAL_WORKFLOW = True
|
||||||
|
|
||||||
|
# Define the workflow ID and task queue
|
||||||
|
workflow_id = "LOAN_APPLICATION-"+account_name+"-"+date.today().strftime('%Y-%m-%d')
|
||||||
|
task_queue = "LatencyOptimizationTEST"
|
||||||
|
|
||||||
|
# Create a TransactionRequest (matching the Java workflow's expected input)
|
||||||
|
tx_request = TransactionRequest(
|
||||||
|
amount=float(amount),
|
||||||
|
targetAccount=account_name,
|
||||||
|
sourceAccount=account_name,
|
||||||
|
)
|
||||||
|
|
||||||
|
start_op = WithStartWorkflowOperation(
|
||||||
|
"TransactionWorkflowLocalBeforeUpdate",
|
||||||
|
tx_request,
|
||||||
|
id=workflow_id,
|
||||||
|
id_conflict_policy=common.WorkflowIDConflictPolicy.USE_EXISTING,
|
||||||
|
task_queue=task_queue,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
print("trying update-with-start")
|
||||||
|
tx_result = TxResult(
|
||||||
|
await client.execute_update_with_start_workflow(
|
||||||
|
"returnInitResult",
|
||||||
|
start_workflow_operation=start_op,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
except WorkflowUpdateFailedError:
|
||||||
|
print("aww man got exception WorkflowUpdateFailedError" )
|
||||||
|
tx_result = None
|
||||||
|
return_msg = "Loan could not be processed for " + account_name
|
||||||
|
return {"error": return_msg}
|
||||||
|
|
||||||
|
workflow_handle = await start_op.workflow_handle()
|
||||||
|
print(tx_result)
|
||||||
|
|
||||||
|
print(f"Update result: Transaction ID = {tx_result.transactionId}, Message = {tx_result.status}")
|
||||||
|
|
||||||
|
# Optionally, wait for the workflow to complete and get the final result
|
||||||
|
# final_result = await handle.result()
|
||||||
|
# print(f"Workflow completed with result: {final_result}")
|
||||||
|
|
||||||
|
|
||||||
|
# return {'status': loan_status.get("loan_status"), 'detailed_status': loan_status.get("results"), 'next_step': loan_status.get("advisement"), 'confirmation_id': loan_status.get("workflowID")}
|
||||||
|
return {'loan_application_status': "applied", 'application_details': "loan application is submitted and initial validation is complete",'transaction_id': tx_result.transactionId, 'advisement': "You'll receive a confirmation for final approval in three business days", }
|
||||||
|
|
||||||
@@ -302,6 +302,7 @@ goal_fin_check_account_balances = AgentGoal(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# this tool checks account balances, and uses ./data/customer_account_data.json as dummy data
|
# this tool checks account balances, and uses ./data/customer_account_data.json as dummy data
|
||||||
|
# it also uses a separate workflow/tool, see ./setup.md for details
|
||||||
goal_fin_move_money = AgentGoal(
|
goal_fin_move_money = AgentGoal(
|
||||||
id = "goal_fin_move_money",
|
id = "goal_fin_move_money",
|
||||||
category_tag="fin",
|
category_tag="fin",
|
||||||
@@ -319,7 +320,7 @@ goal_fin_move_money = AgentGoal(
|
|||||||
starter_prompt=starter_prompt_generic,
|
starter_prompt=starter_prompt_generic,
|
||||||
example_conversation_history="\n ".join(
|
example_conversation_history="\n ".join(
|
||||||
[
|
[
|
||||||
"user: I'd like transfer some money",
|
"user: I'd like to transfer some money",
|
||||||
"agent: Sure! I can help you out with that. May I have account number and email address?",
|
"agent: Sure! I can help you out with that. May I have account number and email address?",
|
||||||
"user: account number is 11235813",
|
"user: account number is 11235813",
|
||||||
"user_confirmed_tool_run: <user clicks confirm on FincheckAccountIsValid tool>",
|
"user_confirmed_tool_run: <user clicks confirm on FincheckAccountIsValid tool>",
|
||||||
@@ -340,6 +341,37 @@ goal_fin_move_money = AgentGoal(
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# this starts a loan approval process
|
||||||
|
# it also uses a separate workflow/tool, see ./setup.md for details #todo
|
||||||
|
goal_fin_loan_application = AgentGoal(
|
||||||
|
id = "goal_fin_loan_application",
|
||||||
|
category_tag="fin",
|
||||||
|
agent_name="Easy Loan Apply",
|
||||||
|
agent_friendly_description="Initiate loan application.",
|
||||||
|
tools=[
|
||||||
|
tool_registry.financial_check_account_is_valid,
|
||||||
|
tool_registry.financial_submit_loan_approval, #todo
|
||||||
|
],
|
||||||
|
description="The user wants to apply for a loan at the financial institution. To assist with that goal, help the user gather args for these tools in order: "
|
||||||
|
"1. FinCheckAccountIsValid: validate the user's account is valid"
|
||||||
|
"2. FinCheckAccountSubmitLoanApproval: submit the loan for approval",
|
||||||
|
starter_prompt=starter_prompt_generic,
|
||||||
|
example_conversation_history="\n ".join(
|
||||||
|
[
|
||||||
|
"user: I'd like to apply for a loan",
|
||||||
|
"agent: Sure! I can help you out with that. May I have account number for confirmation?",
|
||||||
|
"user: account number is 11235813",
|
||||||
|
"user_confirmed_tool_run: <user clicks confirm on FincheckAccountIsValid tool>",
|
||||||
|
"tool_result: { 'status': account valid }",
|
||||||
|
"agent: Great! We've validated your account. What will the loan amount be?",
|
||||||
|
"user: I'd like a loan for $500",
|
||||||
|
"user_confirmed_tool_run: <user clicks confirm on FinCheckAccountSubmitLoanApproval tool>",
|
||||||
|
"tool_result: { 'status': submitted, 'detailed_status': loan application is submitted and initial validation is complete, 'confirmation id': 333421, 'next_step': You'll receive a confirmation for final approval in three business days }",
|
||||||
|
"agent: I have submitted your loan application process and the initial validation is successful. Your application ID is 333421. You'll receive a notification for final approval from us in three business days. "
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
#Add the goals to a list for more generic processing, like listing available agents
|
#Add the goals to a list for more generic processing, like listing available agents
|
||||||
goal_list: List[AgentGoal] = []
|
goal_list: List[AgentGoal] = []
|
||||||
goal_list.append(goal_choose_agent_type)
|
goal_list.append(goal_choose_agent_type)
|
||||||
@@ -351,6 +383,7 @@ goal_list.append(goal_hr_check_pto)
|
|||||||
goal_list.append(goal_hr_check_paycheck_bank_integration_status)
|
goal_list.append(goal_hr_check_paycheck_bank_integration_status)
|
||||||
goal_list.append(goal_fin_check_account_balances)
|
goal_list.append(goal_fin_check_account_balances)
|
||||||
goal_list.append(goal_fin_move_money)
|
goal_list.append(goal_fin_move_money)
|
||||||
|
goal_list.append(goal_fin_loan_application)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -316,4 +316,23 @@ financial_move_money = ToolDefinition(
|
|||||||
description="account number to move the money to",
|
description="account number to move the money to",
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
financial_submit_loan_approval = ToolDefinition(
|
||||||
|
name="FinCheckAccountSubmitLoanApproval",
|
||||||
|
description="Submit a loan application. "
|
||||||
|
"Returns the loan status. ",
|
||||||
|
|
||||||
|
arguments=[
|
||||||
|
ToolArgument(
|
||||||
|
name="accountkey",
|
||||||
|
type="string",
|
||||||
|
description="email address or account ID of user",
|
||||||
|
),
|
||||||
|
ToolArgument(
|
||||||
|
name="amount",
|
||||||
|
type="string",
|
||||||
|
description="amount requested for the loan",
|
||||||
|
),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
@@ -210,7 +210,7 @@ class AgentGoalWorkflow:
|
|||||||
|
|
||||||
#Signal that comes from api/main.py via a post to /confirm
|
#Signal that comes from api/main.py via a post to /confirm
|
||||||
@workflow.signal
|
@workflow.signal
|
||||||
async def confirmed(self) -> None:
|
async def confirm(self) -> None:
|
||||||
"""Signal handler for user confirmation of tool execution."""
|
"""Signal handler for user confirmation of tool execution."""
|
||||||
workflow.logger.info("Received user signal: confirmation")
|
workflow.logger.info("Received user signal: confirmation")
|
||||||
self.confirmed = True
|
self.confirmed = True
|
||||||
@@ -363,9 +363,11 @@ class AgentGoalWorkflow:
|
|||||||
# also don't forget you can look at the workflow itself and do queries if you want
|
# also don't forget you can look at the workflow itself and do queries if you want
|
||||||
def print_useful_workflow_vars(self, status_or_step:str) -> None:
|
def print_useful_workflow_vars(self, status_or_step:str) -> None:
|
||||||
print(f"***{status_or_step}:***")
|
print(f"***{status_or_step}:***")
|
||||||
print(f"force confirm? {self.tool_data['force_confirm']}")
|
if self.tool_data:
|
||||||
print(f"next step: {self.tool_data.get('next')}")
|
print(f"force confirm? {self.tool_data['force_confirm']}")
|
||||||
print(f"current_tool: {self.tool_data.get('tool')}")
|
print(f"next step: {self.tool_data.get('next')}")
|
||||||
print(f"self.confirm: {self.confirmed}")
|
print(f"current_tool: {self.tool_data.get('tool')}")
|
||||||
print(f"waiting_for_confirm (about to be set to true): {self.waiting_for_confirm}")
|
else:
|
||||||
|
print("no tool data initialized yet")
|
||||||
|
print(f"self.confirmed: {self.confirmed}")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user