9e8f1bbeed
Dashboard / frontend (push) Failing after 0s
Dashboard / api (push) Failing after 0s
Lint PowerShell / powershell-lint (ubuntu-latest) (push) Failing after 1s
Python Lint / Lint Python with Ruff (push) Failing after 1s
ShellCheck / Lint shell scripts (push) Failing after 1s
Matrix Smoke / linux-smoke (push) Failing after 1s
Matrix Smoke / distro: cachyos (push) Failing after 15s
Matrix Smoke / distro: linux-mint-21.3 (push) Failing after 15s
Matrix Smoke / distro: debian-12 (push) Failing after 5m21s
Matrix Smoke / distro: fedora-41 (push) Failing after 4m56s
Matrix Smoke / distro: ubuntu-24.04 (push) Failing after 2m13s
Matrix Smoke / distro: rocky-9 (push) Failing after 10m39s
Matrix Smoke / distro: manjaro (push) Failing after 12m11s
Matrix Smoke / distro: opensuse-tw (push) Failing after 11m53s
Matrix Smoke / distro: archlinux (push) Failing after 20m3s
Matrix Smoke / distro: ubuntu-22.04 (push) Failing after 13m49s
Validate .env Schema / tier-1-env-validation (push) Successful in 52s
Validate .env Schema / tier-2-env-validation (push) Successful in 44s
Validate .env Schema / tier-3-env-validation (push) Successful in 52s
Validate .env Schema / tier-4-env-validation (push) Successful in 51s
Validate Extensions Catalog / Check catalog is up-to-date (push) Failing after 9m47s
Secret Scan / Scan for secrets (push) Failing after 21m4s
Validate Docker Compose / Validate Docker Compose files (push) Has been cancelled
Python Type Check / Type check with mypy (push) Has been cancelled
Validate .env Schema / tier-0-env-validation (push) Has been cancelled
Test Linux / integration-smoke (push) Has been cancelled
Lint PowerShell / powershell-lint (windows-latest) (push) Has been cancelled
Matrix Smoke / macos-smoke (push) Has been cancelled
78 lines
1.8 KiB
Python
78 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Shared helper for Anthropic API authentication.
|
|
|
|
Provides a unified `create_message()` function using the Anthropic Python SDK.
|
|
Used by scanner scripts: generate-type-hints.py, generate-docstrings.py
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from dataclasses import dataclass, field
|
|
from typing import Any
|
|
|
|
|
|
@dataclass
|
|
class Usage:
|
|
input_tokens: int
|
|
output_tokens: int
|
|
|
|
|
|
@dataclass
|
|
class ContentBlock:
|
|
type: str
|
|
text: str = ""
|
|
|
|
|
|
@dataclass
|
|
class MessageResponse:
|
|
"""Minimal response object matching anthropic.Message interface used by scanner scripts."""
|
|
|
|
content: list[ContentBlock] = field(default_factory=list)
|
|
usage: Usage = field(default_factory=lambda: Usage(0, 0))
|
|
|
|
|
|
def create_message(
|
|
*,
|
|
model: str,
|
|
max_tokens: int,
|
|
temperature: float,
|
|
messages: list[dict[str, Any]],
|
|
thinking: dict[str, Any] | None = None,
|
|
) -> MessageResponse:
|
|
"""Create a message using the Anthropic API."""
|
|
import anthropic
|
|
|
|
api_key = os.getenv("ANTHROPIC_API_KEY")
|
|
if not api_key:
|
|
print(
|
|
"::error::No API credentials. Set ANTHROPIC_API_KEY",
|
|
file=sys.stderr,
|
|
)
|
|
sys.exit(1)
|
|
|
|
client = anthropic.Anthropic(api_key=api_key)
|
|
|
|
kwargs: dict[str, Any] = dict(model=model, max_tokens=max_tokens, messages=messages)
|
|
if thinking:
|
|
kwargs["thinking"] = thinking
|
|
kwargs["temperature"] = 1
|
|
else:
|
|
kwargs["temperature"] = temperature
|
|
|
|
response = client.messages.create(**kwargs)
|
|
|
|
content_blocks = [
|
|
ContentBlock(type="text", text=block.text)
|
|
for block in response.content
|
|
if block.type == "text"
|
|
]
|
|
|
|
return MessageResponse(
|
|
content=content_blocks,
|
|
usage=Usage(
|
|
input_tokens=response.usage.input_tokens,
|
|
output_tokens=response.usage.output_tokens,
|
|
),
|
|
)
|