e768098d0e
Flake8 Lint / flake8 (push) Waiting to run
Spell check CI / Spell_Check (push) Waiting to run
tools_continuous_delivery / Private PyPI non-main branch release (push) Has been skipped
tools_continuous_delivery / Private PyPI main branch release (push) Failing after 2m42s
Publish Promptflow Doc / Build (push) Has been cancelled
Publish Promptflow Doc / Deploy (push) Has been cancelled
89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
import os
|
|
from openai.version import VERSION as OPENAI_VERSION
|
|
|
|
from dotenv import load_dotenv
|
|
from promptflow.core import tool
|
|
|
|
# The inputs section will change based on the arguments of the tool function, after you save the code
|
|
# Adding type to arguments and return value will help the system show the types properly
|
|
# Please update the function name/signature per need
|
|
|
|
|
|
def to_bool(value) -> bool:
|
|
return str(value).lower() == "true"
|
|
|
|
|
|
def get_client():
|
|
if OPENAI_VERSION.startswith("0."):
|
|
raise Exception(
|
|
"Please upgrade your OpenAI package to version >= 1.0.0 or using the command: pip install --upgrade openai."
|
|
)
|
|
api_key = os.environ["AZURE_OPENAI_API_KEY"]
|
|
conn = dict(
|
|
api_key=os.environ["AZURE_OPENAI_API_KEY"],
|
|
)
|
|
if api_key.startswith("sk-"):
|
|
from openai import OpenAI as Client
|
|
else:
|
|
from openai import AzureOpenAI as Client
|
|
conn.update(
|
|
azure_endpoint=os.environ.get("AZURE_OPENAI_API_BASE", "azure"),
|
|
api_version=os.environ.get("OPENAI_API_VERSION", "2023-07-01-preview"),
|
|
)
|
|
return Client(**conn)
|
|
|
|
|
|
@tool
|
|
def my_python_tool(
|
|
prompt: str,
|
|
# for AOAI, deployment name is customized by user, not model name.
|
|
deployment_name: str,
|
|
suffix: str = None,
|
|
max_tokens: int = 120,
|
|
temperature: float = 1.0,
|
|
top_p: float = 1.0,
|
|
n: int = 1,
|
|
logprobs: int = None,
|
|
echo: bool = False,
|
|
stop: list = None,
|
|
presence_penalty: float = 0,
|
|
frequency_penalty: float = 0,
|
|
best_of: int = 1,
|
|
logit_bias: dict = {},
|
|
user: str = "",
|
|
**kwargs,
|
|
) -> str:
|
|
if "AZURE_OPENAI_API_KEY" not in os.environ or "AZURE_OPENAI_API_BASE" not in os.environ:
|
|
# load environment variables from .env file
|
|
load_dotenv()
|
|
|
|
if "AZURE_OPENAI_API_KEY" not in os.environ:
|
|
raise Exception("Please specify environment variables: AZURE_OPENAI_API_KEY")
|
|
|
|
# TODO: remove below type conversion after client can pass json rather than string.
|
|
echo = to_bool(echo)
|
|
|
|
response = get_client().completions.create(
|
|
prompt=prompt,
|
|
model=deployment_name,
|
|
# empty string suffix should be treated as None.
|
|
suffix=suffix if suffix else None,
|
|
max_tokens=int(max_tokens),
|
|
temperature=float(temperature),
|
|
top_p=float(top_p),
|
|
n=int(n),
|
|
logprobs=int(logprobs) if logprobs else None,
|
|
echo=echo,
|
|
# fix bug "[] is not valid under any of the given schemas-'stop'"
|
|
stop=stop if stop else None,
|
|
presence_penalty=float(presence_penalty),
|
|
frequency_penalty=float(frequency_penalty),
|
|
best_of=int(best_of),
|
|
# Logit bias must be a dict if we passed it to openai api.
|
|
logit_bias=logit_bias if logit_bias else {},
|
|
user=user,
|
|
)
|
|
|
|
# get first element because prompt is single.
|
|
return response.choices[0].text
|