|
19 | 19 |
|
20 | 20 | import copy |
21 | 21 | import logging |
22 | | -from inspect import isclass |
23 | 22 | import types |
24 | | - |
25 | 23 | from collections import defaultdict |
26 | 24 | from dataclasses import dataclass |
| 25 | +from inspect import isclass |
27 | 26 | from typing import List, Optional |
28 | 27 |
|
29 | 28 | import openai.resources |
30 | 29 | from openai._types import NotGiven |
31 | 30 | from packaging.version import Version |
| 31 | +from pydantic import BaseModel |
32 | 32 | from wrapt import wrap_function_wrapper |
33 | 33 |
|
34 | 34 | from langfuse import Langfuse |
35 | 35 | from langfuse.client import StatefulGenerationClient |
36 | 36 | from langfuse.decorators import langfuse_context |
37 | 37 | from langfuse.utils import _get_timestamp |
38 | 38 | from langfuse.utils.langfuse_singleton import LangfuseSingleton |
39 | | -from pydantic import BaseModel |
40 | 39 |
|
41 | 40 | try: |
42 | 41 | import openai |
@@ -344,12 +343,15 @@ def _get_langfuse_data_from_kwargs( |
344 | 343 | else None |
345 | 344 | ) |
346 | 345 |
|
| 346 | + parsed_n = kwargs.get("n", 1) if not isinstance(kwargs.get("n", 1), NotGiven) else 1 |
| 347 | + |
347 | 348 | modelParameters = { |
348 | 349 | "temperature": parsed_temperature, |
349 | 350 | "max_tokens": parsed_max_tokens, # casing? |
350 | 351 | "top_p": parsed_top_p, |
351 | 352 | "frequency_penalty": parsed_frequency_penalty, |
352 | 353 | "presence_penalty": parsed_presence_penalty, |
| 354 | + "n": parsed_n, |
353 | 355 | } |
354 | 356 | if parsed_seed is not None: |
355 | 357 | modelParameters["seed"] = parsed_seed |
@@ -519,12 +521,21 @@ def _get_langfuse_data_from_default_response(resource: OpenAiDefinition, respons |
519 | 521 | elif resource.type == "chat": |
520 | 522 | choices = response.get("choices", []) |
521 | 523 | if len(choices) > 0: |
522 | | - choice = choices[-1] |
523 | | - completion = ( |
524 | | - _extract_chat_response(choice.message.__dict__) |
525 | | - if _is_openai_v1() |
526 | | - else choice.get("message", None) |
527 | | - ) |
| 524 | + # If multiple choices were generated, we'll show all of them in the UI as a list. |
| 525 | + if len(choices) > 1: |
| 526 | + completion = [ |
| 527 | + _extract_chat_response(choice.message.__dict__) |
| 528 | + if _is_openai_v1() |
| 529 | + else choice.get("message", None) |
| 530 | + for choice in choices |
| 531 | + ] |
| 532 | + else: |
| 533 | + choice = choices[0] |
| 534 | + completion = ( |
| 535 | + _extract_chat_response(choice.message.__dict__) |
| 536 | + if _is_openai_v1() |
| 537 | + else choice.get("message", None) |
| 538 | + ) |
528 | 539 |
|
529 | 540 | usage = response.get("usage", None) |
530 | 541 |
|
|
0 commit comments