Dhenara AI is an open source Python package for calling multiple LLM providers through one typed interface. It keeps the integration surface small: provider credentials, model selection, prompt/message formatting, streaming, tool use, and structured output all flow through the same core client types.
For full documentation, visit docs.dhenara.com.
pip install dhenara-aiDhenara AI discovers credentials in one of two ways:
- Pass an explicit file path to
ResourceConfig.load_from_file(). - Set
DAI_SECRET_CONFIG_DIRand placedai_credentials.yamlinside that directory.
If DAI_SECRET_CONFIG_DIR is unset, the default location is /run/secrets/dai/dai_credentials.yaml.
Use the checked-in template at src/dhenara/ai/types/resource/credentials.yaml as the starting point.
mkdir -p /path/to/secrets
export DAI_SECRET_CONFIG_DIR=/path/to/secrets
cp src/dhenara/ai/types/resource/credentials.yaml "$DAI_SECRET_CONFIG_DIR/dai_credentials.yaml"Then edit dai_credentials.yaml and keep only the providers you actually use.
from dhenara.ai import AIModelClient
from dhenara.ai.types import AIModelAPIProviderEnum, AIModelCallConfig, ResourceConfig
resource_config = ResourceConfig()
resource_config.load_from_file(credentials_file=None, init_endpoints=True)
endpoint = resource_config.get_model_endpoint(
model_name="claude-haiku-4-5",
api_provider=AIModelAPIProviderEnum.ANTHROPIC,
)
if endpoint is None:
raise RuntimeError("No Anthropic endpoint configured for claude-haiku-4-5")
client = AIModelClient(
model_endpoint=endpoint,
config=AIModelCallConfig(
max_output_tokens=1024,
reasoning=False,
streaming=False,
),
is_async=False,
)
response = client.generate(
prompt="Explain quantum computing in simple terms.",
instructions=["Keep the answer under 120 words."],
)
if response.chat_response:
print(response.chat_response.text())The example programs use the same credential-loading contract. With a secret directory configured, you can run them directly:
export DAI_SECRET_CONFIG_DIR=/path/to/secrets
python examples/14_multi_turn_with_messages_api.pyIf you prefer an explicit credentials file, pass that path where the example calls load_from_file().
- OpenAI direct and Azure OpenAI / Microsoft Foundry OpenAI v1 use the
openaiSDK. - Google Gemini Developer API and Gemini on Vertex AI use the
google-genaiSDK. - Anthropic direct, Amazon Bedrock, and Anthropic on Vertex use the
anthropicSDK. - Amazon Bedrock configuration stays under the
amazon_bedrockprovider block. The package passes those credentials intoAnthropicBedrock; there is no separate boto client setup in your application code. microsoft_azure_aiis not a supported text-generation surface indhenara-ai; usemicrosoft_openaiwith an Azure OpenAI or Microsoft Foundry OpenAI v1 endpoint instead.- For Microsoft-hosted OpenAI-compatible deployments, the
modelvalue in requests must be the Azure deployment name, not just the underlying vendor model family.