Skip to content

Commit 06f8335

Browse files
committed
fix: Loading of competency questions
1 parent a612803 commit 06f8335

File tree

5 files changed

+52
-44
lines changed

5 files changed

+52
-44
lines changed

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ services:
162162
ports:
163163
- 3000:80 # YasGUI SPARQL editor - http://localhost:3000
164164
environment:
165-
- DEFAULT_SPARQL_ENDPOINT=http://oxigraph:7878/query # Points to Oxigraph via Docker network
165+
- DEFAULT_SPARQL_ENDPOINT=http://localhost:7878/query # Points to Oxigraph via Docker network
166166
depends_on:
167167
- oxigraph
168168
networks:

lib/abi/services/agent/Agent.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -424,9 +424,12 @@ def list_tools_available() -> str:
424424
return "I don't have any tools available to help you at the moment."
425425

426426
tools_text = "Here are the tools I can use to help you:\n\n"
427-
for t in self._structured_tools:
428-
if not t.name.startswith("transfer_to"):
429-
tools_text += f"- `{t.name}`: {t.description.splitlines()[0]}\n"
427+
# Filter out tools that start with "transfer_to"
428+
filtered_tools = [t for t in self._structured_tools if not t.name.startswith("transfer_to")]
429+
# Sort tools alphabetically by name
430+
filtered_tools_sorted = sorted(filtered_tools, key=lambda t: t.name)
431+
for t in filtered_tools_sorted:
432+
tools_text += f"- `{t.name}`: {t.description.splitlines()[0]}\n"
430433
return tools_text.rstrip()
431434

432435
@tool(return_direct=True)
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1-
from typing import TypeVar, Generic, Type
1+
from typing import TypeVar, Generic, Type, Optional
22
from langchain_core.tools import StructuredTool, BaseTool
33
from abi.utils.SPARQL import results_to_list
44
from pydantic import BaseModel
55

66
T = TypeVar("T", bound=BaseModel)
77

8+
class NoArgumentsModel(BaseModel):
9+
pass
810

911
class GenericWorkflow(Generic[T]):
1012
def __init__(
1113
self,
1214
name: str,
1315
description: str,
1416
sparql_template: str,
15-
arguments_model: Type[T],
17+
arguments_model: Optional[Type[T]] = None,
1618
):
1719
self.name = name
1820
self.description = description
@@ -25,7 +27,7 @@ def run(self, parameters: T):
2527
from jinja2 import Template
2628

2729
template = Template(self.sparql_template)
28-
sparql_query = template.render(parameters.model_dump())
30+
sparql_query = template.render(parameters.model_dump() if parameters else {})
2931
# print(sparql_query)
3032
from src import services
3133

@@ -34,12 +36,12 @@ def run(self, parameters: T):
3436
except Exception as e:
3537
return [{'error': str(e)}]
3638

37-
def as_tools(self) -> list[BaseTool]:
39+
def as_tools(self) -> list[BaseTool]:
3840
return [
3941
StructuredTool(
4042
name=self.name,
4143
description=self.description,
42-
func=lambda **kwargs: self.run(self.arguments_model(**kwargs)),
43-
args_schema=self.arguments_model,
44+
func=lambda **kwargs: self.run(self.arguments_model(**kwargs)) if self.arguments_model else self.run(None),
45+
args_schema=self.arguments_model if self.arguments_model else NoArgumentsModel,
4446
)
4547
]

src/core/templatablesparqlquery/workflows/TemplatableSparqlQuery.py

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ def templatable_queries():
2121
from src import services
2222

2323
results = services.triple_store_service.query("""
24-
PREFIX intentMapping: <http://ontology.naas.ai/intentMapping/>
25-
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
26-
SELECT ?query ?label ?description ?sparqlTemplate ?hasArgument
27-
WHERE {
28-
?query a intentMapping:TemplatableSparqlQuery ;
29-
intentMapping:intentDescription ?description ;
30-
intentMapping:sparqlTemplate ?sparqlTemplate ;
31-
intentMapping:hasArgument ?hasArgument ;
32-
rdfs:label ?label .
33-
}
24+
PREFIX intentMapping: <http://ontology.naas.ai/intentMapping/>
25+
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
26+
SELECT ?query ?label ?description ?sparqlTemplate ?hasArgument
27+
WHERE {
28+
?query a intentMapping:TemplatableSparqlQuery ;
29+
intentMapping:intentDescription ?description ;
30+
intentMapping:sparqlTemplate ?sparqlTemplate ;
31+
rdfs:label ?label ;
32+
OPTIONAL {?query intentMapping:hasArgument ?hasArgument } .
33+
}
3434
""")
3535

3636
queries = {}
@@ -121,32 +121,38 @@ def load_workflows():
121121
try:
122122
query = queries[_query]
123123

124-
# Arguments Model with validation patterns
125-
arguments_model = create_model(
126-
f"{str(query['label']).capitalize()}Arguments",
127-
**{
128-
str(arguments[argument]["name"]): (
129-
str,
130-
Field(
131-
...,
132-
description=str(arguments[argument]["description"]),
133-
pattern=str(arguments[argument]["validationPattern"]),
134-
# You could also add additional metadata from validationFormat if needed
135-
example=str(arguments[argument]["validationFormat"]),
136-
),
137-
)
138-
for argument in query.get("hasArgument")
139-
},
140-
)
124+
arguments_model = None
125+
if query.get("hasArgument") and len(query.get("hasArgument")) > 0 and all(query.get("hasArgument")):
126+
logger.debug(f"Arguments: {query.get('hasArgument')}")
127+
# Arguments Model with validation patterns
128+
arguments_model = create_model(
129+
f"{str(query['label']).capitalize()}Arguments",
130+
**{
131+
str(arguments[argument]["name"]): (
132+
str,
133+
Field(
134+
...,
135+
description=str(arguments[argument]["description"]),
136+
pattern=str(arguments[argument]["validationPattern"]),
137+
# You could also add additional metadata from validationFormat if needed
138+
example=str(arguments[argument]["validationFormat"]),
139+
),
140+
)
141+
for argument in query.get("hasArgument")
142+
},
143+
)
141144

142145
p = GenericWorkflow[arguments_model](
143146
str(query["label"]),
144147
str(query["description"]),
145148
str(query["sparqlTemplate"]),
146-
arguments_model,
149+
arguments_model if arguments_model else None,
147150
)
148151
workflows.append(p)
152+
149153
except Exception as e:
150154
logger.error(f"Error loading workflow: {e}")
155+
import traceback
156+
traceback.print_exc()
151157

152158
return workflows

src/marketplace/domains/cyber-security-analyst/agents/CyberSecurityAgent.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,6 @@ def create_agent(
9999
)
100100
logger.info("Using OpenAI model: gpt-4o")
101101

102-
if agent_shared_state is None:
103-
agent_shared_state = AgentSharedState()
104-
105102
# Load all 22 competency question tools from CyberSecurityQueries.ttl
106103
# The TTL is auto-loaded from /ontologies directory into triplestore
107104
from src.core.templatablesparqlquery import get_tools
@@ -139,9 +136,9 @@ def create_agent(
139136
# Create intents - map all CQ tools to TOOL intent type
140137
intents = [
141138
Intent(
142-
name=tool_name,
143-
type=IntentType.TOOL,
144-
description=f"Answer competency question {tool_name}",
139+
intent_value=tool_name,
140+
intent_type=IntentType.TOOL,
141+
intent_target=tool_name,
145142
)
146143
for tool_name in cq_tools
147144
]

0 commit comments

Comments
 (0)