Zenithwang commited on
Commit
abaf7bb
·
verified ·
1 Parent(s): 79cceb8

Update app.py to use step-3 model and StepFun API endpoint

Browse files
Files changed (1) hide show
  1. app.py +28 -22
app.py CHANGED
@@ -6,46 +6,52 @@ from PIL import Image
6
  from openai import OpenAI
7
 
8
  # ------- 配置区 -------
9
- # 推荐在 HF Space 的 Settings Variables and secrets 里设置:
10
  # Name: OPENAI_API_KEY Value: 你的 StepFun API Key
11
- # 如需自定义变量名(比如 STEPFUN_KEY),下面会做兼容处理。
12
- STEPFUN_ENDPOINT = "https://platform.stepfun.com/v1"
13
- MODEL_NAME = "step3-fp8"
14
- MAX_TOKENS = 1024
15
- # ---------------------
16
 
17
- def _get_api_key():
 
 
 
18
  # 优先用 OPENAI_API_KEY(OpenAI SDK 的默认约定),否则回退 STEPFUN_KEY
19
  return os.getenv("OPENAI_API_KEY") or os.getenv("STEPFUN_KEY")
20
 
 
21
  def _pil_to_data_url(img: Image.Image, fmt: str = "PNG") -> str:
 
22
  buf = io.BytesIO()
23
  img.save(buf, format=fmt)
24
  b64 = base64.b64encode(buf.getvalue()).decode("utf-8")
25
  mime = "image/png" if fmt.upper() == "PNG" else "image/jpeg"
26
  return f"data:{mime};base64,{b64}"
27
 
 
28
  def _make_client() -> OpenAI:
29
  key = _get_api_key()
30
  if not key:
31
- # 给出更友好的报错,避免默认的 OpenAIError 让人摸不着头脑
32
  raise RuntimeError(
33
- "API Key 未设置。请到 Space 的 Settings Variables and secrets 添加:\n"
34
- "Name=OPENAI_API_KEYValue=你的 StepFun API Key(或用 STEPFUN_KEY 也可)。"
35
  )
 
36
  return OpenAI(api_key=key, base_url=STEPFUN_ENDPOINT)
37
 
 
38
  client = _make_client()
39
 
40
- def chat_with_step3(image: Image.Image, question: str):
 
 
41
  if image is None:
42
  return "请先上传图片。"
43
  if not question:
44
  question = "请描述这张图片。"
45
 
46
- # 将 PIL 图转成 data URL,传到 OpenAI 兼容接口
47
  data_url = _pil_to_data_url(image, fmt="PNG")
48
-
49
  messages = [
50
  {
51
  "role": "user",
@@ -53,30 +59,30 @@ def chat_with_step3(image: Image.Image, question: str):
53
  {"type": "image_url", "image_url": {"url": data_url}},
54
  {"type": "text", "text": question},
55
  ],
56
- }
57
  ]
58
-
59
  try:
 
60
  resp = client.chat.completions.create(
61
  model=MODEL_NAME,
62
  messages=messages,
63
- max_tokens=MAX_TOKENS,
64
  )
65
  return resp.choices[0].message.content
66
  except Exception as e:
67
- # 返回更清晰的错误信息到前端,方便你在 Space 控制台外定位问题
68
- return f"调用失败:{e}"
 
69
 
70
- # Interface 足够简单,也可改 Blocks
71
  iface = gr.Interface(
72
  fn=chat_with_step3,
73
  inputs=[
74
  gr.Image(type="pil", label="Upload image"),
75
- gr.Textbox(label="Question", placeholder="问点什么…"),
76
  ],
77
  outputs=gr.Textbox(label="Answer"),
78
- title="Step3 FP8 (API) Demo",
79
- description="使用 StepFun 的 OpenAI 兼容 API(/v1)来调用 step3-fp8 模型。",
80
  )
81
 
82
  if __name__ == "__main__":
 
6
  from openai import OpenAI
7
 
8
  # ------- 配置区 -------
9
+ # 推荐在 HF Space 的 Settings - Variables and secrets 里设置:
10
  # Name: OPENAI_API_KEY Value: 你的 StepFun API Key
11
+ # 如果前台定义变量 (比如 STEPFUN_KEY),下面会依然被读取。
12
+ STEPFUN_ENDPOINT = "https://api.stepfun.com/v1"
13
+ MODEL_NAME = "step-3"
 
 
14
 
15
+ # --------------------
16
+
17
+ def _get_api_key() -> str:
18
+ """获取 API KEY,如果没有设置则抛出异常"""
19
  # 优先用 OPENAI_API_KEY(OpenAI SDK 的默认约定),否则回退 STEPFUN_KEY
20
  return os.getenv("OPENAI_API_KEY") or os.getenv("STEPFUN_KEY")
21
 
22
+
23
  def _pil_to_data_url(img: Image.Image, fmt: str = "PNG") -> str:
24
+ """将 PIL 图片转换成 base64 Data URL"""
25
  buf = io.BytesIO()
26
  img.save(buf, format=fmt)
27
  b64 = base64.b64encode(buf.getvalue()).decode("utf-8")
28
  mime = "image/png" if fmt.upper() == "PNG" else "image/jpeg"
29
  return f"data:{mime};base64,{b64}"
30
 
31
+
32
  def _make_client() -> OpenAI:
33
  key = _get_api_key()
34
  if not key:
 
35
  raise RuntimeError(
36
+ "API Key 未设置\n请到 Space 的 Settings - Variables and secrets 添加:\n"
37
+ "Name=OPENAI_API_KEY, Value=你的 StepFun API Key(或用 STEPFUN_KEY 也可)。"
38
  )
39
+ # 创建客户端时指定 StepFun 的 base_url
40
  return OpenAI(api_key=key, base_url=STEPFUN_ENDPOINT)
41
 
42
+
43
  client = _make_client()
44
 
45
+
46
+ def chat_with_step3(image: Image.Image, question: str) -> str:
47
+ """调用 StepFun 的 step-3 模型进行推理"""
48
  if image is None:
49
  return "请先上传图片。"
50
  if not question:
51
  question = "请描述这张图片。"
52
 
53
+ # 将 PIL 图片转成 Data URL,传到 StepFun
54
  data_url = _pil_to_data_url(image, fmt="PNG")
 
55
  messages = [
56
  {
57
  "role": "user",
 
59
  {"type": "image_url", "image_url": {"url": data_url}},
60
  {"type": "text", "text": question},
61
  ],
62
+ },
63
  ]
 
64
  try:
65
+ # 调用 StepFun 的 OpenAI 兼容接口,不设置 max_tokens
66
  resp = client.chat.completions.create(
67
  model=MODEL_NAME,
68
  messages=messages,
 
69
  )
70
  return resp.choices[0].message.content
71
  except Exception as e:
72
+ # 返回异常信息,方便调试
73
+ return f"调用失败: {e!r}"
74
+
75
 
76
+ # 构建 Gradio 界面
77
  iface = gr.Interface(
78
  fn=chat_with_step3,
79
  inputs=[
80
  gr.Image(type="pil", label="Upload image"),
81
+ gr.Textbox(label="Question", placeholder="问点什么..."),
82
  ],
83
  outputs=gr.Textbox(label="Answer"),
84
+ title="Step3 (API) Demo",
85
+ description="使用 StepFun 的 OpenAI 兼容 API (/v1) 来调用 step-3 模型。",
86
  )
87
 
88
  if __name__ == "__main__":