How to Configure AI Model Parameters and Manage Costs in Calliope
Yes, Calliope provides a hierarchical configuration system using InferenceModel for global presets and ModelConfig for deployment-specific overrides, while KeysModel enables per-client API credential isolation for granular cost tracking.
Calliope is an open-source inference framework designed for multi-tenant AI deployments. Whether you are running inference for a single application or managing thousands of edge devices, you can configure AI model parameters and manage costs in Calliope through its layered architecture of model registries, configuration tables, and credential scoping.
Understanding Calliope's Configuration Architecture
Global Model Presets in InferenceModel
The foundation of parameter management resides in calliope/tables/model_config.py. The InferenceModel table stores provider details, model identifiers, and default model_parameters as a JSON column. These records act as the canonical reference for available AI services.
Deployment-Specific Overrides with ModelConfig
To customize behavior without modifying global presets, Calliope uses the ModelConfig table defined in the same file. This table contains a foreign key to InferenceModel and its own model_parameters JSON field. By attaching a ModelConfig to a Sparrow, Flock, or StrategyConfig, you achieve per-client parameter overrides.
How to Configure AI Model Parameters
Configuring parameters involves defining presets and linking them to deployments.
First, create a custom inference model preset in calliope/models/inference_model_config.py. The InferenceModelConfigModel Pydantic class defines the schema, while the _model_configs_by_name registry stores available configurations:
from calliope.models.inference_model_config import (
InferenceModelProvider,
InferenceModelProviderVariant,
InferenceModelConfigModel,
_model_configs_by_name,
)
# Register a cost-optimized GPT-4 configuration
_model_configs_by_name["gpt-4-efficient"] = InferenceModelConfigModel(
provider=InferenceModelProvider.OPENAI,
provider_variant=InferenceModelProviderVariant.OPENAI_CHAT_COMPLETION,
provider_model_name="gpt-4",
parameters={
"max_tokens": 256, # limit token usage → lower cost
"temperature": 0.7, # more deterministic output
"presence_penalty": 0.5,
"frequency_penalty": 0.5,
},
)
Next, create a ModelConfig record to apply these parameters to a specific deployment. Using the Piccolo ORM as defined in calliope/tables/model_config.py:
from calliope.tables import ModelConfig, InferenceModel
async def create_deployment_config():
# Reference the preset
model = await InferenceModel.objects().where(
InferenceModel.slug == "openai-gpt-4"
).first()
# Create deployment-specific overrides
config = await ModelConfig(
slug="deployment-42-config",
model=model,
model_parameters={"max_tokens": 128, "temperature": 0.5}, # further limit per-client
).save()
return config
Managing API Costs and Credential Isolation
Per-Sparrow and Per-Flock API Keys
Cost management in Calliope relies on the KeysModel class defined in calliope/models/keys.py. This Pydantic model stores provider credentials and attaches to individual Sparrows or Flocks via the keys JSON column in their respective state tables.
To isolate billing for a specific client:
from calliope.models.keys import KeysModel
from calliope.tables import SparrowState
async def assign_client_keys(sparrow_id: str, api_key: str):
keys = KeysModel(openai_api_key=api_key) # <-- keep secret in env / UI
await SparrowState.objects().where(
SparrowState.sparrow_id == sparrow_id
).update(keys=keys.model_dump())
Usage Attribution and Cost Tracking
Because each inference call in calliope/inference/text_to_text.py receives a KeysModel instance, the underlying engine uses the specific API key associated with that sparrow. This design enables precise usage attribution to individual clients or device groups, supporting cost dashboards and quota enforcement without code modifications.
Runtime Parameter Resolution
When a request arrives at the /v1/frames/ endpoint, the handler in calliope/tasks/handlers.py orchestrates the configuration merge:
- Load the
ModelConfigassociated with the target Sparrow or Flock - Merge the base
InferenceModelparameters with theModelConfigoverrides - Apply any runtime request parameters
- Execute inference using the scoped
KeysModelcredentials
This hierarchy ensures that global defaults, deployment overrides, and per-request tweaks coexist predictably.
Summary
- Configure AI model parameters using
InferenceModelfor global presets andModelConfigfor deployment-specific overrides stored incalliope/tables/model_config.py. - Manage costs by isolating API credentials per Sparrow or Flock using
KeysModelincalliope/models/keys.py, enabling precise usage attribution. - Override parameters at runtime by attaching
ModelConfigrecords to individual Sparrows, Flocks, or StrategyConfigs, with resolution handled incalliope/tasks/handlers.py. - Define custom presets by registering
InferenceModelConfigModelinstances incalliope/models/inference_model_config.pyfor reusable, cost-optimized configurations.
Frequently Asked Questions
Can I set different model parameters for different clients using Calliope?
Yes. By creating separate ModelConfig records in calliope/tables/model_config.py and attaching them to different Sparrows or Flocks, you can assign unique temperature, max_tokens, and other parameters to individual clients or device groups. The handler in calliope/tasks/handlers.py automatically resolves the correct configuration at runtime.
How does Calliope track API usage costs per deployment?
Calliope uses the KeysModel class defined in calliope/models/keys.py to store provider API keys. Each Sparrow or Flock maintains its own keys JSON column, ensuring that every inference call uses a specific credential set. This allows you to attribute usage to specific clients via your provider's dashboard and implement per-client quotas.
What is the difference between InferenceModel and ModelConfig in Calliope?
InferenceModel acts as the global registry of available AI providers and their default parameters, stored in the database schema defined in calliope/tables/model_config.py. ModelConfig provides a layer of overrides that can be attached to specific deployments (Sparrows, Flocks, or strategies), allowing you to customize behavior without modifying the global preset.
Can I override model parameters at request time in Calliope?
While the primary mechanism uses persisted ModelConfig records, the architecture in calliope/tasks/handlers.py supports merging runtime parameters with stored configurations. You can extend the request handler to accept query parameters or body fields that override the stored model_parameters JSON before the inference call executes, though this requires custom implementation beyond the default data-driven configuration.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →