Patryk Ptasiński commited on
Commit
eca0fa7
·
1 Parent(s): 7d3e0ef

Allow any Hugging Face model in API with trust_remote_code=False for unlisted models

Browse files
Files changed (2) hide show
  1. CLAUDE.md +3 -2
  2. app.py +37 -18
CLAUDE.md CHANGED
@@ -40,8 +40,9 @@ The application consists of a single `app.py` file with:
40
 
41
  - **Queue**: Hugging Face Spaces enforces queuing at infrastructure level, even without `.queue()` in code
42
  - **CPU Mode**: Explicitly set to CPU to avoid GPU requirements
43
- - **Trust Remote Code**: Model uses `trust_remote_code=True` for custom Nomic model code
44
- - **API Access**: Direct HTTP requires queue protocol; use Gradio client libraries instead
 
45
 
46
  ## API Usage
47
 
 
40
 
41
  - **Queue**: Hugging Face Spaces enforces queuing at infrastructure level, even without `.queue()` in code
42
  - **CPU Mode**: Explicitly set to CPU to avoid GPU requirements
43
+ - **Trust Remote Code**: Only predefined models in MODELS dict allow `trust_remote_code=True`
44
+ - **Any HF Model**: API accepts any Hugging Face model name but uses `trust_remote_code=False` for unlisted models
45
+ - **API Access**: Direct HTTP available via FastAPI endpoints
46
 
47
  ## API Usage
48
 
app.py CHANGED
@@ -34,12 +34,16 @@ current_model_name = "nomic-ai/nomic-embed-text-v1.5"
34
  def load_model(model_name: str):
35
  global loaded_models
36
  if model_name not in loaded_models:
37
- config = MODELS.get(model_name, {})
38
- loaded_models[model_name] = SentenceTransformer(
39
- model_name,
40
- trust_remote_code=config.get("trust_remote_code", False),
41
- device='cpu'
42
- )
 
 
 
 
43
  return loaded_models[model_name]
44
 
45
  # Load default model
@@ -50,9 +54,12 @@ fastapi_app = FastAPI()
50
 
51
 
52
  def embed(document: str, model_name: str = None):
53
- if model_name and model_name in MODELS:
54
- selected_model = load_model(model_name)
55
- return selected_model.encode(document)
 
 
 
56
  return model.encode(document)
57
 
58
 
@@ -70,11 +77,11 @@ async def embed_text(data: Dict[str, Any]):
70
  content={"error": "No text provided"}
71
  )
72
 
 
73
  if model_name not in MODELS:
74
- return JSONResponse(
75
- status_code=400,
76
- content={"error": f"Model '{model_name}' not supported. Available models: {list(MODELS.keys())}"}
77
- )
78
 
79
  # Generate embedding
80
  embedding = embed(text, model_name)
@@ -83,7 +90,9 @@ async def embed_text(data: Dict[str, Any]):
83
  content={
84
  "embedding": embedding.tolist(),
85
  "dim": len(embedding),
86
- "model": model_name
 
 
87
  }
88
  )
89
  except Exception as e:
@@ -117,12 +126,13 @@ with gr.Blocks(title="Multi-Model Text Embeddings", css="""
117
  gr.Markdown("# Multi-Model Text Embeddings")
118
  gr.Markdown("Generate embeddings for your text using 16+ state-of-the-art embedding models from Nomic, BGE, Snowflake, IBM Granite, and more.")
119
 
120
- # Model selector dropdown
121
  model_dropdown = gr.Dropdown(
122
  choices=list(MODELS.keys()),
123
  value=current_model_name,
124
  label="Select Embedding Model",
125
- info="Choose the embedding model to use"
 
126
  )
127
 
128
  # Create an input text box
@@ -143,6 +153,8 @@ with gr.Blocks(title="Multi-Model Text Embeddings", css="""
143
  gr.Markdown("""
144
  You can use this API in two ways: via the direct FastAPI endpoint or through Gradio clients.
145
 
 
 
146
  ### List Available Models
147
  ```bash
148
  curl https://ipepe-nomic-embeddings.hf.space/models
@@ -155,10 +167,15 @@ with gr.Blocks(title="Multi-Model Text Embeddings", css="""
155
  -H "Content-Type: application/json" \
156
  -d '{"text": "Your text to embed goes here"}'
157
 
158
- # With specific model
159
  curl -X POST https://ipepe-nomic-embeddings.hf.space/embed \
160
  -H "Content-Type: application/json" \
161
  -d '{"text": "Your text to embed goes here", "model": "sentence-transformers/all-MiniLM-L6-v2"}'
 
 
 
 
 
162
  ```
163
 
164
  Response format:
@@ -166,7 +183,9 @@ with gr.Blocks(title="Multi-Model Text Embeddings", css="""
166
  {
167
  "embedding": [0.123, -0.456, ...],
168
  "dim": 384,
169
- "model": "sentence-transformers/all-MiniLM-L6-v2"
 
 
170
  }
171
  ```
172
 
 
34
  def load_model(model_name: str):
35
  global loaded_models
36
  if model_name not in loaded_models:
37
+ # Only allow trust_remote_code=True for predefined models
38
+ trust_remote_code = MODELS.get(model_name, {}).get("trust_remote_code", False)
39
+ try:
40
+ loaded_models[model_name] = SentenceTransformer(
41
+ model_name,
42
+ trust_remote_code=trust_remote_code,
43
+ device='cpu'
44
+ )
45
+ except Exception as e:
46
+ raise ValueError(f"Failed to load model '{model_name}': {str(e)}")
47
  return loaded_models[model_name]
48
 
49
  # Load default model
 
54
 
55
 
56
  def embed(document: str, model_name: str = None):
57
+ if model_name:
58
+ try:
59
+ selected_model = load_model(model_name)
60
+ return selected_model.encode(document)
61
+ except Exception as e:
62
+ raise ValueError(f"Error with model '{model_name}': {str(e)}")
63
  return model.encode(document)
64
 
65
 
 
77
  content={"error": "No text provided"}
78
  )
79
 
80
+ # Allow any model but warn about trust_remote_code
81
  if model_name not in MODELS:
82
+ trust_remote_code = False
83
+ else:
84
+ trust_remote_code = MODELS[model_name].get("trust_remote_code", False)
 
85
 
86
  # Generate embedding
87
  embedding = embed(text, model_name)
 
90
  content={
91
  "embedding": embedding.tolist(),
92
  "dim": len(embedding),
93
+ "model": model_name,
94
+ "trust_remote_code": trust_remote_code,
95
+ "predefined": model_name in MODELS
96
  }
97
  )
98
  except Exception as e:
 
126
  gr.Markdown("# Multi-Model Text Embeddings")
127
  gr.Markdown("Generate embeddings for your text using 16+ state-of-the-art embedding models from Nomic, BGE, Snowflake, IBM Granite, and more.")
128
 
129
+ # Model selector dropdown (allows custom input)
130
  model_dropdown = gr.Dropdown(
131
  choices=list(MODELS.keys()),
132
  value=current_model_name,
133
  label="Select Embedding Model",
134
+ info="Choose from predefined models or enter any Hugging Face model name",
135
+ allow_custom_value=True
136
  )
137
 
138
  # Create an input text box
 
153
  gr.Markdown("""
154
  You can use this API in two ways: via the direct FastAPI endpoint or through Gradio clients.
155
 
156
+ **Security Note**: Only predefined models allow `trust_remote_code=True`. Any other Hugging Face model will use `trust_remote_code=False` for security.
157
+
158
  ### List Available Models
159
  ```bash
160
  curl https://ipepe-nomic-embeddings.hf.space/models
 
167
  -H "Content-Type: application/json" \
168
  -d '{"text": "Your text to embed goes here"}'
169
 
170
+ # With predefined model (trust_remote_code allowed)
171
  curl -X POST https://ipepe-nomic-embeddings.hf.space/embed \
172
  -H "Content-Type: application/json" \
173
  -d '{"text": "Your text to embed goes here", "model": "sentence-transformers/all-MiniLM-L6-v2"}'
174
+
175
+ # With any Hugging Face model (trust_remote_code=False for security)
176
+ curl -X POST https://ipepe-nomic-embeddings.hf.space/embed \
177
+ -H "Content-Type: application/json" \
178
+ -d '{"text": "Your text to embed goes here", "model": "intfloat/e5-base-v2"}'
179
  ```
180
 
181
  Response format:
 
183
  {
184
  "embedding": [0.123, -0.456, ...],
185
  "dim": 384,
186
+ "model": "sentence-transformers/all-MiniLM-L6-v2",
187
+ "trust_remote_code": false,
188
+ "predefined": true
189
  }
190
  ```
191