Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 167 additions & 0 deletions a2as.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
manifest:
version: "0.1.3"
schema: https://a2as.org/cert/schema
subject:
name: virgo-alpha/frisque
source: https://github.com/virgo-alpha/frisque
branch: main
commit: "972ba521"
scope: [agents/jsonformattingagent/app/agent.py, agents/orchestratoragent/app/agent.py, agents/websearchagent/app/agent.py,
scans/tasks.py]
issued:
by: A2AS.org
at: '2026-02-11T16:58:27Z'
url: https://a2as.org/certified/agents/virgo-alpha/frisque
signatures:
digest: sha256:48dapCs2znxVhwq26HlHlmz3mSioKgBS2tfJmfZePuI
key: ed25519:haxuIpSrjf4hhxHpUBNliVD0rMercp2U8NQyJaQuEY0
sig: ed25519:JTS9zKF6M9SYz3zxDV9EDhuTQMFHfYbUmtmyrFKkC4NfWSZ0kJ7ub978f8RNm0WyQMlA2sfsku3b1iK_TvvRCQ

agents:
JsonFormattingAgent:
type: instance
models: [gemini-2.0-flash-001]
params:
name: JsonFormattingAgent
instruction: [You are a data formatting expert. You will receive a block of unstructured text., 'Your sole purpose is
to analyze the text and extract the required information,', populating it into the structured output format., 'If
you cannot find a value for a field, use the string ''Not Found''.']
output_schema: CompanyReport
OrchestratorAgent:
type: instance
models: [gemini-2.0-flash-001]
tools: [company_researcher, web_search, call_json_formatter]
params:
name: OrchestratorAgent
instruction: [You are a master data analyst. Your goal is to create a detailed JSON object about a company based on
the user's prompt., 'Your workflow:', '1. **Initial Research**: Call `company_researcher` with the company name.
This gives you general background.', '2. **Targeted Follow-ups**: If any fields are missing (see list below), use
`web_search` to query for them. Do this even if some values seem partially available.', '3. **Formatting**: Combine
all raw text and pass it to `call_json_formatter`, which will return a JSON object with the following fields:',
'- official_name', '- description', '- industry', '- founders', '- ceo', '- products', '- geographical_location',
'- employee_size', '- pricing_plans', '- funding', '- valuation', '- release_date', '- alternatives', 'If you cannot
find a field, do not guess—just ensure the formatter receives ''Not Found'' where appropriate.', 'Your final answer
MUST be the direct, unmodified output from `call_json_formatter`.']
WebSearchAgent:
type: instance
models: [gemini-2.0-flash-001]
tools: [web_search]
params:
name: WebSearchAgent
instruction: [You are a simple search service. The user's prompt is a search query., Immediately call the `web_search`
tool with the user's prompt as the `query`., Return the raw output from the tool directly. Do not add any extra
text.]

models:
gemini-2.0-flash-001:
type: literal
agents: [WebSearchAgent, OrchestratorAgent, JsonFormattingAgent]

tools:
call_json_formatter:
type: function
agents: [OrchestratorAgent]
params:
description: Use this tool to convert the raw text into a structured JSON object.
company_researcher:
type: function
agents: [OrchestratorAgent]
params:
description: |-
Use this tool FIRST to get a general overview and raw text about a company.
This should be your first step.
web_search:
type: function
agents: [WebSearchAgent, OrchestratorAgent]
params:
description: Use this tool for targeted follow-up searches to find specific, missing pieces of information like employee
size, founders, etc.

imports:
Agent: google.adk.agents.Agent
auth: google.auth
BaseModel: pydantic.BaseModel
call_orchestrator_agent: utils.call_orchestrator_agent
DetailView: django.views.generic.DetailView
Field: pydantic.Field
json: json
JsonResponse: django.http.JsonResponse
List: typing.List
load_dotenv: dotenv.load_dotenv
logging: logging
LoginRequiredMixin: django.contrib.auth.mixins.LoginRequiredMixin
messages: django.contrib.messages
os: os
perform_scan_task: scans.tasks.perform_scan_task
re: re
redirect: django.shortcuts.redirect
render: django.shortcuts.render
requests: requests
reverse_lazy: django.urls.reverse_lazy
root_agent: app.agent.root_agent
RunScanForm: forms.RunScanForm
ScanJob: models.ScanJob
ScanResult: models.ScanResult
shared_task: celery.shared_task
TavilyClient: tavily.TavilyClient
uuid: uuid
View: django.views.View

functions:
call_json_formatter:
type: sync
module: agents.orchestratoragent.app.agent
args: [text_to_format]
params:
returns: str
company_researcher:
type: sync
module: agents.orchestratoragent.app.agent
args: [query]
params:
returns: str
get:
type: sync
module: scans.views
args: [self, request]
perform_scan_task:
type: sync
module: scans.tasks
args: [scan_job_id]
post:
type: sync
module: scans.views
args: [self, request]
web_search:
type: sync
module: agents.orchestratoragent.app.agent
args: [query]
params:
returns: str

variables:
JSON_FORMATTING_AGENT_URL:
type: env
params:
caller: [os.environ.get]
path: [agents.orchestratoragent.app.agent]
TAVILY_API_KEY:
type: env
params:
caller: [os.environ.get, TavilyClient]
path: [agents.websearchagent.app.agent, agents.orchestratoragent.app.agent]
WEB_SEARCH_AGENT_URL:
type: env
params:
caller: [os.environ.get]
path: [agents.orchestratoragent.app.agent]

networks:
localhost:
type: api
actions: [POST]
urls: [/run_sse]
protocols: [http]
ports: ["8501", "8503"]
params:
caller: [company_researcher, call_json_formatter]