{"id":108168,"date":"2026-07-31T19:58:34","date_gmt":"2026-07-31T19:58:34","guid":{"rendered":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/"},"modified":"2026-07-31T19:58:34","modified_gmt":"2026-07-31T19:58:34","slug":"building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent","status":"publish","type":"post","link":"https:\/\/youzum.net\/zh\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/","title":{"rendered":"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent"},"content":{"rendered":"<p class=\"wp-block-paragraph\">In this tutorial, we build and execute a multi-agent workflow with<a href=\"https:\/\/github.com\/omnigent-ai\/omnigent\"> <strong>Omnigent<\/strong><\/a> using a reliable, isolated Python environment created with uv. We configure a financial research lead agent that retrieves a live USD-to-EUR exchange rate from an external API, prepares a concise client-ready summary, and delegates its draft to a dedicated text-auditing sub-agent for clarity and length validation. We define reusable Python functions as callable agent tools, describe the complete agent structure in YAML, and use the Claude Agent SDK as the execution harness. We also manage the Anthropic API key securely through environment variables, apply non-interactive policies that limit tool calls and control session costs, and run the workflow directly from Colab without requiring Node.js, tmux, or an interactive terminal. Through this implementation, we explore how Omnigent combines agents, tools, delegation, live data access, and governance within a single configurable system.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">import os, sys, subprocess, textwrap, pathlib, getpass\ndef sh(cmd, **kw):\n   \"\"\"Run a command, and on failure show the ACTUAL error, not just a code.\"\"\"\n   print(\"$\", \" \".join(map(str, cmd)))\n   p = subprocess.run(cmd, text=True, capture_output=True, **kw)\n   if p.returncode != 0:\n       print(p.stdout or \"\", p.stderr or \"\", sep=\"n\")\n       raise RuntimeError(f\"Command failed ({p.returncode}): {' '.join(map(str, cmd))}\")\n   return p\nWORKDIR = pathlib.Path(\"\/content\/omnigent_tutorial\")\nWORKDIR.mkdir(parents=True, exist_ok=True)\nVENV = WORKDIR \/ \".venv\"\nsubprocess.run([sys.executable, \"-m\", \"pip\", \"install\", \"-q\", \"uv\"], check=True)\nif not (VENV \/ \"bin\" \/ \"python\").exists():\n   sh([\"uv\", \"venv\", \"--python\", \"3.12\", str(VENV)])\nPY = str(VENV \/ \"bin\" \/ \"python\")\nsh([\"uv\", \"pip\", \"install\", \"--python\", PY, \"-q\", \"omnigent\", \"requests\"])\nOMNI = str(VENV \/ \"bin\" \/ \"omnigent\")\nprint(\"n<img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png\" alt=\"\u2705\" class=\"wp-smiley\" \/>\", subprocess.run([OMNI, \"--version\"], capture_output=True, text=True).stdout.strip())\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We import the required Python modules and define a helper function that executes shell commands while displaying detailed error information when a command fails. We create a dedicated working directory and use uv to build an isolated Python 3.12 virtual environment that avoids Colab\u2019s ensurepip limitation. We then install Omnigent and Requests inside the environment, locate the Omnigent CLI executable, and verify the installation by printing its version.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">if not os.environ.get(\"ANTHROPIC_API_KEY\"):\n   os.environ[\"ANTHROPIC_API_KEY\"] = getpass.getpass(\"Anthropic API key: \")\nenv = os.environ.copy()\nenv[\"OMNIGENT_NO_UPDATE_CHECK\"] = \"1\"\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We securely collect the Anthropic API key only when it is not already available in the notebook environment. We store the credential in the current process environment so that Omnigent can detect it without writing sensitive information to a file. We also create a separate environment configuration for the subprocess and turn off Omnigent\u2019s automatic update check during execution.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">(WORKDIR \/ \"agent_tools.py\").write_text(textwrap.dedent('''\n   \"\"\"Local tools exposed to the Omnigent agents in this tutorial.\"\"\"\n   import requests\n   def get_exchange_rate(base_currency: str, target_currency: str) -&gt; dict:\n       \"\"\"Look up the latest FX rate between two ISO-4217 currency codes.\"\"\"\n       r = requests.get(\n           \"https:\/\/api.frankfurter.app\/latest\",\n           params={\"from\": base_currency.upper(), \"to\": target_currency.upper()},\n           timeout=10,\n       )\n       r.raise_for_status()\n       data = r.json()\n       return {\n           \"base\": base_currency.upper(),\n           \"target\": target_currency.upper(),\n           \"rate\": data[\"rates\"][target_currency.upper()],\n           \"date\": data[\"date\"],\n       }\n   def word_count(text: str) -&gt; int:\n       \"\"\"Count the words in a piece of text.\"\"\"\n       return len(text.split())\n'''))\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We generate a Python module containing the local functions that Omnigent exposes as callable tools to the agents. We define a live exchange-rate tool that sends a request to the Frankfurter API and returns the latest rate, currency codes, and applicable date. We also implement a simple word-count tool that allows the auditing sub-agent to measure the length of the financial summary.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">(WORKDIR \/ \"fx_research_lead.yaml\").write_text(textwrap.dedent('''\n   name: fx_research_lead\n   prompt: |\n     You are a financial research lead. For any question about currency\n     movements: call get_exchange_rate to fetch the live rate, then hand\n     your draft summary to the text_auditor sub-agent for a clarity and\n     length check before giving your final answer to the user.\n   executor:\n     harness: claude-sdk\n   tools:\n     get_exchange_rate:\n       type: function\n       callable: agent_tools.get_exchange_rate\n     text_auditor:\n       type: agent\n       prompt: |\n         You audit short pieces of financial writing. Call word_count to\n         report its length, flag any unexplained jargon, and suggest one\n         concrete clarity improvement.\n       tools:\n         word_count:\n           type: function\n           callable: agent_tools.word_count\n   policies:\n     cap_calls:\n       type: function\n       handler: omnigent.policies.builtins.safety.max_tool_calls_per_session\n       factory_params:\n         limit: 20\n     budget:\n       type: function\n       handler: omnigent.policies.builtins.cost.cost_budget\n       factory_params:\n         max_cost_usd: 1.00\n'''))\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We define the complete multi-agent architecture through a YAML configuration file. We configure the financial research lead, connect it to the exchange-rate tool, and add a text-auditing sub-agent that evaluates the draft using the word-count function. We also apply hard governance policies that restrict the number of tool calls and limit the maximum API cost for the session.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">env[\"PYTHONPATH\"] = str(WORKDIR)\nquestion = (\n   \"What is the current USD to EUR exchange rate? Give me a two-sentence \"\n   \"summary I could paste into a client note.\"\n)\nresult = subprocess.run(\n   [OMNI, \"run\", str(WORKDIR \/ \"fx_research_lead.yaml\"), \"-p\", question, \"--no-session\"],\n   cwd=WORKDIR, env=env, stdin=subprocess.DEVNULL,\n   capture_output=True, text=True, timeout=300,\n)\nprint(\"n\" + \"=\" * 70)\nprint(result.stdout.strip() or \"(no stdout)\")\nif result.returncode != 0 or \"error\" in result.stdout.lower():\n   print(\"-\" * 70)\n   print(\"stderr:\", result.stderr[-2000:])\n   print(f\"nDebug: check ~\/.omnigent\/logs\/runner\/ , or rerun with:n\"\n         f\"  !{OMNI} --debug --log-to-stderr run {WORKDIR\/'fx_research_lead.yaml'} -p \"...\" --no-session\")\nprint(\"=\" * 70)\nprint(f\"\"\"\nNext steps:\n \u2022 Explore the CLI:  !{OMNI} run --help\n \u2022 Bundled demo agents:\n       !{OMNI} polly -p \"review this repo\" --no-session\n       !{OMNI} debby -p \"brainstorm 3 names for a coffee shop\" --no-session\n \u2022 YAML schema:  https:\/\/github.com\/omnigent-ai\/omnigent\/blob\/main\/docs\/AGENT_YAML_SPEC.md\n \u2022 Policies:     https:\/\/github.com\/omnigent-ai\/omnigent\/blob\/main\/docs\/POLICIES.md\n\"\"\")\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We add the tutorial directory to PYTHONPATH, define the currency-related question, and execute the Omnigent agent through a non-interactive subprocess. We capture the generated response, display diagnostic output when execution fails, and provide a debug command for examining runner issues. We finish by printing useful next steps for exploring Omnigent\u2019s CLI, bundled agents, YAML specification, and policy documentation.<\/p>\n<p class=\"wp-block-paragraph\">In conclusion, we created a practical Omnigent multi-agent application that integrates live financial data retrieval, hierarchical agent delegation, automated writing assessment, and policy-based execution controls. We used uv to solve Colab\u2019s ensurepip limitation and maintain a separate Python 3.12 environment without modifying the notebook\u2019s system interpreter. We exposed local Python functions as agent-accessible tools, defined the agent and sub-agent behavior through a readable YAML configuration, and enforced hard limits on tool usage and API spending. We also executed the workflow non-interactively, captured both standard output and diagnostic errors, and established a structure that supports easy model changes without altering the underlying agent logic. We now have a reusable foundation for developing more sophisticated, secure, cost-controlled, and tool-enabled multi-agent systems for financial research and other real-world applications in Google Colab.<\/p>\n<p class=\"wp-block-paragraph\">\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<\/p><p class=\"wp-block-paragraph\">\n<\/p><p class=\"wp-block-paragraph\">Check out the\u00a0<strong><a href=\"https:\/\/github.com\/MARKTECHPOST-AI-MEDIA-INC\/AI-Agents-Projects-Tutorials\/blob\/main\/Agentic%20AI%20Codes\/omnigent_multi_agent_fx_research_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">Full Code here<\/a>.\u00a0<\/strong>Also,\u00a0feel free to follow us on\u00a0<strong><a href=\"https:\/\/x.com\/intent\/follow?screen_name=marktechpost\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Twitter<\/mark><\/a><\/strong>\u00a0and don\u2019t forget to join our\u00a0<strong><a href=\"https:\/\/www.reddit.com\/r\/machinelearningnews\/\" target=\"_blank\" rel=\"noreferrer noopener\">150k+ML SubReddit<\/a><\/strong>\u00a0and Subscribe to\u00a0<strong><a href=\"https:\/\/www.aidevsignals.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">our Newsletter<\/a><\/strong>. Wait! are you on telegram?\u00a0<strong><a href=\"https:\/\/t.me\/machinelearningresearchnews\" target=\"_blank\" rel=\"noreferrer noopener\">now you can join us on telegram as well.<\/a><\/strong><\/p>\n<p class=\"wp-block-paragraph\">Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.?\u00a0<strong><a href=\"https:\/\/forms.gle\/wbash1wF6efRj8G58\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Connect with us<\/mark><\/a><\/strong><\/p>\n<p>The post <a href=\"https:\/\/www.marktechpost.com\/2026\/07\/30\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/\">Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent<\/a> appeared first on <a href=\"https:\/\/www.marktechpost.com\/\">MarkTechPost<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>In this tutorial, we build and execute a multi-agent workflow with Omnigent using a reliable, isolated Python environment created with uv. We configure a financial research lead agent that retrieves a live USD-to-EUR exchange rate from an external API, prepares a concise client-ready summary, and delegates its draft to a dedicated text-auditing sub-agent for clarity and length validation. We define reusable Python functions as callable agent tools, describe the complete agent structure in YAML, and use the Claude Agent SDK as the execution harness. We also manage the Anthropic API key securely through environment variables, apply non-interactive policies that limit tool calls and control session costs, and run the workflow directly from Colab without requiring Node.js, tmux, or an interactive terminal. Through this implementation, we explore how Omnigent combines agents, tools, delegation, live data access, and governance within a single configurable system. Copy CodeCopiedUse a different Browser import os, sys, subprocess, textwrap, pathlib, getpass def sh(cmd, **kw): &#8220;&#8221;&#8221;Run a command, and on failure show the ACTUAL error, not just a code.&#8221;&#8221;&#8221; print(&#8220;$&#8221;, &#8221; &#8220;.join(map(str, cmd))) p = subprocess.run(cmd, text=True, capture_output=True, **kw) if p.returncode != 0: print(p.stdout or &#8220;&#8221;, p.stderr or &#8220;&#8221;, sep=&#8221;n&#8221;) raise RuntimeError(f&#8221;Command failed ({p.returncode}): {&#8216; &#8216;.join(map(str, cmd))}&#8221;) return p WORKDIR = pathlib.Path(&#8220;\/content\/omnigent_tutorial&#8221;) WORKDIR.mkdir(parents=True, exist_ok=True) VENV = WORKDIR \/ &#8220;.venv&#8221; subprocess.run([sys.executable, &#8220;-m&#8221;, &#8220;pip&#8221;, &#8220;install&#8221;, &#8220;-q&#8221;, &#8220;uv&#8221;], check=True) if not (VENV \/ &#8220;bin&#8221; \/ &#8220;python&#8221;).exists(): sh([&#8220;uv&#8221;, &#8220;venv&#8221;, &#8220;&#8211;python&#8221;, &#8220;3.12&#8221;, str(VENV)]) PY = str(VENV \/ &#8220;bin&#8221; \/ &#8220;python&#8221;) sh([&#8220;uv&#8221;, &#8220;pip&#8221;, &#8220;install&#8221;, &#8220;&#8211;python&#8221;, PY, &#8220;-q&#8221;, &#8220;omnigent&#8221;, &#8220;requests&#8221;]) OMNI = str(VENV \/ &#8220;bin&#8221; \/ &#8220;omnigent&#8221;) print(&#8220;n&#8221;, subprocess.run([OMNI, &#8220;&#8211;version&#8221;], capture_output=True, text=True).stdout.strip()) We import the required Python modules and define a helper function that executes shell commands while displaying detailed error information when a command fails. We create a dedicated working directory and use uv to build an isolated Python 3.12 virtual environment that avoids Colab\u2019s ensurepip limitation. We then install Omnigent and Requests inside the environment, locate the Omnigent CLI executable, and verify the installation by printing its version. Copy CodeCopiedUse a different Browser if not os.environ.get(&#8220;ANTHROPIC_API_KEY&#8221;): os.environ[&#8220;ANTHROPIC_API_KEY&#8221;] = getpass.getpass(&#8220;Anthropic API key: &#8220;) env = os.environ.copy() env[&#8220;OMNIGENT_NO_UPDATE_CHECK&#8221;] = &#8220;1&#8221; We securely collect the Anthropic API key only when it is not already available in the notebook environment. We store the credential in the current process environment so that Omnigent can detect it without writing sensitive information to a file. We also create a separate environment configuration for the subprocess and turn off Omnigent\u2019s automatic update check during execution. Copy CodeCopiedUse a different Browser (WORKDIR \/ &#8220;agent_tools.py&#8221;).write_text(textwrap.dedent(&#8221;&#8217; &#8220;&#8221;&#8221;Local tools exposed to the Omnigent agents in this tutorial.&#8221;&#8221;&#8221; import requests def get_exchange_rate(base_currency: str, target_currency: str) -&gt; dict: &#8220;&#8221;&#8221;Look up the latest FX rate between two ISO-4217 currency codes.&#8221;&#8221;&#8221; r = requests.get( &#8220;https:\/\/api.frankfurter.app\/latest&#8221;, params={&#8220;from&#8221;: base_currency.upper(), &#8220;to&#8221;: target_currency.upper()}, timeout=10, ) r.raise_for_status() data = r.json() return { &#8220;base&#8221;: base_currency.upper(), &#8220;target&#8221;: target_currency.upper(), &#8220;rate&#8221;: data[&#8220;rates&#8221;][target_currency.upper()], &#8220;date&#8221;: data[&#8220;date&#8221;], } def word_count(text: str) -&gt; int: &#8220;&#8221;&#8221;Count the words in a piece of text.&#8221;&#8221;&#8221; return len(text.split()) &#8221;&#8217;)) We generate a Python module containing the local functions that Omnigent exposes as callable tools to the agents. We define a live exchange-rate tool that sends a request to the Frankfurter API and returns the latest rate, currency codes, and applicable date. We also implement a simple word-count tool that allows the auditing sub-agent to measure the length of the financial summary. Copy CodeCopiedUse a different Browser (WORKDIR \/ &#8220;fx_research_lead.yaml&#8221;).write_text(textwrap.dedent(&#8221;&#8217; name: fx_research_lead prompt: | You are a financial research lead. For any question about currency movements: call get_exchange_rate to fetch the live rate, then hand your draft summary to the text_auditor sub-agent for a clarity and length check before giving your final answer to the user. executor: harness: claude-sdk tools: get_exchange_rate: type: function callable: agent_tools.get_exchange_rate text_auditor: type: agent prompt: | You audit short pieces of financial writing. Call word_count to report its length, flag any unexplained jargon, and suggest one concrete clarity improvement. tools: word_count: type: function callable: agent_tools.word_count policies: cap_calls: type: function handler: omnigent.policies.builtins.safety.max_tool_calls_per_session factory_params: limit: 20 budget: type: function handler: omnigent.policies.builtins.cost.cost_budget factory_params: max_cost_usd: 1.00 &#8221;&#8217;)) We define the complete multi-agent architecture through a YAML configuration file. We configure the financial research lead, connect it to the exchange-rate tool, and add a text-auditing sub-agent that evaluates the draft using the word-count function. We also apply hard governance policies that restrict the number of tool calls and limit the maximum API cost for the session. Copy CodeCopiedUse a different Browser env[&#8220;PYTHONPATH&#8221;] = str(WORKDIR) question = ( &#8220;What is the current USD to EUR exchange rate? Give me a two-sentence &#8221; &#8220;summary I could paste into a client note.&#8221; ) result = subprocess.run( [OMNI, &#8220;run&#8221;, str(WORKDIR \/ &#8220;fx_research_lead.yaml&#8221;), &#8220;-p&#8221;, question, &#8220;&#8211;no-session&#8221;], cwd=WORKDIR, env=env, stdin=subprocess.DEVNULL, capture_output=True, text=True, timeout=300, ) print(&#8220;n&#8221; + &#8220;=&#8221; * 70) print(result.stdout.strip() or &#8220;(no stdout)&#8221;) if result.returncode != 0 or &#8220;error&#8221; in result.stdout.lower(): print(&#8220;-&#8221; * 70) print(&#8220;stderr:&#8221;, result.stderr[-2000:]) print(f&#8221;nDebug: check ~\/.omnigent\/logs\/runner\/ , or rerun with:n&#8221; f&#8221; !{OMNI} &#8211;debug &#8211;log-to-stderr run {WORKDIR\/&#8217;fx_research_lead.yaml&#8217;} -p &#8220;&#8230;&#8221; &#8211;no-session&#8221;) print(&#8220;=&#8221; * 70) print(f&#8221;&#8221;&#8221; Next steps: \u2022 Explore the CLI: !{OMNI} run &#8211;help \u2022 Bundled demo agents: !{OMNI} polly -p &#8220;review this repo&#8221; &#8211;no-session !{OMNI} debby -p &#8220;brainstorm 3 names for a coffee shop&#8221; &#8211;no-session \u2022 YAML schema: https:\/\/github.com\/omnigent-ai\/omnigent\/blob\/main\/docs\/AGENT_YAML_SPEC.md \u2022 Policies: https:\/\/github.com\/omnigent-ai\/omnigent\/blob\/main\/docs\/POLICIES.md &#8220;&#8221;&#8221;) We add the tutorial directory to PYTHONPATH, define the currency-related question, and execute the Omnigent agent through a non-interactive subprocess. We capture the generated response, display diagnostic output when execution fails, and provide a debug command for examining runner issues. We finish by printing useful next steps for exploring Omnigent\u2019s CLI, bundled agents, YAML specification, and policy documentation. In conclusion, we created a practical Omnigent multi-agent application that integrates live financial data retrieval, hierarchical agent delegation, automated writing assessment, and policy-based execution controls. We used uv to solve Colab\u2019s ensurepip limitation and maintain a separate Python 3.12 environment without modifying the notebook\u2019s system interpreter. We exposed local Python functions as agent-accessible tools, defined the agent and sub-agent behavior through a readable YAML configuration, and enforced hard limits on tool usage and API spending. We also executed the workflow non-interactively, captured both standard output and diagnostic errors, and established<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_pvb_checkbox_block_on_post":false,"footnotes":""},"categories":[52,5,7,1],"tags":[],"class_list":["post-108168","post","type-post","status-publish","format-standard","hentry","category-ai-club","category-committee","category-news","category-uncategorized","pmpro-has-access"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent - YouZum<\/title>\n<meta name=\"description\" content=\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/youzum.net\/zh\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent - YouZum\" \/>\n<meta property=\"og:description\" content=\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\" \/>\n<meta property=\"og:url\" content=\"https:\/\/youzum.net\/zh\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/\" \/>\n<meta property=\"og:site_name\" content=\"YouZum\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DroneAssociationTH\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-31T19:58:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png\" \/>\n<meta name=\"author\" content=\"admin NU\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin NU\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/\"},\"author\":{\"name\":\"admin NU\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c\"},\"headline\":\"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent\",\"datePublished\":\"2026-07-31T19:58:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/\"},\"wordCount\":705,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"image\":{\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png\",\"articleSection\":[\"AI\",\"Committee\",\"News\",\"Uncategorized\"],\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/\",\"url\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/\",\"name\":\"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent - YouZum\",\"isPartOf\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png\",\"datePublished\":\"2026-07-31T19:58:34+00:00\",\"description\":\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\",\"breadcrumb\":{\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#primaryimage\",\"url\":\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png\",\"contentUrl\":\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/youzum.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/yousum.gpucore.co\/#website\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"name\":\"YouSum\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/yousum.gpucore.co\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\",\"name\":\"Drone Association Thailand\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"width\":300,\"height\":300,\"caption\":\"Drone Association Thailand\"},\"image\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/DroneAssociationTH\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c\",\"name\":\"admin NU\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png\",\"caption\":\"admin NU\"},\"url\":\"https:\/\/youzum.net\/zh\/members\/adminnu\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent - YouZum","description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/youzum.net\/zh\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/","og_locale":"zh_CN","og_type":"article","og_title":"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent - YouZum","og_description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","og_url":"https:\/\/youzum.net\/zh\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/","og_site_name":"YouZum","article_publisher":"https:\/\/www.facebook.com\/DroneAssociationTH\/","article_published_time":"2026-07-31T19:58:34+00:00","og_image":[{"url":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png","type":"","width":"","height":""}],"author":"admin NU","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin NU","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#article","isPartOf":{"@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/"},"author":{"name":"admin NU","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c"},"headline":"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent","datePublished":"2026-07-31T19:58:34+00:00","mainEntityOfPage":{"@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/"},"wordCount":705,"commentCount":0,"publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"image":{"@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#primaryimage"},"thumbnailUrl":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png","articleSection":["AI","Committee","News","Uncategorized"],"inLanguage":"zh-Hans","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/","url":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/","name":"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent - YouZum","isPartOf":{"@id":"https:\/\/yousum.gpucore.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#primaryimage"},"image":{"@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#primaryimage"},"thumbnailUrl":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png","datePublished":"2026-07-31T19:58:34+00:00","description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","breadcrumb":{"@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/"]}]},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#primaryimage","url":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png","contentUrl":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png"},{"@type":"BreadcrumbList","@id":"https:\/\/youzum.net\/building-a-policy-governed-multi-agent-financial-research-workflow-with-omnigent\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/youzum.net\/"},{"@type":"ListItem","position":2,"name":"Building a Policy-Governed Multi-Agent Financial Research Workflow with Omnigent"}]},{"@type":"WebSite","@id":"https:\/\/yousum.gpucore.co\/#website","url":"https:\/\/yousum.gpucore.co\/","name":"YouSum","description":"","publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/yousum.gpucore.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Organization","@id":"https:\/\/yousum.gpucore.co\/#organization","name":"Drone Association Thailand","url":"https:\/\/yousum.gpucore.co\/","logo":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","width":300,"height":300,"caption":"Drone Association Thailand"},"image":{"@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DroneAssociationTH\/"]},{"@type":"Person","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c","name":"admin NU","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png","caption":"admin NU"},"url":"https:\/\/youzum.net\/zh\/members\/adminnu\/"}]}},"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"admin NU","author_link":"https:\/\/youzum.net\/zh\/members\/adminnu\/"},"rttpg_comment":0,"rttpg_category":"<a href=\"https:\/\/youzum.net\/zh\/category\/ai-club\/\" rel=\"category tag\">AI<\/a> <a href=\"https:\/\/youzum.net\/zh\/category\/committee\/\" rel=\"category tag\">Committee<\/a> <a href=\"https:\/\/youzum.net\/zh\/category\/news\/\" rel=\"category tag\">News<\/a> <a href=\"https:\/\/youzum.net\/zh\/category\/uncategorized\/\" rel=\"category tag\">Uncategorized<\/a>","rttpg_excerpt":"In this tutorial, we build and execute a multi-agent workflow with Omnigent using a reliable, isolated Python environment created with uv. We configure a financial research lead agent that retrieves a live USD-to-EUR exchange rate from an external API, prepares a concise client-ready summary, and delegates its draft to a dedicated text-auditing sub-agent for clarity&hellip;","_links":{"self":[{"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/posts\/108168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/comments?post=108168"}],"version-history":[{"count":0,"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/posts\/108168\/revisions"}],"wp:attachment":[{"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/media?parent=108168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/categories?post=108168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/tags?post=108168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}