Update app.py
Browse files
app.py
CHANGED
|
@@ -649,17 +649,16 @@ api_interface = gr.Interface(
|
|
| 649 |
api_name="/chat"
|
| 650 |
)
|
| 651 |
|
| 652 |
-
def http_api_infer(image, question):
|
| 653 |
-
"""
|
| 654 |
-
|
| 655 |
-
|
| 656 |
-
|
| 657 |
dummy_state = init_state()
|
| 658 |
dummy_state.set_system_message("You are a vision-language assistant.")
|
| 659 |
dummy_state.append_message(Conversation.USER, question, [image])
|
| 660 |
dummy_state.skip_next = False
|
| 661 |
|
| 662 |
-
# Simulate inference (you can directly call your model function here instead)
|
| 663 |
worker_addr = os.environ.get("WORKER_ADDR", "")
|
| 664 |
api_token = os.environ.get("API_TOKEN", "")
|
| 665 |
headers = {
|
|
@@ -670,8 +669,6 @@ def http_api_infer(image, question):
|
|
| 670 |
if not worker_addr:
|
| 671 |
return "⚠️ Model backend is not configured."
|
| 672 |
|
| 673 |
-
all_image_paths = [dummy_state.save_image(image)]
|
| 674 |
-
|
| 675 |
pload = {
|
| 676 |
"model": "InternVL2.5-78B",
|
| 677 |
"messages": dummy_state.get_prompt_v2(inlude_image=True, max_dynamic_patch=12),
|
|
@@ -687,7 +684,7 @@ def http_api_infer(image, question):
|
|
| 687 |
reply = response.json()["choices"][0]["message"]["content"]
|
| 688 |
return reply
|
| 689 |
except Exception as e:
|
| 690 |
-
return f"Error: {str(e)}"
|
| 691 |
|
| 692 |
if __name__ == "__main__":
|
| 693 |
parser = argparse.ArgumentParser()
|
|
@@ -699,10 +696,28 @@ if __name__ == "__main__":
|
|
| 699 |
args = parser.parse_args()
|
| 700 |
logger.info(f"args: {args}")
|
| 701 |
|
| 702 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 703 |
demo = gr.TabbedInterface(
|
| 704 |
-
|
| 705 |
-
|
| 706 |
-
)
|
| 707 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 708 |
|
|
|
|
| 649 |
api_name="/chat"
|
| 650 |
)
|
| 651 |
|
| 652 |
+
def http_api_infer(image, question, request: gr.Request):
|
| 653 |
+
token = request.headers.get("x-api-token", "")
|
| 654 |
+
if token != "123456789Rihem":
|
| 655 |
+
return "❌ Unauthorized. Missing or invalid API token."
|
| 656 |
+
|
| 657 |
dummy_state = init_state()
|
| 658 |
dummy_state.set_system_message("You are a vision-language assistant.")
|
| 659 |
dummy_state.append_message(Conversation.USER, question, [image])
|
| 660 |
dummy_state.skip_next = False
|
| 661 |
|
|
|
|
| 662 |
worker_addr = os.environ.get("WORKER_ADDR", "")
|
| 663 |
api_token = os.environ.get("API_TOKEN", "")
|
| 664 |
headers = {
|
|
|
|
| 669 |
if not worker_addr:
|
| 670 |
return "⚠️ Model backend is not configured."
|
| 671 |
|
|
|
|
|
|
|
| 672 |
pload = {
|
| 673 |
"model": "InternVL2.5-78B",
|
| 674 |
"messages": dummy_state.get_prompt_v2(inlude_image=True, max_dynamic_patch=12),
|
|
|
|
| 684 |
reply = response.json()["choices"][0]["message"]["content"]
|
| 685 |
return reply
|
| 686 |
except Exception as e:
|
| 687 |
+
return f"Error during model call: {str(e)}"
|
| 688 |
|
| 689 |
if __name__ == "__main__":
|
| 690 |
parser = argparse.ArgumentParser()
|
|
|
|
| 696 |
args = parser.parse_args()
|
| 697 |
logger.info(f"args: {args}")
|
| 698 |
|
| 699 |
+
# Build main UI and API endpoint interface
|
| 700 |
+
ui_demo = build_demo()
|
| 701 |
+
|
| 702 |
+
api_interface = gr.Interface(
|
| 703 |
+
fn=http_api_infer,
|
| 704 |
+
inputs=[gr.Image(type="pil"), gr.Textbox()],
|
| 705 |
+
outputs="text",
|
| 706 |
+
api_name="/chat"
|
| 707 |
+
)
|
| 708 |
+
|
| 709 |
+
# Serve both under tabs — API tab will be invisible in browser but callable
|
| 710 |
demo = gr.TabbedInterface(
|
| 711 |
+
interface_list=[ui_demo, api_interface],
|
| 712 |
+
tab_names=["UI", "API"]
|
| 713 |
+
)
|
| 714 |
+
|
| 715 |
+
# ✅ Important: expose API via `api_open=True`
|
| 716 |
+
demo.queue(api_open=True).launch(
|
| 717 |
+
server_name=args.host,
|
| 718 |
+
server_port=args.port,
|
| 719 |
+
share=args.share,
|
| 720 |
+
max_threads=args.concurrency_count,
|
| 721 |
+
)
|
| 722 |
+
|
| 723 |
|