mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-10 22:41:41 +00:00
* feat(skills): semantic search over the LiteLLM-hosted skill registry Adds GET /v1/skills?query= (custom_llm_provider=litellm_proxy) and a skill_search MCP virtual tool, ranking the caller's accessible skills by semantic similarity, mirroring the A2A agent registry search (LIT-6309). Also fixes a pre-existing bug where create_skill() dropped description and instructions for the litellm_proxy provider, which left every LiteLLM-hosted skill with no searchable text. * fix(mcp): coerce skill_search top_k instead of raising 500 on malformed input The MCP-REST skill_search dispatch validated raw tool arguments through a pydantic model directly, so a non-numeric top_k raised a ValidationError that the endpoint's catch-all turned into an HTTP 500. Mirrors the agent_search branch's tolerant coerce_top_k handling instead. * fix(skills): enforce key limits on search embeddings and bound the semantic index Semantic search embeddings now run the same pre_call_hook the /embeddings route runs, so key rate limits, budgets and guardrails apply before the embedding model is called. The shared SemanticTextIndex caps cached vectors and evicts the least recently searched entries, and each skill's embedded text is capped so one skill cannot inflate the embedding batch Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(skills): surface proxy 429s from search embeddings instead of a 503 ProxyRateLimitError is also an OpenAIError, so the search engine was folding a key rate limit into skill_search_unavailable. Proxy HTTPExceptions now propagate so the caller gets the same 429 the /embeddings route returns Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(skills): import assert_never from typing_extensions for Python 3.10 Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(skills): embed the request as the pre-call hooks returned it, not the original text Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor(skills): keep the litellm_proxy provider check for GET /v1/skills?query= inside llms/ Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test(skills): move the GET /v1/skills?query= endpoint tests under tests/test_litellm/proxy Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
254 lines
9.3 KiB
YAML
254 lines
9.3 KiB
YAML
name: "Unit Tests"
|
|
|
|
on:
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
- litellm_internal_staging
|
|
- litellm_oss_staging
|
|
- "litellm_**"
|
|
push:
|
|
branches:
|
|
- main
|
|
- litellm_internal_staging
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
|
|
# One caller for every tests/test_litellm shard, replacing the nine thin workflow
|
|
# files that each wrapped a single call to _test-unit-base.yml. Adding a shard is
|
|
# now one matrix entry rather than a new file.
|
|
#
|
|
# `name` is the shard id and nothing else, so each check reports as
|
|
# "<shard> / Run tests" exactly as it did when the shard had its own file. Those
|
|
# strings are the branch ruleset's required contexts, so they are load-bearing:
|
|
# renaming an entry renames a required check and the ruleset stops matching it.
|
|
#
|
|
# Every entry states its timeouts even when they equal the base workflow's
|
|
# defaults. An absent matrix key renders as an empty string, which is not a
|
|
# number, so a partially-specified entry would fail the call rather than fall
|
|
# back to the default.
|
|
#
|
|
# tests/proxy_unit_tests keeps its own caller (test-unit-proxy-db.yml): it is
|
|
# already a matrix and carries a shard-coverage guard that reads that file by
|
|
# name. Folding it in here is a follow-up, together with generalising that guard
|
|
# into assert_ci_coverage.py.
|
|
jobs:
|
|
unit:
|
|
name: ${{ matrix.shard }}
|
|
permissions:
|
|
contents: read
|
|
id-token: write
|
|
pull-requests: write
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- shard: core-utils
|
|
artifact-name: core-utils
|
|
test-path: "tests/test_litellm/litellm_core_utils"
|
|
workers: 2
|
|
reruns: 1
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: enterprise-routing
|
|
artifact-name: enterprise-routing
|
|
test-path: >-
|
|
tests/test_litellm/enterprise
|
|
tests/test_litellm/google_genai
|
|
tests/test_litellm/router_utils
|
|
tests/test_litellm/router_strategy
|
|
workers: 2
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: integrations
|
|
artifact-name: integrations
|
|
test-path: "tests/test_litellm/integrations"
|
|
workers: 2
|
|
reruns: 3
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: Vertex AI
|
|
artifact-name: llm-vertex-ai
|
|
test-path: "tests/test_litellm/llms/vertex_ai"
|
|
workers: 1
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: All Other Providers
|
|
artifact-name: llm-other-providers
|
|
test-path: "tests/test_litellm/llms --ignore=tests/test_litellm/llms/vertex_ai"
|
|
workers: 2
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: misc
|
|
artifact-name: misc
|
|
test-path: >-
|
|
tests/test_litellm/batches
|
|
tests/test_litellm/secret_managers
|
|
tests/test_litellm/a2a_protocol
|
|
tests/test_litellm/anthropic_interface
|
|
tests/test_litellm/completion_extras
|
|
tests/test_litellm/compression
|
|
tests/test_litellm/containers
|
|
tests/test_litellm/endpoints
|
|
tests/test_litellm/experimental_mcp_client
|
|
tests/test_litellm/models
|
|
tests/test_litellm/repositories
|
|
tests/test_litellm/images
|
|
tests/test_litellm/interactions
|
|
tests/test_litellm/ocr
|
|
tests/test_litellm/passthrough
|
|
tests/test_litellm/rag
|
|
tests/test_litellm/realtime_api
|
|
tests/test_litellm/rerank_api
|
|
tests/test_litellm/rust_bridge
|
|
tests/test_litellm/sandbox
|
|
tests/test_litellm/skills
|
|
tests/test_litellm/test_router
|
|
tests/test_litellm/vector_stores
|
|
tests/test_litellm/videos
|
|
tests/test_litellm/test_*.py
|
|
workers: 2
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: proxy-auth
|
|
artifact-name: proxy-auth
|
|
test-path: >-
|
|
tests/test_litellm/proxy/auth
|
|
tests/test_litellm/proxy/hooks
|
|
tests/test_litellm/proxy/policy_engine
|
|
tests/test_litellm/proxy/client
|
|
workers: 2
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: proxy-endpoints
|
|
artifact-name: proxy-endpoints
|
|
test-path: >-
|
|
tests/test_litellm/proxy/analytics_endpoints
|
|
tests/test_litellm/proxy/management_endpoints
|
|
tests/test_litellm/proxy/list_api
|
|
tests/test_litellm/proxy/memory
|
|
tests/test_litellm/proxy/guardrails
|
|
tests/test_litellm/proxy/management_helpers
|
|
tests/test_litellm/proxy/anthropic_endpoints
|
|
tests/test_litellm/proxy/google_endpoints
|
|
tests/test_litellm/proxy/openai_files_endpoint
|
|
tests/test_litellm/proxy/batches_endpoints
|
|
tests/test_litellm/proxy/container_endpoints
|
|
tests/test_litellm/proxy/fine_tuning_endpoints
|
|
tests/test_litellm/proxy/vector_store_files_endpoints
|
|
tests/test_litellm/proxy/video_endpoints
|
|
tests/test_litellm/proxy/response_api_endpoints
|
|
tests/test_litellm/proxy/image_endpoints
|
|
tests/test_litellm/proxy/ocr_endpoints
|
|
tests/test_litellm/proxy/vector_store_endpoints
|
|
tests/test_litellm/proxy/agent_endpoints
|
|
tests/test_litellm/proxy/a2a
|
|
tests/test_litellm/proxy/credential_endpoints
|
|
tests/test_litellm/proxy/discovery_endpoints
|
|
tests/test_litellm/proxy/health_endpoints
|
|
tests/test_litellm/proxy/shutdown
|
|
tests/test_litellm/proxy/public_endpoints
|
|
tests/test_litellm/proxy/prompts
|
|
tests/test_litellm/proxy/rag_endpoints
|
|
tests/test_litellm/proxy/rerank_endpoints
|
|
tests/test_litellm/proxy/realtime_endpoints
|
|
tests/test_litellm/proxy/ui_crud_endpoints
|
|
tests/test_litellm/proxy/config_resolvers
|
|
tests/test_litellm/proxy/utils
|
|
workers: 4
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: proxy-server
|
|
artifact-name: proxy-server
|
|
test-path: "tests/test_litellm/proxy/proxy_server"
|
|
workers: 4
|
|
reruns: 2
|
|
timeout-minutes: 60
|
|
job-timeout-minutes: 100
|
|
|
|
- shard: proxy-infra
|
|
artifact-name: proxy-infra
|
|
test-path: >-
|
|
tests/test_litellm/proxy/db
|
|
tests/test_litellm/proxy/middleware
|
|
tests/test_litellm/proxy/spend_tracking
|
|
tests/test_litellm/proxy/pass_through_endpoints
|
|
tests/test_litellm/proxy/_experimental
|
|
tests/test_litellm/proxy/experimental
|
|
tests/test_litellm/proxy/common_utils
|
|
tests/test_litellm/proxy/enterprise_billing
|
|
tests/test_litellm/proxy/types_utils
|
|
tests/test_litellm/proxy/logging_endpoints
|
|
tests/test_litellm/proxy/test_*.py
|
|
workers: 4
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: caching-local
|
|
artifact-name: caching-local
|
|
test-path: >-
|
|
tests/local_testing/test_cache_preset_key.py
|
|
tests/local_testing/test_caching_handler.py
|
|
tests/local_testing/test_prompt_caching.py
|
|
tests/local_testing/test_responses_stream_cache_keys.py
|
|
tests/local_testing/test_unit_test_caching.py
|
|
workers: 2
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: proxy-extras
|
|
artifact-name: proxy-extras
|
|
test-path: "tests/litellm-proxy-extras"
|
|
workers: 2
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: enterprise-package
|
|
artifact-name: enterprise-package
|
|
test-path: "tests/enterprise"
|
|
workers: 4
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
|
|
- shard: responses-caching-types
|
|
artifact-name: responses-caching-types
|
|
test-path: >-
|
|
tests/test_litellm/responses
|
|
tests/test_litellm/caching
|
|
tests/test_litellm/types
|
|
workers: 2
|
|
reruns: 2
|
|
timeout-minutes: 20
|
|
job-timeout-minutes: 60
|
|
uses: ./.github/workflows/_test-unit-base.yml
|
|
with:
|
|
test-path: ${{ matrix.test-path }}
|
|
workers: ${{ matrix.workers }}
|
|
reruns: ${{ matrix.reruns }}
|
|
timeout-minutes: ${{ matrix.timeout-minutes }}
|
|
job-timeout-minutes: ${{ matrix.job-timeout-minutes }}
|
|
artifact-name: ${{ matrix.artifact-name }}
|