|
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