Profile & Workspace

Two distinct concepts:

  • Profile (profile.yaml) — what to load: tools, cache settings, LLM config.

  • Workspace (.tooluniverse/) — where config and API keys live on disk.

Quick Start

mkdir .tooluniverse
echo "OPENAI_API_KEY=sk-..." > .tooluniverse/.env

cat > .tooluniverse/profile.yaml << 'EOF'
name: my-profile
tools:
  categories: [literature, drug]
EOF

tooluniverse   # profile.yaml loads automatically

Load a profile on the fly:

tooluniverse --load ./life-science.yaml

profile.yaml Reference

name: my-profile         # required
version: "1.0"           # optional
description: "..."

tools:
  categories: [literature, drug, gwas]
  include_tools: [UniProt_search]
  exclude_tools: [slow_tool]

cache:
  enabled: true
  memory_size: 256
  persist: true
  ttl: 3600

llm_config:
  default_provider: CHATGPT
  models:
    default: gpt-4o

hooks:
  - type: SummarizationHook
    enabled: true

sources:
  - hf:community/genomics-tools
  - ./my-local-tools/

extends: hf:community/base-bio-tools

log_level: WARNING
required_env:
  - OPENAI_API_KEY

Note

Put API key values in .tooluniverse/.env, not in profile.yaml.

Workspace

.tooluniverse/
├── .env          ← API keys (add to .gitignore)
├── profile.yaml  ← auto-loaded on startup
└── tools/        ← custom tool configs
tooluniverse                          # local:  ./.tooluniverse/
tooluniverse --global                 # global: ~/.tooluniverse/
tooluniverse --workspace /path/to/ws  # explicit path

Priority: --workspaceTOOLUNIVERSE_HOME--global./.tooluniverse/

Python API:

from tooluniverse import ToolUniverse

tu = ToolUniverse()                              # local workspace
tu = ToolUniverse(use_global=True)               # global workspace
tu = ToolUniverse(workspace="/path/to/ws")       # explicit path
tu = ToolUniverse(profile="./life-science.yaml") # load profile

Merging

When --load is used, your workspace profile.yaml is the base and the loaded file overrides only what it specifies.