Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
5f1083a
feat: replace litellm with lean giskard-llm routing layer
Hartorn Apr 17, 2026
12039b5
ci: consolidate giskard-llm matrix, add bare and gemini coverage
Hartorn Apr 17, 2026
1e0cd6b
Merge branch 'main' into feat/giskard-llm
kevinmessiaen Apr 17, 2026
1b4ccef
fix(giskard-llm): shape Azure AI Foundry root URLs with /models path
Hartorn Apr 17, 2026
99d6d1d
Merge remote-tracking branch 'origin/main' into feat/giskard-llm
kevinmessiaen Apr 20, 2026
a50f893
refactor(giskard-llm): enhance type definitions and introduce Translator
kevinmessiaen Apr 21, 2026
b08291b
chore(deps): add OpenAI dependency to development group to allow linting
kevinmessiaen Apr 21, 2026
3d55cf5
refactor(giskard-llm): remove unused utility function
kevinmessiaen Apr 21, 2026
4854422
fix
kevinmessiaen Apr 21, 2026
bb26286
remove uneccessay raise that would silence api change
kevinmessiaen Apr 21, 2026
b258f66
refactor(tests): remove test for missing tool call ID since it's now …
kevinmessiaen Apr 22, 2026
69a1961
chore(llm): amigrate to translator for maintainability
kevinmessiaen Apr 22, 2026
66f062f
fic(gemini): restore dropped argument
kevinmessiaen Apr 22, 2026
ee8ce83
fix(giskard-llm): filter out None contents in GoogleChatTranslator
kevinmessiaen Apr 22, 2026
d3d3f1d
fix(openai_response): handle non-string arguments in ResponseOutputFu…
kevinmessiaen Apr 22, 2026
300833e
fix(workflow): handle non-string arguments in tool function calls
kevinmessiaen Apr 22, 2026
90a9393
feat(giskard-llm): Handle EasyInputMessage for text input
kevinmessiaen Apr 23, 2026
329479e
feat(giskard-llm): update Google Chat translator type hints and add v…
kevinmessiaen Apr 23, 2026
6ad06bb
feat(giskard-llm): unify handling of system and developer roles acros…
kevinmessiaen Apr 23, 2026
9b18ac1
feat(giskard-llm): enhance AnthropicProvider to support developer rol…
kevinmessiaen Apr 23, 2026
d3b2976
feat(giskard-llm): introduce argument serialization and deserializati…
kevinmessiaen Apr 23, 2026
5fa3923
refactor(giskard-llm): streamline imports and update strict parameter…
kevinmessiaen Apr 23, 2026
f836612
feat(giskard-llm): enhance GoogleResponseTranslator to handle system …
kevinmessiaen Apr 23, 2026
ce6b76e
feat(giskard-llm): add validation tests for OpenAI and Google respons…
kevinmessiaen Apr 23, 2026
348a094
feat(giskard-llm): add tests for tool call interactions in OpenAI and…
kevinmessiaen Apr 23, 2026
bbd59e3
fix(giskard-llm): update import path for compact utility in Azure Ope…
kevinmessiaen Apr 23, 2026
427a2c1
fix(giskard-llm): refine role filtering in GoogleResponseTranslator
kevinmessiaen Apr 23, 2026
1336839
feat(giskard-llm): add tests for chat completion mapping
kevinmessiaen Apr 23, 2026
82f9a86
feat(giskard-llm): add tests for Google and OpenAI response return ma…
kevinmessiaen Apr 23, 2026
d450a91
feat(llm): handle refusal for chat api
kevinmessiaen Apr 23, 2026
d760fbc
feat(giskard-llm): enhance response output handling with new message …
kevinmessiaen Apr 23, 2026
8d45f7f
refactor(giskard-llm): rename message types for clarity and consistency
kevinmessiaen Apr 23, 2026
357b64f
refactor(giskard-llm): update input types and enhance response structure
kevinmessiaen Apr 23, 2026
7b89d8e
fix(giskard-llm): handle None values in tool_calls iteration
kevinmessiaen Apr 23, 2026
de3e994
refactor(giskard-llm): remove unnecessary id field from response types
kevinmessiaen Apr 23, 2026
d05a701
refactor(giskard-llm): replace ChoiceMessage with AssistantMessage an…
kevinmessiaen Apr 23, 2026
a079b9f
refactor(giskard-llm): unify message type handling across providers a…
kevinmessiaen Apr 23, 2026
0c2a301
refactor(giskard-llm): streamline message handling and type definitions
kevinmessiaen Apr 24, 2026
b890934
fix(giskard-llm): correct structure of message parts in GoogleChatTra…
kevinmessiaen Apr 24, 2026
0c445d4
refactor(giskard-llm): enhance type definitions for argument handling
kevinmessiaen Apr 24, 2026
499b788
fix(giskard-llm): update error message for non-system message require…
kevinmessiaen Apr 24, 2026
1738b8f
fix(giskard-llm): update AssistantMessage transcript handling
kevinmessiaen Apr 24, 2026
1a5f3c9
fix(giskard-llm): correct default value for FunctionMessage content
kevinmessiaen Apr 24, 2026
2594f07
fix(giskard-llm): update output type documentation and enhance Functi…
kevinmessiaen Apr 24, 2026
02b92e7
fix(giskard-llm): address code review findings
kevinmessiaen Apr 24, 2026
94d1ed1
fix(giskard-llm): address code review findings
kevinmessiaen Apr 24, 2026
7b7bf99
fix(dependencies): restrict numpy and giskard-llm versions
kevinmessiaen Apr 25, 2026
c67683a
fix(giskard-llm): update response handling and type definitions
kevinmessiaen Apr 25, 2026
f0babb3
fix(giskard-agents): update message handling and serialization in gen…
kevinmessiaen Apr 25, 2026
364953e
fix(giskard-llm): enhance error handling in API response processing
kevinmessiaen Apr 25, 2026
ac1f759
fix(giskard-agents): improve error handling and type definitions in w…
kevinmessiaen Apr 25, 2026
95ab011
Merge remote-tracking branch 'origin/main' into feat/giskard-llm
kevinmessiaen Apr 27, 2026
484db73
Merge branch 'feat/giskard-llm' into feat/giskard-llm-refactoring
kevinmessiaen Apr 27, 2026
d2e6aaf
fix(giskard-agents): update message serialization to align with OpenA…
kevinmessiaen Apr 27, 2026
40b4e1c
refactor(giskard-llm): streamline OpenAIChatTranslator and enhance se…
kevinmessiaen Apr 27, 2026
a83946b
refactor(giskard-llm): remove unused tool call methods in OpenAIChatT…
kevinmessiaen Apr 27, 2026
4da5762
refactor(giskard-llm): standardize usage token naming and streamline …
kevinmessiaen Apr 27, 2026
390189a
refactor(giskard-llm): enhance serialization and streamline translato…
kevinmessiaen Apr 27, 2026
999ea60
refactor(giskard-llm): update message serialization in LiteLLMGenerator
kevinmessiaen Apr 27, 2026
956956b
refactor(giskard-llm): improve output text concatenation in ResponseR…
kevinmessiaen Apr 27, 2026
26a4027
refactor(giskard-llm): enhance response_format validation in OpenAICh…
kevinmessiaen Apr 27, 2026
8364ff8
refactor(giskard-llm): enhance message handling and serialization acr…
kevinmessiaen Apr 28, 2026
e5027d4
refactor(giskard-llm): improve error handling and response structure …
kevinmessiaen Apr 28, 2026
1b562e0
refactor(giskard-llm): unify message text handling across chat and wo…
kevinmessiaen Apr 28, 2026
84afb74
refactor(giskard-llm): standardize model_dump usage in generators and…
kevinmessiaen Apr 28, 2026
ed1981c
refactor(giskard-llm): add serializer registration method to _BaseModel
kevinmessiaen Apr 28, 2026
a049f3e
refactor(giskard-llm): update serializer registration for chat and re…
kevinmessiaen Apr 28, 2026
81601d7
Merge pull request #2423 from Giskard-AI/feat/giskard-llm-refactoring
henchaves Apr 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
- any-glob-to-any-file:
- "libs/giskard-core/**"

"Scope: LLM":
- changed-files:
- any-glob-to-any-file:
- "libs/giskard-llm/**"

"Scope: Agents":
- changed-files:
- any-glob-to-any-file:
Expand Down
20 changes: 19 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
fail-fast: false
matrix:
python-version: ["3.12", "3.13", "3.14"]
package: [giskard-core, giskard-agents, giskard-checks]
package: [giskard-core, giskard-llm, giskard-agents, giskard-checks]
env:
PACKAGE: ${{ matrix.package }}
steps:
Expand All @@ -54,3 +54,21 @@ jobs:
python-version: ${{ matrix.python-version }}
- run: make install
- run: make test-unit PACKAGE=$PACKAGE

test-no-providers:
name: test-no-providers / giskard-llm
needs: lint
runs-on: ubuntu-latest
permissions:
contents: read # checkout repository
timeout-minutes: 10
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
enable-cache: true
python-version: "3.12"
- run: make install-no-providers
- run: make test-no-providers
136 changes: 123 additions & 13 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ name: Integration Tests
on:
pull_request_target: # zizmor: ignore[dangerous-triggers] guarded by authorize job, label gate for external PRs, and immutable head.sha checkout
types: [opened, synchronize, reopened, labeled]
workflow_dispatch:

permissions: {}

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
Expand All @@ -17,10 +18,23 @@ jobs:
steps:
- name: Check authorization
env:
GH_TOKEN: ${{ github.token }}
EVENT_NAME: ${{ github.event_name }}
ACTOR: ${{ github.actor }}
AUTHOR_ASSOC: ${{ github.event.pull_request.author_association }}
EVENT_ACTION: ${{ github.event.action }}
LABEL_NAME: ${{ github.event.label.name }}
run: |
# Manual dispatch: verify the actor belongs to the org
if [[ "$EVENT_NAME" == "workflow_dispatch" ]]; then
if gh api "orgs/Giskard-AI/members/$ACTOR" --silent 2>/dev/null; then
echo "Org member $ACTOR — authorized."
exit 0
fi
echo "::error::$ACTOR is not a member of the Giskard-AI organization."
exit 1
fi

# Internal contributors are always authorized
if [[ "$AUTHOR_ASSOC" =~ ^(MEMBER|COLLABORATOR|OWNER)$ ]]; then
echo "Internal contributor — authorized."
Expand All @@ -36,7 +50,7 @@ jobs:
echo "::error::External contributors require a maintainer to add the 'safe for build' label."
exit 1

test-functional:
test-agents-functional:
needs: authorize
runs-on: ubuntu-latest
permissions:
Expand All @@ -47,26 +61,122 @@ jobs:
fail-fast: false
matrix:
python-version: ["3.12", "3.13", "3.14"]
package: [giskard-core, giskard-agents, giskard-checks]
name: test-functional / ${{ matrix.package }} / ${{ matrix.python-version }}
env:
PACKAGE: ${{ matrix.package }}
backend:
# Each backend exercises a different install combination so we
# catch dependency regressions in the three supported layouts:
# giskard-llm only, litellm only, and both installed together.
# Using the top-level giskard-agents extras (not giskard-llm
# directly) so the pass-through extras declared in
# libs/giskard-agents/pyproject.toml are covered.
- name: giskard-llm
extras: "giskard-agents[google]"
pytest_mark: "functional and google"
- name: litellm
extras: "giskard-agents[litellm]"
pytest_mark: "functional and litellm"
- name: both
extras: "giskard-agents[google,litellm]"
pytest_mark: "functional and (google or litellm)"
name: agents / ${{ matrix.backend.name }} / ${{ matrix.python-version }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
# Use the SHA from the event to ensure we're using the correct commit
# for the `labeled` event. For external contributors, we want to use
# the SHA corresponding to the time the label was added.
ref: ${{ github.event.pull_request.head.sha }}
ref: ${{ github.event.pull_request.head.sha || github.ref }}
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
enable-cache: true
python-version: ${{ matrix.python-version }}
- run: make install
- name: Install backend extras
env:
BACKEND_EXTRAS: ${{ matrix.backend.extras }}
run: uv pip install "$BACKEND_EXTRAS"
- name: Run functional tests
env:
GOOGLE_API_KEY: ${{ secrets.GEMINI_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
TEST_MODEL: "gemini/gemini-2.0-flash"
TEST_EMBEDDING_MODEL: "gemini/gemini-embedding-001"
run: make test-functional PACKAGE=$PACKAGE
TEST_MODEL: "google/gemini-2.0-flash"
TEST_LITELLM_MODEL: "gemini/gemini-2.0-flash"
TEST_EMBEDDING_MODEL: "google/gemini-embedding-001"
PYTEST_MARK: ${{ matrix.backend.pytest_mark }}
run: uv run pytest libs/giskard-agents -m "$PYTEST_MARK"

test-llm-functional:
needs: authorize
runs-on: ubuntu-latest
environment: ci
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
# One cell per routing prefix we want to exercise end-to-end.
# `extras` is the giskard-llm optional-dependency group to install;
# aliases share an install (bare/azure_ai reuse openai/azure, gemini reuses google).
include:
- { python-version: "3.12", provider: openai, extras: openai }
- { python-version: "3.12", provider: bare, extras: openai }
- { python-version: "3.12", provider: google, extras: google }
- { python-version: "3.12", provider: gemini, extras: google }
- { python-version: "3.12", provider: anthropic, extras: anthropic }
- { python-version: "3.12", provider: azure, extras: azure }
- { python-version: "3.12", provider: azure_ai, extras: azure }
name: llm / ${{ matrix.provider }} / ${{ matrix.python-version }}
env:
PROVIDER: ${{ matrix.provider }}
EXTRAS: ${{ matrix.extras }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ github.event.pull_request.head.sha || github.ref }}
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
enable-cache: true
python-version: ${{ matrix.python-version }}
- run: make install
- name: Install provider SDK
run: uv pip install "giskard-llm[$EXTRAS]"
- name: Run functional tests
env:
OPENAI_API_KEY: ${{ (matrix.provider == 'openai' || matrix.provider == 'bare') && secrets.OPENAI_API_KEY || '' }}
GOOGLE_API_KEY: ${{ (matrix.provider == 'google' || matrix.provider == 'gemini') && secrets.GEMINI_API_KEY || '' }}
ANTHROPIC_API_KEY: ${{ matrix.provider == 'anthropic' && secrets.ANTHROPIC_API_KEY || '' }}
AZURE_API_KEY: ${{ matrix.provider == 'azure' && secrets.AZURE_API_KEY || '' }}
AZURE_API_BASE: ${{ matrix.provider == 'azure' && secrets.AZURE_API_BASE || '' }}
AZURE_API_VERSION: ${{ matrix.provider == 'azure' && secrets.AZURE_API_VERSION || '' }}
AZURE_AI_API_KEY: ${{ matrix.provider == 'azure_ai' && secrets.AZURE_AI_API_KEY || '' }}
AZURE_AI_ENDPOINT: ${{ matrix.provider == 'azure_ai' && secrets.AZURE_AI_ENDPOINT || '' }}
run: make test-functional PACKAGE=giskard-llm PROVIDER=$PROVIDER

test-checks-functional:
needs: authorize
runs-on: ubuntu-latest
environment: ci
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
python-version: ["3.12", "3.13", "3.14"]
provider: [google]
name: checks / ${{ matrix.provider }} / ${{ matrix.python-version }}
env:
PROVIDER: ${{ matrix.provider }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ github.event.pull_request.head.sha || github.ref }}
persist-credentials: false
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
enable-cache: true
python-version: ${{ matrix.python-version }}
- run: make install
- name: Install provider SDK
run: uv pip install "giskard-llm[$PROVIDER]"
- name: Run functional tests
env:
GOOGLE_API_KEY: ${{ matrix.provider == 'google' && secrets.GEMINI_API_KEY || '' }}
TEST_MODEL: "google/gemini-2.0-flash"
TEST_EMBEDDING_MODEL: "google/gemini-embedding-001"
run: make test-functional PACKAGE=giskard-checks PROVIDER=$PROVIDER
Loading
Loading