Tech Connector Headless API
Tech Connector can be used without the Qt desktop UI through the official headless Python API:
For a concept-first explanation of API version 2 reasoning, contextual threads, progress events, runtime tools, modular feature discovery, extensions, and complete examples, read REASONING_RUNTIME_API.md.
from tech_connector.api import TechConnectorHeadlessAPI
api = TechConnectorHeadlessAPI(
project_root="C:/project",
)
status = api.verify_license()
graph = api.plan_prompt("Create a Maya-to-Unreal export pipeline")
dry_run = api.execute_action_graph(graph, dry_run=True)
The same process can run with or without the desktop UI. The UI is the visual front end for review, confirmation, node editing, and status. The headless API uses the same planner, action graph, DCC bridge, execution, repair, and provenance stack for scripts, CI, local services, or another application.
Process-wide LLM queue telemetry and targeted cancellation are also available
through api.llm_queue_status() and api.cancel_llm_request(request_id). See
LLM_QUEUE_MANAGEMENT.md for scheduling categories,
configuration, deadlines, superseding, and cancellation semantics.
Simple AI API
For direct generation, use the provider-neutral api.ai namespace. It keeps
credentials out of results and makes routing inspectable before a paid call:
from tech_connector.api import create_api
api = create_api(project_root="C:/project")
catalog = api.ai.models()
local = api.ai.local_recommendation()
route = api.ai.route(depth="deep")
result = api.ai.generate(
"Explain the safest way to refactor this Maya exporter.",
system="Be concise and cite affected symbols.",
depth="deep",
)
if not result.ok:
raise RuntimeError(result.error)
print(result.result["text"])
print(result.result["route"])
local_recommendation() reports the detected GPU, target models, currently
active installed fallbacks, missing recommended downloads, and runtime guidance.
Use api.ai.benchmark_local() for a short Ollama speed probe; it reports load
time and generated tokens per second and does not contact a cloud provider.
Depths are fast, balanced, deep, and maximum. With OpenAI automatic
selection enabled they map to GPT-6 Luna, GPT-6.1 Sol, GPT-6.1 Sol with higher
reasoning, and GPT-6 Astra respectively. An explicit unrelated model is
preserved. Cloud failure never silently changes the model during a run;
allow_local_fallback=True must be set explicitly.
Use api.reasoning when you need project context, planning, tools, progress
events, or the full Tech Connector orchestration pipeline.
Discovering operations and handling errors
The API is self-describing, so integrations do not need to hard-code every feature or signature:
overview = api.describe()
matches = api.features.search("material generation")
help_payload = api.features.describe("ai.generate", "generate")
for parameter in help_payload["operations"][0]["parameters"]:
print(parameter["name"], parameter["required"], parameter["default"])
Every APIResult keeps the existing ok, result, and error fields and now
also includes error_detail with a stable code, retry guidance, and a suggested
next action. Small scripts can use unwrap():
try:
text = api.ai.generate("Summarize this scene").unwrap()["text"]
except TechConnectorAPIError as exc:
print(exc.code, exc.retryable, exc.suggestion)
Complete public surface inventory
Use api.surface() when building wrappers, bindings, or documentation. It
returns every supported core and namespace operation with its current Python
signature and documentation. Dynamic catalogs are identified separately so a
caller can enumerate them from their authoritative runtime source:
surface = api.surface()
for operation in surface["operations"]:
print(operation["path"], operation["signature"])
# Dynamic surfaces
dcc_functions = api.dcc.catalog()
editor_operations = api.kingdom.editor_capabilities().unwrap()
engine_coverage = api.kingdom.capability_report().unwrap()["value"]
runtime_tools = api.reasoning.tools().unwrap()
ui_actions = api.ui.catalog().unwrap() # requires an attached UI for actions
api.features.get("api.surface") and
api.features.invoke("api.surface", "list") expose the same inventory through
the modular feature registry. The checked-in
API_FUNCTION_CATALOG.md is generated from the current
DCC packages and documents every public module-level host function, including
functions without a friendly alias.
Engine asset reimport and Level mesh binding
The editor Python API can keep a source-linked imported mesh and bind it to a uniquely named Level actor. Reimport preserves the asset ID and advances its revision; the next cook/package uses the updated source:
from tech_connector.game_engine.assets.editor_python_api import TCEditorAPI
editor = TCEditorAPI("C:/project")
mesh = editor.import_asset("C:/source/Character.obj", type_id="tc.static_mesh")
editor.set_level_actor_render_mesh(level_asset_id, "Player", mesh.asset_id)
# After editing C:/source/Character.obj:
editor.reimport_asset(mesh.asset_id)
The current native graphical player imports OBJ render meshes. This binding is not a full skeletal DCC reimport workflow; preserve vertex topology when using an existing skin binding, and verify the packaged character before release.
Connected Services and Smart Functions
api.integrations is the official boundary for Slack, Discord, Jira,
Confluence, ClickUp, connected-account state, and chat smart references such as
@Slack.pipeline-alerts and @Maya.scene.select.
status = api.integrations.status("slack").unwrap()["value"]
applications = api.integrations.applications().unwrap()["value"]
suggestions = api.integrations.suggest("Slack.pipe").unwrap()["value"]
context = api.integrations.resolve(
"Send the validation report to @Slack.pipeline-alerts"
).unwrap()["value"]
Status results never return raw credentials. Secret fields are either empty or masked by the connected-account service.
Cached channel/user discovery is side-effect free. Set refresh=True only when
the caller wants a live provider request:
cached = api.integrations.targets("slack").unwrap()["value"]
live = api.integrations.targets("slack", refresh=True).unwrap()["value"]
setup = api.integrations.oauth_url("slack").unwrap()["value"]
Dispatch is fail-closed. Previewing requires no mutation approval; execution
requires approved=True and preserves explicit targets rather than silently
falling back to a different Slack or Discord destination:
preview = api.integrations.dispatch(
"@Slack.pipeline-alerts Build completed successfully",
dry_run=True,
)
sent = api.integrations.dispatch(
"@Slack.pipeline-alerts Build completed successfully",
approved=True,
)
The same operations are discoverable as feature
integrations.connected_services. Small scripts may import
integration_status, integration_suggestions, and dispatch_integration
directly from tech_connector.api.
Namespace Coverage
The supported high-level namespaces are:
| Namespace | Purpose | Dynamic discovery |
|---|---|---|
api.ai |
Model catalog, routing, local recommendations, benchmarks, generation | api.ai.models() |
api.reasoning / api.runtime |
Context preparation, reasoning, chains, tools | api.reasoning.capabilities(), api.reasoning.tools() |
api.features |
Feature search, signatures, manifests, generic invocation | api.features.manifest() |
api.integrations |
Connected services, smart references, targets, approved dispatch | api.integrations.applications() |
api.dcc |
Bundled host wrappers, bridge execution, live native Python discovery | api.dcc.catalog(), api.dcc.native_catalog("maya") |
api.kingdom / api.game_engine |
Game-engine runtime and project editor | api.kingdom.editor_capabilities() |
api.garden / api.scene_viewer |
Active scene-viewer commands | api.garden.commands() |
api.ophanim / api.image_editor |
Viewport capture and image editing | api.describe() |
api.ui |
Actions on an explicitly attached desktop window | api.ui.catalog() |
Call api.describe() for the stable namespace map and api.surface() for the
exact operation list used by the installed version.
Kingdom's API namespace also exposes the full project editor contract without requiring callers to import internal engine modules:
operations = api.kingdom.editor_capabilities().unwrap()
coverage = api.kingdom.capability_report().unwrap()["value"]
help_payload = api.kingdom.editor_describe("asset_dependency_graph").unwrap()
graph = api.kingdom.editor_call(
"asset_dependency_graph",
asset_id="tc.asset.example",
).unwrap()["value"]
capability_report() lists all registered asset types by family and maturity,
plus the declared editor operation groups and any missing callable handlers.
The short api.kingdom method list is not the entire editor surface. Use
editor_describe(operation) and editor_call(operation, **kwargs) for every
declared editor operation. Existing runtime instances can be passed to
audit_runtime, qualify_runtime, solve_grounded_animation, and
step_vehicle. For Garden, use api.garden.search(query, department=...)
and api.garden.describe(key) to inspect its scene-command registry before
route(key, target) or an active-viewer execution.
runtime_ready describes a usable runtime path; only production_ready claims
production qualification. Registry entries, editor pages, and API methods alone
do not establish Unreal or Unity parity. See the
engine parity program for the required workflows and
evidence gates.
The first UI authoring tranche is available through the same project editor surface. It creates and validates a widget hierarchy, evaluates anchor-based layouts at chosen viewport sizes, and stores a layout preview cook artifact:
created = api.kingdom.editor_call("create_ui_document", name="MainMenu").unwrap()["value"]
asset_id = created["asset_id"]
preview = api.kingdom.editor_call(
"preview_ui_document", asset_id=asset_id, viewport=(390, 844)
).unwrap()["value"]
update_ui_document, validate_ui_document, and cook_ui_document are also
declared editor operations. A Level can bind the validated document's properties
as runtime_world.ui_document; the Windows/D3D11 package compiler then embeds
panel, text, button, and packaged-texture image records for the native player.
An image widget must reference a registered tc.texture asset and the scene's
runtime_world.assets must declare that texture's ID, source, and hash. Missing
packaged textures fail compilation. A button with on_activate: "save_game"
invokes the packaged save path. The player now reflows authored anchors and
parent layout at window resize; legacy packages retain their scaled layout.
The acceptance project checks real D3D11 captures at two window sizes. A UI
Document may set canvas.safe_area to [left, top, right, bottom] pixel
insets; preview and packaged runtime root anchors use the inset rectangle,
including mouse hit-testing. Widgets may also set min_viewport_width in
pixels; narrower viewports hide that widget and its descendants from drawing,
mouse activation, and keyboard/gamepad focus. The acceptance project checks
inset and narrow D3D11 captures plus Save button activation. This is still a
limited runtime slice:
platform accessibility, localization, DPI and narrow-device layout matrices,
console-safe-area policies, and cross-platform player UI are not yet qualified,
so the asset remains
authoring_preview.
Player target selection
The explicit target API prevents a Windows package from being mistaken for a console release:
from tech_connector.game_engine.runtime.tc_player_build_service import (
build_player_for_target, runtime_platform_capabilities,
)
targets = runtime_platform_capabilities()["targets"]
pc_build = build_player_for_target(scene_path, output_dir, target="windows_pc")
windows_pc builds the current D3D11/XInput player. xbox_series_xs and ps5
are visible in the capabilities report but deliberately reject package builds
until native platform implementations and device acceptance exist. The shared
gamepad actions use south/east/west face-button positions; Xbox A/B/X and
PlayStation Cross/Circle/Square are mapped to those positions by platform input
adapters. Today, only the Windows XInput adapter is implemented. Xbox requires
a GDKX console project and Xbox renderer/platform services; PS5 requires
PlayStation partner SDK access and a native renderer/platform layer. Neither
console has a shippable binary, certification result, or hardware acceptance
receipt yet.
Gameplay and UI buttons can be configured in a Level's runtime_world before
compilation:
runtime_world["gamepad_bindings"] = {
"jump": "NORTH", "crouch": "LEFT_SHOULDER", "crawl": "RIGHT_SHOULDER",
"ui_confirm": "WEST", "ui_cancel": "EAST", "ui_menu": "MENU",
}
Supported button names are SOUTH, EAST, WEST, NORTH, LEFT_SHOULDER,
RIGHT_SHOULDER, and MENU. Defaults are south/east/west for
jump/crouch/crawl, and south/east/menu for UI confirm/cancel/menu. The compiler
rejects unknown names and duplicate bindings within gameplay or UI context.
In the Windows player, UI buttons with on_activate values rebind_jump,
rebind_crouch, and rebind_crawl prompt for the next gamepad face or shoulder
button and update the corresponding gameplay action; an
occupied gameplay button or Menu is rejected without changing the mapping.
The Windows player persists successful rebinds to a versioned, checksummed,
atomically replaced per-scene profile under %LOCALAPPDATA%/TechConnector/TCPlayer/profiles.
--input-profile <path> overrides that location, including for acceptance runs.
Malformed or checksum-invalid profiles are rejected and authored bindings stay
in force. A failed profile write also rejects the proposed rebind, leaving the
current mapping and button label unchanged. The acceptance harness verifies
save/load across two processes for Jump, Crouch, and Crawl, corrupt-load
rejection, and failed-write rollback with simulated input only. The authored
third-person HUD includes Save and Load buttons. A simulated Xbox Menu → D-pad
→ Confirm route checks that Load receives focus, is visibly highlighted, and
restores the saved slot across player processes. Save/Load actions and F5/F6
now show a temporary HUD result (Saved, Loaded, Save failed, or
Load failed); the missing-save path is exercised and captured separately.
A complete settings screen and
physical Xbox/PS5 controller qualification remain open.
When Windows gamepad input is lost, controller-owned UI focus and a pending
rebind are cleared so keyboard controls can resume. The packaged simulated
disconnect check opens UI focus, drops input, then records movement from the
keyboard. It also simulates reconnection and verifies the controller can
reopen UI focus. On reconnect, already-held buttons and a deflected stick are
ignored until released/neutral; fresh movement works before a deliberate Menu
press refocuses the HUD. This does not prove physical hot-plug behavior.
A second route starts a Jump rebind before input loss, then verifies that the
pending capture is cancelled, the original Jump label returns, keyboard
movement works, and reconnecting input can navigate the HUD again.
When XInput ownership moves directly from one connected controller slot to
another, the Windows player clears controller-owned focus and pending capture.
It treats buttons already held on the new controller as held, not fresh presses;
the new owner must release and press Menu again to focus the HUD. A packaged
scripted slot-switch check verifies the owner-change signal, keyboard fallback,
and visibly refocused Save button. Gameplay buttons and a deflected movement
stick present at handoff are also ignored until each returns to neutral; a
later deliberate stick input is accepted. This is simulated input, not physical
multi-controller hot-plug qualification.
The soak verifier accepts --min-draw-calls and --require-motion-search
for an explicitly scoped imported-character package; the default remains the
260-draw synthetic stress check. Timing and memory receipts must be interpreted
within their named scene, hardware, renderer, and scripted route.
--require-mixed-motion additionally checks each complete 240-frame route
cycle for strafing, crouch, crawl, jump, and idle, plus bounded character
position. The player provides --scripted-motion-soak to generate that route
after the 380-frame traversal.
The acceptance project also captures a 480×270 outer window (464×231 client)
and clicks the lowest Crawl control, proving that the compact two-column
controls remain reachable in this short Windows viewport. This is not a DPI
or device-scale matrix.
Save migration accepts v1 POS and v2 BODY records (plus VAR) only when records are
complete, finite, non-duplicated, and newline-terminated. Malformed legacy
primaries are rejected without changing the world; a valid .bak can still
restore the prior state. This does not cover future save-schema versions or a
full platform storage matrix.
New v3 saves include the source scene ID in a checksummed SCENE record. A
save bound to another scene is rejected before applying any world state, even
if entity names match. Older v3 files without SCENE remain readable for
migration; their scene origin cannot be authenticated retroactively. Backup
rotation also refuses to copy a valid but foreign-scene primary over this
scene's .bak, preserving the last compatible recovery point.
Windows audio telemetry now distinguishes a buffer accepted by XAudio2
(submitted) from a buffer-end callback (completed). Packaged acceptance
requires a matching completion for the authored cue. This does not establish
audible output quality, latency, or behavior across audio devices.
Source-voice volume setup now fails the cue immediately if XAudio2 rejects it,
rather than reporting a successfully submitted cue with an unusable voice.
The exploration HUD has an Audio: On / Audio: Muted button that adjusts the
Windows mastering voice volume. A short-window packaged test clicks it twice,
checks both states, and still requires the cue buffer completion receipt. The
mute preference is saved per scene under %LOCALAPPDATA%/TechConnector/TCPlayer/profiles
as a versioned, checksummed .tcaudio file. --audio-profile <path> isolates
acceptance runs. Corrupt preferences fall back to Audio On, and a failed write
rolls the live mute state back. The desired mute state is retained if XAudio2
has no output device at launch and applied when a mastering voice can be
created later. The player opens XAudio2 lazily on the first cue, so a transient
startup device outage is not treated as a failed launch; a failed cue is still
reported as a failed audio_event. The audio-device matrix remains open.
Windowed PC saves now use %LOCALAPPDATA%/TechConnector/TCPlayer/saves/<scene-key>
instead of writing into installed Content. F5 saves and F6 loads the active
slot; authored save_game and load_game UI actions use the same path.
--save-dir <path> isolates a run or lets a distributor choose a stable
location. New packages derive the key from the source scene's persistent ID,
so moving an installation does not change it. On F6, a missing new-format save
can be migrated from the previous path-keyed directory or legacy installed
Content; existing legacy files are preserved. Older manifests without a
scene ID retain path-keyed behavior. Headless --verify-save-roundtrip still
writes its explicit fixture path.
See Microsoft's GDK/GDKX overview
and Sony's PlayStation partner onboarding
for the platform access paths.
Reasoning Runtime API
API version 2 exposes the same shared reasoning runtime used by Tech Connector's request engine:
events = []
result = api.reasoning.run(
"Find the rig export implementation and explain its dependencies",
context={
"active_tab": "Editor",
"current_file_path": "C:/project/tools/exporter.py",
"open_file_paths": ["C:/project/tools/exporter.py"],
"selection_text": "def export_fbx(...): ...",
"thread": [
{"role": "user", "content": "We are improving the rig exporter."},
{"role": "assistant", "content": "The Maya export path is the current focus."},
],
},
progress_callback=events.append,
)
print(result.result["response"]["action"])
print(result.result["runtime"]["model_route"])
The thread or messages collection is canonical request context. It is
independent of any UI render limit and is sanitized before entering the runtime.
Credential-like keys such as API keys, passwords, cookies, and tokens are
removed from context automatically.
Runtime discovery and preparation are available separately:
features = api.reasoning.capabilities()
snapshot = api.reasoning.snapshot("Inspect the current project")
prepared = api.reasoning.prepare(
"Explain this function",
context={"current_file_path": "C:/project/tool.py"},
)
tools = api.reasoning.tools()
api.runtime is an alias for api.reasoning. Module-level helpers are also
available:
from tech_connector.api import (
prepare_reasoning_request,
reason,
reasoning_capabilities,
reasoning_snapshot,
)
result = reason("Find function create_rig_mapping()", settings=settings)
Registered runtime tools preserve their mutability and risk contracts. Read-only tools may execute directly. Mutating tools require explicit approval:
preview = api.reasoning.execute_tool(
"dcc.execute",
{"host": "maya", "operation": "create_locator"},
dry_run=True,
)
executed = api.reasoning.execute_tool(
"dcc.execute",
{"host": "maya", "operation": "create_locator"},
approved=True,
)
Every reasoning response is an APIResult. Its result includes the stable
schema, serialized response, integer progress events, activity events, and the
reasoning-runtime snapshot. No Qt objects or UI modules are required.
Modular Feature Registry
Capabilities are registered at feature and runtime-adapter granularity rather than maintained as one hardcoded list:
manifest = api.features.manifest()
context_features = api.features.list(category="runtime.context")
index_features = api.features.list(category="runtime.index")
tech_context = api.features.invoke(
"runtime.context.tech_connector_context",
"active_context",
)
Each descriptor includes:
feature_idcategoryversiondescriptionoperationsdependenciespermissionsavailablesource- per-operation schemas and metadata
Installed reasoning-runtime adapters are discovered from the actual kernel. Context, reasoning, capability, validation, code-policy, and rule adapters register their directly invokable operations. Code-understanding, knowledge, index, symbol-lookup, and escalation adapters are exposed as independently discoverable modules and identify the higher-level runtime operation that owns their typed execution.
External packages can register features without modifying Tech Connector:
from tech_connector.services.api_feature_registry_service import APIFeatureDescriptor
api.features.register(
APIFeatureDescriptor(
feature_id="studio.asset_review",
category="studio",
version="1.0",
description="Review an asset against studio rules.",
operations=("review",),
source="studio_tools.asset_review",
),
{"review": review_asset},
)
Only operations declared by the descriptor can be invoked. Registration rejects undeclared handlers and duplicate feature IDs unless replacement is explicitly requested.
Running Prompt Chains
Prompt chains let callers run an entire multi-step process from natural language without manually stitching action graphs:
chain = api.execute_prompt_chain(
[
"In Maya, select the top two rig roots and export the hierarchy to FBX",
"In Unreal, import that FBX into /Game/Characters",
"Find the imported asset and report the package path",
],
approved=True,
)
for step in chain.result["steps"]:
print(step["understanding"], step["execution"]["status"])
For preview/review flows, plan the chain without running it:
planned = api.plan_prompt_chain(
"Find the rig export function then build the Maya export action graph"
)
Each chain step includes the original prompt, what Tech Connector understood,
the generated action graph, execution status, and errors/results. Set
dry_run=True to validate the full chain without executing mutating actions.
Prompt To Action Order
The UI and headless API use the same official sequence. Use these calls when experimenting outside the desktop app:
# 1. Create/load the same licensed API boundary the UI uses.
api = TechConnectorHeadlessAPI(
project_root="C:/project",
)
# 2. Preview what the prompt means.
graph = api.plan_prompt(
"Find function create_rig_mapping()",
project_roots=["C:/depot/tools/maya_tools/Rigging"],
)
# 3. Preflight the graph without mutating files or DCC state.
dry_run = api.execute_action_graph(graph, dry_run=True)
# 4. Execute only after the caller/user approves mutating work.
report = api.execute_action_graph(graph, approved=True)
For multi-step processes, the equivalent UI flow is:
# 1. Plan every prompt step and inspect understanding/graphs.
planned = api.plan_prompt_chain(
[
"Find function create_rig_mapping()",
"Find function create_rig_from_mapping()",
],
project_roots=["C:/depot/tools/maya_tools/Rigging"],
)
chain_prompts = [step["prompt"] for step in planned["steps"]]
# 2. Preflight the entire chain.
preview = api.execute_prompt_chain(
chain_prompts,
dry_run=True,
project_roots=["C:/depot/tools/maya_tools/Rigging"],
)
# 3. Run the same chain after approval.
result = api.execute_prompt_chain(
chain_prompts,
approved=True,
project_roots=["C:/depot/tools/maya_tools/Rigging"],
)
project_roots is optional. By default Tech Connector uses the primary project,
all secondary folders configured with + Add Folder, and the installed tools
root. The tools root is permanent so built-in APIs remain discoverable even when
the user's project lives on another drive. Passing project_roots explicitly
narrows one request to the tagged file/package/workspace scope.
Calling Functions
Plain Python function access should go through this API boundary:
result = api.call_function(
"my_tools.exporters.export_fbx",
kwargs={"selection": ["root"], "path": "C:/tmp/out.fbx"},
extra_roots=["C:/project"],
stamp_project_provenance=True,
)
if result.ok:
print(result.result["value"])
else:
print(result.error)
Calling DCC Functions
DCC-specific functions should be executed inside their host application instead of imported in normal Python. Use the official host namespaces for common operations:
result = api.dcc.maya.create_rig_from_mapping(
body_joint_map=body_joint_map,
face_joint_map=face_joint_map,
)
print(result.result["output"])
Official aliases mean callers do not need to remember package paths for common operations:
rig = api.dcc.maya.create_rig(body_joint_map=body_map, face_joint_map=face_map)
mapping = api.dcc.maya.create_rig_mapping(root_joint="origin")
asset = api.dcc.unreal.find_assets("BP_Player", expected_class="Blueprint")
Every discovered public DCC function is documented in API_FUNCTION_CATALOG.md with its friendly call form, resolved target function, signature, args/defaults, docstring summary, and source location. Catalog entries also include related functions, known prerequisites/consumers, and likely same-module helpers when that relationship can be inferred from source or workflow rules.
The same aliases are also available under the callable call_dcc_function
namespace:
asset = api.call_dcc_function.unreal.find_assets(
"BP_Player",
expected_class="Blueprint",
)
You can inspect the current alias map:
aliases = api.dcc.aliases()
print(aliases["maya"]["create_rig"])
You can inspect the generated catalog in code:
catalog = api.dcc.catalog()
maya_functions = catalog["hosts"]["maya"]
For custom or newly discovered functions, use the host namespace escape hatch:
result = api.dcc.maya.call(
"custom_tools.rig.cleanup",
kwargs={"delete_unused": True},
)
The lower-level form is still available when the full package path is known:
result = api.call_dcc_function(
"unreal_tools.assets.find_asset_path_by_name",
"BP_Player",
host="unreal",
kwargs={"expected_class": "Blueprint"},
)
The API verifies the current entitlement before execution. Personal,
commercial, and enterprise license tokens include official_api_access.
Offline community/source-view mode does not unlock programmable API access.
Argument Reference
TechConnectorHeadlessAPI(...)
settings: Optional non-secret settings dictionary. If omitted, Tech Connector loads saved settings and the OS-protected entitlement cache.project_root: Optional project directory used for prompt planning, provenance markers, and Python import roots.licensing_context: Optional licensing adapter override for embedded hosts and tests. Production clients verify cached entitlements using the public keys inconfig/licensing.json; no shared verification secret belongs in a client.commercial_use: Declares whether the current operation is commercial so Community project-registration and accepted-terms rules can be evaluated.app_major_version: Optional host-version override for embedded tests. Normal clients use the current Tech Connector major version automatically.require_entitlement: Retained for source-development compatibility. Official execution remains entitled unless an explicit non-frozen contributor bypass is enabled; status and diagnostics remain available while locked.command_router: Optional router override, mainly for tests or embedded services. Normal callers can omit it.
api.call_function(entry_point, *args, kwargs=None, extra_roots=None, stamp_project_provenance=False)
entry_point: Full Python callable path, such as"my_tools.exporters.export_fbx"or"my_tools.exporters:export_fbx".*args: Positional arguments passed to the callable.kwargs: Keyword arguments passed to the callable.extra_roots: Extra directories added tosys.pathbefore importing the callable.stamp_project_provenance: WhenTrue, writes a transparent.tech_connector/provenance.jsonrecord inproject_root.
Use this for normal Python functions that can import and run in the current Python process.
api.dcc.<host>.<alias>(*args, **kwargs)
host: One of the official host namespaces, such asmaya,unreal,blender,motionbuilder,substance_painter,houdini, orunity.alias: Friendly official API name, such ascreate_rig,create_rig_mapping, orfind_assets.*args: Positional arguments passed through the host bridge to the resolved DCC function.**kwargs: Keyword arguments passed through the host bridge to the resolved DCC function.
Use this for the cleanest official API calls. The alias resolves to a canonical package function and still executes through the same DCC bridge stack.
api.dcc.<host>.call(name, *args, kwargs=None, stamp_project_provenance=True)
name: Either an official alias or a full function path. Full paths are used directly, for example"custom_tools.rig.cleanup".*args: Positional arguments for the DCC function.kwargs: Keyword arguments for the DCC function.stamp_project_provenance: Writes a provenance marker by default.
Use this when a function has no friendly alias yet.
api.call_dcc_function(entry_point, *args, host="", kwargs=None, stamp_project_provenance=True)
entry_point: Full DCC function path, such as"maya_tools.Rigging.create_rig.create_rig_from_mapping".*args: Positional arguments passed through the DCC bridge.host: Optional explicit host. If omitted, Tech Connector tries to infer the host from known package domains.kwargs: Keyword arguments passed through the DCC bridge.stamp_project_provenance: Writes a provenance marker by default.
Use this lower-level form when you already know the package path.
api.plan_prompt(prompt, project_roots=None)
prompt: Natural-language request to turn into a deterministic action graph.project_roots: Optional list of directories to search for functions, workflows, and dependencies. Defaults to the API project root and Tech Connector tools root.
Returns an action graph dictionary.
api.plan_prompt_chain(prompts, project_roots=None)
prompts: Either a list/tuple of prompt steps or a simple text chain split by lines, arrows, or the wordthen.project_roots: Optional list of directories to search for functions, workflows, and dependencies.
Returns a prompt-chain dictionary where each step includes the prompt, understanding, intent, confidence, and generated action graph.
api.execute_prompt_chain(prompts, approved=False, dry_run=False, stop_on_error=True, policy=None, project_roots=None)
prompts: Prompt steps to plan and execute in order.approved: SetTrueonly when the caller has approval to run mutating actions.dry_run: SetTrueto preflight every planned step without executing.stop_on_error: WhenTrue, later steps are skipped after the first failed execution report.policy: Optional execution policy overrides applied to each step.project_roots: Optional planning/search roots.
Returns APIResult with per-step prompt understanding, action graph, execution
report, and stop reason when the chain fails.
api.execute_action_graph(graph, approved=False, dry_run=False, policy=None)
graph: Action graph returned byplan_promptor created by another official planner.approved: SetTrueonly when the caller has approval to run mutating actions.dry_run: SetTrueto validate/preflight without executing actions.policy: Optional execution policy overrides. Tech Connector automatically addsofficial_api,license_tier, and prompt/project metadata.
Returns an execution report dictionary.
api.generate_pipeline_from_prompt(prompt, name="headless_pipeline", stamp_provenance=True)
prompt: Request to resolve into a pipeline graph and generated Python.name: Function name base for generated pipeline code.stamp_provenance: WhenTrue, inserts a Tech Connector provenance header in generated code.
Returns APIResult with result["code"], result["graph"], and
result["workflow_plan"] when successful.
api.integrations.status(account_id="")
account_id: Optional connected-account ID such asslack,discord,atlassian,github, orperforce. Empty returns every account.
Returns a sanitized APIResult; configured secrets are masked.
api.integrations.suggest(query="", active_hosts=(), limit=20)
query: Text after the chat@, for exampleSlack.pipe,Maya.scene, orJira.ART.b.active_hosts: Optional live DCC host identifiers used to prioritize roots.limit: Maximum suggestions, clamped to 1–100.
api.integrations.resolve(text)
Returns deterministic context for smart references, including connection readiness and unresolved-target warnings.
api.integrations.targets(provider, refresh=False)
provider:slackordiscord.refresh: WhenFalse, returns cached channels/users. WhenTrue, performs live provider discovery and updates only this API instance's in-memory cache.
api.integrations.oauth_url(provider, client_id="", redirect_uri="")
Returns the provider's official setup or OAuth authorization URL. Supported providers are Slack, Discord, Atlassian/Jira/Confluence, and ClickUp.
api.integrations.dispatch(text, default_title="Tech Connector Output", approved=False, dry_run=False)
text: Inline integration command containing one or more supported@references.default_title: Title applied to generated messages, issues, or pages.approved: Required for external writes.dry_run: Parses and returns references without contacting an external service.
Explicit Slack and Discord targets fail rather than using an unrelated default webhook.
api.surface()
Returns the complete supported operation inventory, per-namespace counts, signatures, documentation, and links to dynamic discovery surfaces.
APIResult
ok:Truewhen the call succeeded.result: Call-specific return payload.error: Error text whenokisFalse.entitlement: Verified license/tier metadata used for the call.provenance: Transparent usage marker generated for the call.
Provenance
API calls can stamp transparent project provenance in:
.tech_connector/provenance.json
The provenance record includes license tier, hashed account/license identifiers, operation name, no-resale flags, no-AI-training flags, and official-API-required flags. It does not include raw emails, secrets, or private tokens.
Policy
This is the authorized path for programmatic function calls. Copying, extracting, wrapping, reimplementing, training on, or building competing systems from Tech Connector source, docs, prompts, traces, signatures, or call plans is not permitted by the license.