LLM-Brainstorming / tournament_utils.py
ping98k
update to run on huggingface spaces
e4a181a
from litellm import completion
def _completion_kwargs(
api_base: str | None,
api_key: str | None,
temperature: float | None,
) -> dict:
"""Build kwargs for litellm.completion from api settings."""
kwargs: dict = {}
if api_base:
kwargs["api_base"] = api_base
if api_key:
kwargs["api_key"] = api_key
if temperature is not None:
kwargs["temperature"] = temperature
return kwargs
def generate_players(
instruction: str,
n: int,
model: str = "gpt-4o-mini",
*,
api_base: str | None = None,
api_key: str | None = None,
temperature: float | None = None,
thinking: bool = False,
return_usage: bool = False,
) -> list[str] | tuple[list[str], object]:
"""Request ``n`` completions for the instruction using the given model.
When ``return_usage`` is ``True`` the ``usage`` object from the completion
response is also returned.
"""
messages = [{"role": "user", "content": instruction}]
kwargs = _completion_kwargs(api_base, api_key, temperature)
# kwargs["chat_template_kwargs"] = {"enable_thinking": thinking}
response = completion(
model=model,
messages=messages,
n=n,
**kwargs,
)
players = [c.message.content.strip() for c in response.choices]
if return_usage:
return players, getattr(response, "usage", None)
return players
def prompt_score(
instruction: str,
criteria_list: list[str],
criteria_block: str,
player: str,
model: str = "gpt-4o-mini",
*,
api_base: str | None = None,
api_key: str | None = None,
temperature: float | None = None,
include_instruction: bool = True,
thinking: bool = False,
explain: bool = False,
return_usage: bool = False,
) -> str | tuple[str, object]:
"""Return a plaintext score evaluation for `player`."""
example_scores = ", ".join(["5"] * len(criteria_list)) or "5"
prompt = f"""Evaluate the output below on the following criteria:
{criteria_block}
"""
if explain:
prompt += "Provide detailed reasons in English.\n"\
"Respond in plain text with two sections in following format:\n" \
"Reasons:\n<explain your reasoning in each criteria before write final score>\n\n\n" \
f"Final verdict: <list of each criteria score in range 1-10> (e.g. [{example_scores}])"
else:
prompt += "Respond in plain text exactly like:\n" \
f"Final verdict: <list of each criteria score in range 1-10> (e.g. [{example_scores}])"
if include_instruction:
prompt += f"\n\nInstruction:\n{instruction}"
prompt += f"\n\nOutput:\n{player}"
kwargs = _completion_kwargs(api_base, api_key, temperature)
# kwargs["chat_template_kwargs"] = {"enable_thinking": thinking}
response = completion(
model=model,
messages=[{"role": "system", "content": prompt}],
**kwargs,
)
text = response.choices[0].message.content.strip()
if return_usage:
return text, getattr(response, "usage", None)
return text
def prompt_pairwise(
instruction: str,
criteria_block: str,
a: str,
b: str,
model: str = "gpt-4o-mini",
*,
api_base: str | None = None,
api_key: str | None = None,
temperature: float | None = None,
include_instruction: bool = True,
thinking: bool = False,
explain: bool = False,
return_usage: bool = False,
) -> str | tuple[str, object]:
"""Return which player wins in plaintext using the given criteria."""
prompt = f"""Compare the two players below using:
{criteria_block}
"""
verdict_example = "Final verdict: A or Final verdict: B"
if explain:
prompt += (
"Provide detailed reasons in English.\n" \
"Respond in plain text with two sections in following format:\n"
"Reasons:\n<explain your reasoning in each criteria before write final verdict>\n\n\n"
f"{verdict_example}"
)
else:
prompt += (
"Respond in plain text exactly like:\n"
f"{verdict_example}"
)
if include_instruction:
prompt += f"\n\nInstruction:\n{instruction}"
prompt += f"\n\nPlayers:\n<A>{a}</A>\n<B>{b}</B>"
kwargs = _completion_kwargs(api_base, api_key, temperature)
# kwargs["chat_template_kwargs"] = {"enable_thinking": thinking}
response = completion(
model=model,
messages=[{"role": "system", "content": prompt}],
**kwargs,
)
text = response.choices[0].message.content.strip()
if return_usage:
return text, getattr(response, "usage", None)
return text