Skip to content

Commit 8f705bb

Browse files
are-cesclaude
andcommitted
LCORE-1426: fix test breakages after rebase on upstream/main
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c1de7f9 commit 8f705bb

5 files changed

Lines changed: 290 additions & 27 deletions

File tree

docs/devel_doc/openapi.json

Lines changed: 253 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,156 @@
15841584
}
15851585
}
15861586
},
1587+
"/v1/skills": {
1588+
"get": {
1589+
"tags": [
1590+
"skills"
1591+
],
1592+
"summary": "Skills Endpoint Handler",
1593+
"description": "Handle requests to the /skills endpoint.\n\nProcess GET requests to the /skills endpoint, returning a list of loaded\nagent skills with their metadata (name, description).\n\n### Parameters:\n- request: The incoming HTTP request (used by middleware).\n- auth: Authentication tuple from the auth dependency (used by middleware).\n\n### Raises:\n- HTTPException: with status 401 for unauthorized access.\n- HTTPException: with status 403 if permission is denied.\n- HTTPException: with status 500 and a detail object containing `response`\n and `cause` when service configuration is wrong or incomplete.\n\n### Returns:\n- SkillsResponse: An object containing the list of loaded skills.",
1594+
"operationId": "skills_endpoint_handler_v1_skills_get",
1595+
"responses": {
1596+
"200": {
1597+
"description": "Successful response",
1598+
"content": {
1599+
"application/json": {
1600+
"schema": {
1601+
"$ref": "#/components/schemas/SkillsResponse"
1602+
},
1603+
"example": {
1604+
"skills": [
1605+
{
1606+
"description": "Review code for quality and security",
1607+
"name": "code-review"
1608+
},
1609+
{
1610+
"description": "Troubleshoot OpenShift cluster issues",
1611+
"name": "openshift-troubleshooting"
1612+
}
1613+
]
1614+
}
1615+
}
1616+
}
1617+
},
1618+
"401": {
1619+
"description": "Unauthorized",
1620+
"content": {
1621+
"application/json": {
1622+
"schema": {
1623+
"$ref": "#/components/schemas/UnauthorizedResponse"
1624+
},
1625+
"examples": {
1626+
"missing header": {
1627+
"value": {
1628+
"detail": {
1629+
"cause": "No Authorization header found",
1630+
"response": "Missing or invalid credentials provided by client"
1631+
}
1632+
}
1633+
},
1634+
"missing token": {
1635+
"value": {
1636+
"detail": {
1637+
"cause": "No token found in Authorization header",
1638+
"response": "Missing or invalid credentials provided by client"
1639+
}
1640+
}
1641+
},
1642+
"expired token": {
1643+
"value": {
1644+
"detail": {
1645+
"cause": "Token has expired",
1646+
"response": "Missing or invalid credentials provided by client"
1647+
}
1648+
}
1649+
},
1650+
"invalid signature": {
1651+
"value": {
1652+
"detail": {
1653+
"cause": "Invalid token signature",
1654+
"response": "Missing or invalid credentials provided by client"
1655+
}
1656+
}
1657+
},
1658+
"invalid key": {
1659+
"value": {
1660+
"detail": {
1661+
"cause": "Token signed by unknown key",
1662+
"response": "Missing or invalid credentials provided by client"
1663+
}
1664+
}
1665+
},
1666+
"missing claim": {
1667+
"value": {
1668+
"detail": {
1669+
"cause": "Token missing claim: user_id",
1670+
"response": "Missing or invalid credentials provided by client"
1671+
}
1672+
}
1673+
},
1674+
"invalid k8s token": {
1675+
"value": {
1676+
"detail": {
1677+
"cause": "Invalid or expired Kubernetes token",
1678+
"response": "Missing or invalid credentials provided by client"
1679+
}
1680+
}
1681+
},
1682+
"invalid jwk token": {
1683+
"value": {
1684+
"detail": {
1685+
"cause": "Authentication key server returned invalid data",
1686+
"response": "Missing or invalid credentials provided by client"
1687+
}
1688+
}
1689+
}
1690+
}
1691+
}
1692+
}
1693+
},
1694+
"403": {
1695+
"description": "Permission denied",
1696+
"content": {
1697+
"application/json": {
1698+
"schema": {
1699+
"$ref": "#/components/schemas/ForbiddenResponse"
1700+
},
1701+
"examples": {
1702+
"endpoint": {
1703+
"value": {
1704+
"detail": {
1705+
"cause": "User 6789 is not authorized to access this endpoint.",
1706+
"response": "User does not have permission to access this endpoint"
1707+
}
1708+
}
1709+
}
1710+
}
1711+
}
1712+
}
1713+
},
1714+
"500": {
1715+
"description": "Internal server error",
1716+
"content": {
1717+
"application/json": {
1718+
"schema": {
1719+
"$ref": "#/components/schemas/InternalServerErrorResponse"
1720+
},
1721+
"examples": {
1722+
"configuration": {
1723+
"value": {
1724+
"detail": {
1725+
"cause": "Lightspeed Stack configuration has not been initialized.",
1726+
"response": "Configuration is not loaded"
1727+
}
1728+
}
1729+
}
1730+
}
1731+
}
1732+
}
1733+
}
1734+
}
1735+
}
1736+
},
15871737
"/v1/providers": {
15881738
"get": {
15891739
"tags": [
@@ -11591,6 +11741,7 @@
1159111741
"feedback",
1159211742
"get_models",
1159311743
"get_tools",
11744+
"get_skills",
1159411745
"get_shields",
1159511746
"list_providers",
1159611747
"get_provider",
@@ -12907,6 +13058,22 @@
1290713058
"title": "Service name",
1290813059
"description": "Name of the service. That value will be used in REST API endpoints."
1290913060
},
13061+
"config_format_version": {
13062+
"anyOf": [
13063+
{
13064+
"type": "string",
13065+
"enum": [
13066+
"legacy",
13067+
"unified"
13068+
]
13069+
},
13070+
{
13071+
"type": "null"
13072+
}
13073+
],
13074+
"title": "Configuration format version",
13075+
"description": "Optional explicit marker of the configuration format. When set, it must agree with the shape detected from the configuration body: 'unified' requires a synthesis input (a non-empty inference.providers, a non-empty vector_store.providers, or a llama_stack.config block), 'legacy' requires no synthesis input. Reserved as the lever for a future breaking change of the unified schema (R11)."
13076+
},
1291013077
"service": {
1291113078
"$ref": "#/components/schemas/ServiceConfiguration",
1291213079
"title": "Service configuration",
@@ -15876,6 +16043,23 @@
1587616043
"title": "OKP chunk filter query",
1587716044
"description": "Additional OKP filter query applied to every OKP search request. Use Solr boolean syntax, e.g. 'product:ansible AND product:*openshift*'."
1587816045
},
16046+
"search_mode": {
16047+
"anyOf": [
16048+
{
16049+
"type": "string",
16050+
"enum": [
16051+
"semantic",
16052+
"hybrid",
16053+
"keyword"
16054+
]
16055+
},
16056+
{
16057+
"type": "null"
16058+
}
16059+
],
16060+
"title": "OKP search mode",
16061+
"description": "Default Solr search mode for OKP queries. 'keyword' uses BM25 text search (no embedding model needed). 'hybrid' combines vector + keyword search. 'semantic' uses pure vector search. When unset, falls back to the global default ('hybrid')."
16062+
},
1587916063
"max_chunks": {
1588016064
"type": "integer",
1588116065
"exclusiveMinimum": 0.0,
@@ -17703,12 +17887,15 @@
1770317887
{
1770417888
"type": "string"
1770517889
},
17890+
{
17891+
"type": "integer"
17892+
},
1770617893
{
1770717894
"type": "null"
1770817895
}
1770917896
],
1771017897
"title": "PostgreSQL port",
17711-
"description": "PostgreSQL port. Defaults to ${env.POSTGRES_PORT}."
17898+
"description": "PostgreSQL port. Defaults to ${env.POSTGRES_PORT}. Accepts string placeholders and integer values."
1771217899
},
1771317900
"db": {
1771417901
"anyOf": [
@@ -19293,6 +19480,9 @@
1929319480
{
1929419481
"type": "string"
1929519482
},
19483+
{
19484+
"type": "integer"
19485+
},
1929619486
{
1929719487
"type": "null"
1929819488
}
@@ -21361,6 +21551,27 @@
2136121551
}
2136221552
]
2136321553
},
21554+
"SkillMetadata": {
21555+
"properties": {
21556+
"name": {
21557+
"type": "string",
21558+
"title": "Name",
21559+
"description": "Unique name of the skill"
21560+
},
21561+
"description": {
21562+
"type": "string",
21563+
"title": "Description",
21564+
"description": "Human readable description of what the skill does"
21565+
}
21566+
},
21567+
"type": "object",
21568+
"required": [
21569+
"name",
21570+
"description"
21571+
],
21572+
"title": "SkillMetadata",
21573+
"description": "Metadata describing a single loaded agent skill.\n\nAttributes:\n name: Unique name of the skill.\n description: Human readable description of what the skill does."
21574+
},
2136421575
"SkillsConfiguration": {
2136521576
"properties": {
2136621577
"paths": {
@@ -21378,6 +21589,38 @@
2137821589
"title": "SkillsConfiguration",
2137921590
"description": "Agent skills configuration.\n\nSpecifies paths to skill directories. Skill metadata (name, description)\nis read from SKILL.md frontmatter at startup.\n\nEach path can point to either:\n- A directory containing a SKILL.md file (single skill)\n- A directory containing subdirectories with SKILL.md files (multiple skills)\n\nPaths are validated at startup to ensure they exist and contain valid SKILL.md files."
2138021591
},
21592+
"SkillsResponse": {
21593+
"properties": {
21594+
"skills": {
21595+
"items": {
21596+
"$ref": "#/components/schemas/SkillMetadata"
21597+
},
21598+
"type": "array",
21599+
"title": "Skills",
21600+
"description": "List of loaded skills with metadata"
21601+
}
21602+
},
21603+
"type": "object",
21604+
"required": [
21605+
"skills"
21606+
],
21607+
"title": "SkillsResponse",
21608+
"description": "Model representing a response to skills request.\n\nAttributes:\n skills: List of loaded skills with metadata (name and description).",
21609+
"examples": [
21610+
{
21611+
"skills": [
21612+
{
21613+
"description": "Review code for quality and security",
21614+
"name": "code-review"
21615+
},
21616+
{
21617+
"description": "Troubleshoot OpenShift cluster issues",
21618+
"name": "openshift-troubleshooting"
21619+
}
21620+
]
21621+
}
21622+
]
21623+
},
2138121624
"SolrVectorSearchRequest": {
2138221625
"properties": {
2138321626
"mode": {
@@ -21387,18 +21630,20 @@
2138721630
"enum": [
2138821631
"semantic",
2138921632
"hybrid",
21390-
"lexical"
21633+
"lexical",
21634+
"keyword"
2139121635
]
2139221636
},
2139321637
{
2139421638
"type": "null"
2139521639
}
2139621640
],
2139721641
"title": "Mode",
21398-
"description": "Solr vector_io search mode. When omitted, the server default ('hybrid') is used.",
21642+
"description": "Solr vector_io search mode. When omitted, the configured OKP default is used; otherwise 'hybrid' applies. 'keyword' and 'lexical' both use BM25 text search.",
2139921643
"examples": [
2140021644
"hybrid",
2140121645
"semantic",
21646+
"keyword",
2140221647
"lexical"
2140321648
]
2140421649
},
@@ -21454,7 +21699,7 @@
2145421699
"additionalProperties": false,
2145521700
"type": "object",
2145621701
"title": "SolrVectorSearchRequest",
21457-
"description": "LCORE Solr inline RAG options for vector_io.query (mode and provider filters).\n\nAttributes:\n mode: Solr vector_io search mode. When omitted, the server default (hybrid) is used.\n filters: Solr provider filter payload passed through as params['solr'].\n\nLegacy clients may send a plain JSON object with filter keys only;\nthat object is accepted as filters with mode unset (server default applies)."
21702+
"description": "LCORE Solr inline RAG options for vector_io.query (mode and provider filters).\n\nAttributes:\n mode: Solr vector_io search mode. When omitted, the configured OKP default is used.\n filters: Solr provider filter payload passed through as params['solr'].\n\nLegacy clients may send a plain JSON object with filter keys only;\nthat object is accepted as filters with mode unset (server default applies)."
2145821703
},
2145921704
"SplunkConfiguration": {
2146021705
"properties": {
@@ -22957,6 +23202,10 @@
2295723202
"name": "shields",
2295823203
"description": "Safety shields."
2295923204
},
23205+
{
23206+
"name": "skills",
23207+
"description": "Agent skills."
23208+
},
2296023209
{
2296123210
"name": "streaming_query",
2296223211
"description": "Streaming query (SSE)."

src/utils/vector_search.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -673,8 +673,8 @@ async def build_rag_context( # pylint: disable=too-many-locals,too-many-branche
673673
byok_chunks_task = _fetch_byok_rag(client, query, vector_store_ids)
674674
solr_chunks_task = _fetch_okp_rag(client, query, solr)
675675

676-
(byok_chunks, byok_documents), (solr_chunks, solr_documents) = await asyncio.gather(
677-
byok_chunks_task, solr_chunks_task
676+
(byok_chunks, byok_documents), (solr_chunks, solr_documents) = (
677+
await asyncio.gather(byok_chunks_task, solr_chunks_task)
678678
)
679679

680680
# Merge chunks

0 commit comments

Comments
 (0)