The two modes
Every chat request in FIM One starts with a question: is an Agent selected? The answer determines how resources — Connectors, Knowledge Bases, Skills, and MCP servers — are discovered and assembled into the tool set the LLM can use. Agent-Constrained Mode activates when the user picks a specific Agent. The system loads only the resources that Agent has been explicitly configured with:- Connectors: only the Agent’s bound
connector_idsare loaded as tools. - Knowledge Bases: only the Agent’s bound
kb_idsare injected as retrieval tools. - Skills: globally available — all active Skills visible to the user are injected, because Skills are organizational SOPs, not Agent-specific knowledge. (See Skills as Global SOPs below.)
- MCP Servers: always user-scoped — all active MCP servers visible to the user are loaded in both modes.
- Instructions: the Agent’s
instructionsfield defines the persona and behavioral guidelines injected into the system prompt.
- Connectors: all Connectors visible to the user (own + org-shared + Market-subscribed) are loaded.
- Knowledge Bases: all accessible KBs are available for retrieval via
kb_retrieve. - Skills: all active Skills visible to the user are injected as SOP stubs.
- MCP Servers: same as agent-constrained — all active servers visible to the user.
- Instructions: a generic assistant persona is used.
_resolve_tools(), which is called on every chat request:
The practical effect: users can start chatting immediately without configuring an Agent. The system discovers available resources and exposes them as tools. Selecting an Agent narrows the scope — it does not unlock new capabilities, it focuses existing ones.
What each mode discovers
The two modes differ in scope, not in kind. Both produce aToolRegistry — they just fill it differently.
Auto-Discovery Mode (no Agent selected):
Agent-Constrained Mode (Agent selected):
The key asymmetry: Connectors and Knowledge Bases are scoped by the Agent, but Skills and MCP Servers remain global in both modes.
CallAgentTool (agent delegation) is only available in Auto-Discovery mode — it is not registered when a specific Agent is selected. This is a security measure: a marketplace agent could otherwise use call_agent to invoke other agents and access their private prompts. Skills are organizational rules (everyone follows the same SOPs), while Connectors and KBs are capability bindings (different agents connect to different systems).
Everything is a tool
At the LLM level, all resource types converge into a flat list of callable tools. The LLM has no structural awareness of whether it is calling a Connector, an MCP server, or a Knowledge Base. It sees aToolRegistry — a set of functions with names, descriptions, and parameter schemas.
The key insight: an Agent is not a tool — it is the entity that uses tools. The Agent contributes its instructions to the system prompt and determines which tools are available. But from the LLM’s perspective, there is no “agent” concept — only a system prompt and a set of callable functions.
This uniformity is what makes the system extensible. Adding a new resource type means implementing the
Tool protocol (name, description, parameters_schema, run()). The execution engines, context management, and LLM interaction layer remain unchanged.
Skills as global SOPs
Skills occupy a layer above Agents. They are organizational policies and procedures that every Agent must follow, regardless of which Agent is selected.Why Skills are not bound to Agents
A Skill like “Customer Complaint Handling SOP” applies to every agent that interacts with customers. Binding Skills to Agents creates a bidirectional ownership problem: if a Skill orchestrates Agents, and Agents own Skills, who controls whom? Skills are global by design — they are company rules, not agent-specific knowledge. The_resolve_tools() function loads all active Skills visible to the user regardless of Agent selection, using the same resolve_visibility() filter used for other resources.
Two injection modes
Skills support two injection modes — progressive (default) and inline — controlled bySKILL_TOOL_MODE or the Agent’s model_config_json.skill_tool_mode. In progressive mode, only compact stubs appear in the system prompt; the LLM calls read_skill(name) on demand to load the full content. This is part of FIM One’s broader Progressive Disclosure architecture that minimizes context consumption across all resource types.
Agent as persona, not container
FIM One’s architecture reflects a deliberate shift from an Agent-centric model to a Resource-centric model. Previous model: the Agent was a container that gated access to all resources. No Agent selected meant no Connectors, no Skills, no specialized KB. The Agent was the mandatory entry point for any capability. Current model: the Agent is a persona — a set of instructions and behavioral guidelines — combined with an optional resource constraint. Resources exist independently of Agents. Selecting an Agent narrows the scope; not selecting one opens it fully. This means:- Users can start chatting immediately without configuring an Agent.
- The system auto-discovers available resources and exposes them as tools.
- Agents become lightweight personas that can be created quickly — just write instructions and optionally bind specific Connectors and KBs.
- Resource management is decoupled from Agent management. Publishing a Connector to an organization makes it available everywhere — in auto-discovery mode, in Agent binding dropdowns, and in agent delegation resolution.
Agent Delegation
FIM One supports delegating tasks to specialist agents viaCallAgentTool — but only in Auto mode (no agent selected). When a user selects a specific Agent, delegation is disabled and the Agent focuses exclusively on its own tools.
Two modes: Auto vs Agent-selected
Why delegation is disabled in Agent-selected mode: Security. A marketplace agent could use
call_agent to invoke other agents and read their private system prompts. By restricting delegation to Auto mode — where the system LLM (not any individual agent’s prompt) controls the flow — private agent prompts are never exposed to untrusted agent configurations.
Auto mode as the orchestration layer
Auto mode is a first-class concept in the UI. The agent selector shows “Auto” as the default option. When Auto is active, the system LLM acts as an orchestrator: it sees the full catalog of visible agents and can delegate tasks to the best-fit specialist on each iteration. This replaces the need for a dedicated “parent agent” — the system itself is the orchestrator.Agent catalog
At runtime, all active, non-builder Agents visible to the user are assembled into a catalog. Each Agent’s name and description are listed in thecall_agent tool’s parameter schema, allowing the LLM to choose the right specialist semantically — no hardcoded routing.
Full tool inheritance
When a delegated agent is invoked viacall_agent(agent_id, task), it receives a complete ToolRegistry built from its own configuration — including its bound Connectors, KB, and built-in tools. Delegated agents are full execution units, not text-only advisors.
One-level delegation
To prevent infinite recursion, delegated agents do not receive thecall_agent tool. Delegation is always one level deep: Auto mode calls a specialist, the specialist executes and returns a result. The system synthesizes results from multiple delegated agents.
Parallel execution
In native function-calling mode, the LLM can invoke multiplecall_agent calls in a single turn. These execute concurrently via asyncio.gather, enabling patterns like “search three sources simultaneously.”
Visibility model
All resource discovery — in both modes — is governed by a unified visibility model with three tiers:
The
resolve_visibility() function in web/visibility.py builds a SQL filter that includes all three tiers in a single query:
- Auto-discovering Connectors in no-agent mode
- Building the Agent catalog for
CallAgentTool - Loading visible Skills for system prompt injection
- MCP server resolution
- Agent configuration lookup (ensuring a user can only select Agents visible to them)
Relationship map
FIM One has two parallel execution paradigms — Chat (Agent-driven) and Workflow (DAG-driven) — that share the same underlying resources but orchestrate them differently. Key takeaways from the diagram:- Agent and Workflow are parallel paradigms. Both can use Connectors, Knowledge Bases, and MCP Servers — but through different mechanisms. Agents use them as tools in a
ToolRegistry; Workflows use them as typed DAG nodes. - Workflow can orchestrate Agents via the
AGENTnode — a Workflow step can invoke a full Agent with its own ReAct/DAG loop. The reverse is not true: Agents cannot directly invoke Workflows (only indirectly via API/webhook triggers). - Skills are injected into Agents only. Skills are system prompt text — they guide Agent behavior. Workflows don’t consume Skills because Workflow nodes execute deterministic logic, not LLM-guided reasoning.
- Shared resources, different access patterns. A Connector can be called by an Agent (via
ConnectorToolAdapter), by a Workflow (viaCONNECTORnode), or by both in the same business process — e.g., a Workflow triggers an Agent that queries the same Connector the Workflow also uses in a later step.
Workflow Engine — the other execution paradigm
While this document focuses on Agent-driven chat execution, FIM One includes a full Workflow Engine — a visual DAG editor with 26 node types for fixed-process automation.
The two paradigms are complementary. Use Agents when the task is open-ended (“analyze this quarter’s sales data and recommend actions”). Use Workflows when the process is known (“every Monday, pull new invoices from ERP, run compliance checks, and route exceptions to a human reviewer”). A Workflow can invoke an Agent for any step that needs flexible reasoning within an otherwise fixed pipeline.
For details on Agent execution modes and Workflow node types, see Execution Modes.