lm-sys--fastchat
163 行
4.0 KiB
Python
163 行
4.0 KiB
Python
"""
|
|
Test the OpenAI compatible server
|
|
|
|
Launch:
|
|
python3 launch_openai_api_test_server.py --multimodal
|
|
"""
|
|
|
|
import openai
|
|
|
|
from fastchat.utils import run_cmd
|
|
|
|
openai.api_key = "EMPTY" # Not support yet
|
|
openai.base_url = "http://localhost:8000/v1/"
|
|
|
|
|
|
def encode_image(image):
|
|
import base64
|
|
from io import BytesIO
|
|
import requests
|
|
|
|
from PIL import Image
|
|
|
|
if image.startswith("http://") or image.startswith("https://"):
|
|
response = requests.get(image)
|
|
image = Image.open(BytesIO(response.content)).convert("RGB")
|
|
else:
|
|
image = Image.open(image).convert("RGB")
|
|
|
|
buffered = BytesIO()
|
|
image.save(buffered, format="PNG")
|
|
img_b64_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
|
|
|
|
return img_b64_str
|
|
|
|
|
|
def test_list_models():
|
|
model_list = openai.models.list()
|
|
names = [x.id for x in model_list.data]
|
|
return names
|
|
|
|
|
|
def test_chat_completion(model):
|
|
image_url = "https://picsum.photos/seed/picsum/1024/1024"
|
|
base64_image_url = f"data:image/jpeg;base64,{encode_image(image_url)}"
|
|
|
|
# No Image
|
|
completion = openai.chat.completions.create(
|
|
model=model,
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{"type": "text", "text": "Tell me about alpacas."},
|
|
],
|
|
}
|
|
],
|
|
temperature=0,
|
|
)
|
|
print(completion.choices[0].message.content)
|
|
print("=" * 25)
|
|
|
|
# Image using url link
|
|
completion = openai.chat.completions.create(
|
|
model=model,
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{"type": "text", "text": "What’s in this image?"},
|
|
{"type": "image_url", "image_url": {"url": image_url}},
|
|
],
|
|
}
|
|
],
|
|
temperature=0,
|
|
)
|
|
print(completion.choices[0].message.content)
|
|
print("=" * 25)
|
|
|
|
# Image using base64 image url
|
|
completion = openai.chat.completions.create(
|
|
model=model,
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{"type": "text", "text": "What’s in this image?"},
|
|
{"type": "image_url", "image_url": {"url": base64_image_url}},
|
|
],
|
|
}
|
|
],
|
|
temperature=0,
|
|
)
|
|
print(completion.choices[0].message.content)
|
|
print("=" * 25)
|
|
|
|
|
|
def test_chat_completion_stream(model):
|
|
image_url = "https://picsum.photos/seed/picsum/1024/1024"
|
|
|
|
messages = [
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{"type": "text", "text": "What’s in this image?"},
|
|
{"type": "image_url", "image_url": {"url": image_url}},
|
|
],
|
|
}
|
|
]
|
|
res = openai.chat.completions.create(
|
|
model=model, messages=messages, stream=True, temperature=0
|
|
)
|
|
for chunk in res:
|
|
try:
|
|
content = chunk.choices[0].delta.content
|
|
if content is None:
|
|
content = ""
|
|
except Exception as e:
|
|
content = chunk.choices[0].delta.get("content", "")
|
|
print(content, end="", flush=True)
|
|
print()
|
|
|
|
|
|
def test_openai_curl():
|
|
run_cmd(
|
|
"""curl http://localhost:8000/v1/chat/completions \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"model": "llava-v1.5-7b",
|
|
"messages": [
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "What’s in this image?"
|
|
},
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": "https://picsum.photos/seed/picsum/1024/1024"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"max_tokens": 300
|
|
}'
|
|
"""
|
|
)
|
|
|
|
print()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
models = test_list_models()
|
|
print(f"models: {models}")
|
|
|
|
for model in models:
|
|
print(f"===== Test {model} ======")
|
|
test_chat_completion(model)
|
|
test_chat_completion_stream(model)
|
|
test_openai_curl()
|