BeastGokul commited on
Commit
de1826b
·
verified ·
1 Parent(s): 78b8910

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -3
app.py CHANGED
@@ -1,9 +1,10 @@
1
  import os
2
  import time
 
3
 
4
  import gradio as gr
5
  from openai import OpenAI
6
- from vectra.solve import SolveConfig, solve
7
 
8
  DEFAULT_OPENROUTER_BASE = "https://openrouter.ai/api"
9
  DEFAULT_MODEL = "openai/gpt-4o-mini"
@@ -51,6 +52,49 @@ def _apply_vectra_env(api_key: str, vectra_base: str, model: str) -> None:
51
  os.environ["OPENAI_MODEL"] = model
52
 
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  def _normalize_content(content) -> str:
55
  if isinstance(content, str):
56
  return content.strip()
@@ -141,11 +185,12 @@ def _vectra_infer(
141
  max_calls: int,
142
  max_concurrency: int,
143
  ):
144
- api_key, _, vectra_base, model = _resolve_openrouter_config(model_override)
145
  _apply_vectra_env(api_key, vectra_base, model)
 
146
 
147
  t0 = time.perf_counter()
148
- result = solve(
149
  prompt,
150
  SolveConfig(
151
  model=model,
@@ -155,6 +200,7 @@ def _vectra_infer(
155
  temperature=float(temperature),
156
  return_trace=True,
157
  ),
 
158
  )
159
  elapsed = round(time.perf_counter() - t0, 3)
160
 
 
1
  import os
2
  import time
3
+ import asyncio
4
 
5
  import gradio as gr
6
  from openai import OpenAI
7
+ from vectra.solve import SolveConfig, _solve_with_client
8
 
9
  DEFAULT_OPENROUTER_BASE = "https://openrouter.ai/api"
10
  DEFAULT_MODEL = "openai/gpt-4o-mini"
 
52
  os.environ["OPENAI_MODEL"] = model
53
 
54
 
55
+ class OpenRouterVectraClient:
56
+ """Async chat adapter backed by the sync OpenAI SDK.
57
+
58
+ This avoids async client shutdown issues under certain Gradio event-loop contexts.
59
+ """
60
+
61
+ def __init__(self, *, api_key: str, sdk_base: str, model: str):
62
+ self._client = OpenAI(base_url=sdk_base, api_key=api_key)
63
+ self._model = model
64
+
65
+ async def chat(
66
+ self,
67
+ messages,
68
+ *,
69
+ model: str | None = None,
70
+ temperature: float = 0.7,
71
+ max_tokens: int | None = None,
72
+ n: int = 1,
73
+ extra: dict | None = None,
74
+ ) -> list[str]:
75
+ def _request() -> list[str]:
76
+ kwargs = {
77
+ "model": model or self._model,
78
+ "messages": [{"role": m.role, "content": m.content} for m in messages],
79
+ "temperature": float(temperature),
80
+ "n": int(n),
81
+ }
82
+ if max_tokens is not None:
83
+ kwargs["max_tokens"] = int(max_tokens)
84
+ if extra:
85
+ kwargs["extra_body"] = dict(extra)
86
+
87
+ response = self._client.chat.completions.create(**kwargs)
88
+ outputs: list[str] = []
89
+ for choice in response.choices:
90
+ outputs.append(_normalize_content(choice.message.content))
91
+ if not outputs:
92
+ raise RuntimeError("No choices returned from model")
93
+ return outputs
94
+
95
+ return await asyncio.to_thread(_request)
96
+
97
+
98
  def _normalize_content(content) -> str:
99
  if isinstance(content, str):
100
  return content.strip()
 
185
  max_calls: int,
186
  max_concurrency: int,
187
  ):
188
+ api_key, sdk_base, vectra_base, model = _resolve_openrouter_config(model_override)
189
  _apply_vectra_env(api_key, vectra_base, model)
190
+ client = OpenRouterVectraClient(api_key=api_key, sdk_base=sdk_base, model=model)
191
 
192
  t0 = time.perf_counter()
193
+ result = _solve_with_client(
194
  prompt,
195
  SolveConfig(
196
  model=model,
 
200
  temperature=float(temperature),
201
  return_trace=True,
202
  ),
203
+ client=client,
204
  )
205
  elapsed = round(time.perf_counter() - t0, 3)
206