Skip to content

Commit 84faf9f

Browse files
authored
Merge pull request #1301 from asimurka/conversation_management
LCORE-1262: OpenResponses endpoint
2 parents 620837e + aba4b8e commit 84faf9f

29 files changed

Lines changed: 9780 additions & 3513 deletions

docs/openapi.json

Lines changed: 6443 additions & 3332 deletions
Large diffs are not rendered by default.

docs/responses.md

Lines changed: 86 additions & 33 deletions
Large diffs are not rendered by default.

src/app/endpoints/conversations_v1.py

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from configuration import configuration
1717
from models.config import Action
1818
from models.database.conversations import (
19-
UserTurn,
2019
UserConversation,
2120
)
2221
from models.requests import ConversationUpdateRequest
@@ -38,14 +37,18 @@
3837
check_configuration_loaded,
3938
delete_conversation,
4039
retrieve_conversation,
40+
retrieve_conversation_turns,
4141
validate_and_retrieve_conversation,
4242
)
4343
from utils.suid import (
4444
check_suid,
4545
normalize_conversation_id,
4646
to_llama_stack_conversation_id,
4747
)
48-
from utils.conversations import build_conversation_turns_from_items
48+
from utils.conversations import (
49+
build_conversation_turns_from_items,
50+
get_all_conversation_items,
51+
)
4952
from log import get_logger
5053

5154
logger = get_logger(__name__)
@@ -236,46 +239,23 @@ async def get_conversation_endpoint_handler( # pylint: disable=too-many-locals,
236239
llama_stack_conv_id,
237240
)
238241

239-
# Use Conversations API to retrieve conversation items
240-
conversation_items_response = await client.conversations.items.list(
241-
conversation_id=llama_stack_conv_id,
242-
after=None,
243-
include=None,
244-
limit=None,
245-
order="asc", # oldest first
246-
)
242+
# Retrieve turns metadata from database (can be empty for legacy conversations)
243+
db_turns = retrieve_conversation_turns(normalized_conv_id)
247244

248-
if not conversation_items_response.data:
245+
# Use Conversations API to retrieve conversation items
246+
items = await get_all_conversation_items(client, llama_stack_conv_id)
247+
if not items:
249248
logger.error("No items found for conversation %s", conversation_id)
250249
response = NotFoundResponse(
251250
resource="conversation", resource_id=normalized_conv_id
252251
).model_dump()
253252
raise HTTPException(**response)
254253

255-
items = conversation_items_response.data
256-
257254
logger.info(
258255
"Successfully retrieved %d items for conversation %s",
259256
len(items),
260257
conversation_id,
261258
)
262-
# Retrieve turns metadata from database
263-
db_turns: list[UserTurn] = []
264-
try:
265-
with get_session() as session:
266-
db_turns = (
267-
session.query(UserTurn)
268-
.filter_by(conversation_id=normalized_conv_id)
269-
.order_by(UserTurn.turn_number)
270-
.all()
271-
)
272-
except SQLAlchemyError as e:
273-
logger.error(
274-
"Database error occurred while retrieving conversation turns for %s.",
275-
normalized_conv_id,
276-
)
277-
response = InternalServerErrorResponse.database_error()
278-
raise HTTPException(**response.model_dump()) from e
279259

280260
# Build conversation turns from items and populate turns metadata
281261
# Use conversation.created_at for legacy conversations without turn metadata

src/app/endpoints/query.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# pylint: disable=too-many-locals,too-many-branches,too-many-nested-blocks
2-
31
"""Handler for REST API call to provide answer to query using Response API."""
42

53
import datetime
@@ -264,7 +262,7 @@ async def query_endpoint_handler(
264262
)
265263

266264

267-
async def retrieve_response( # pylint: disable=too-many-locals
265+
async def retrieve_response(
268266
client: AsyncLlamaStackClient,
269267
responses_params: ResponsesApiParams,
270268
moderation_result: ShieldModerationResult,
@@ -291,7 +289,9 @@ async def retrieve_response( # pylint: disable=too-many-locals
291289
responses_params.input,
292290
[moderation_result.refusal_response],
293291
)
294-
return TurnSummary(llm_response=moderation_result.message)
292+
return TurnSummary(
293+
id=moderation_result.moderation_id, llm_response=moderation_result.message
294+
)
295295
try:
296296
response = await client.responses.create(
297297
**responses_params.model_dump(exclude_none=True)

0 commit comments

Comments
 (0)