llama-stack 0.3.2__py3-none-any.whl → 0.3.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- llama_stack/providers/inline/vector_io/faiss/faiss.py +25 -2
- llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py +15 -4
- llama_stack/providers/remote/inference/vertexai/vertexai.py +10 -0
- llama_stack/providers/remote/vector_io/chroma/chroma.py +9 -3
- llama_stack/providers/remote/vector_io/milvus/milvus.py +7 -4
- llama_stack/providers/remote/vector_io/pgvector/pgvector.py +32 -6
- llama_stack/providers/remote/vector_io/qdrant/qdrant.py +11 -6
- llama_stack/providers/remote/vector_io/weaviate/weaviate.py +7 -4
- llama_stack/providers/utils/inference/inference_store.py +16 -8
- llama_stack/providers/utils/inference/model_registry.py +1 -1
- llama_stack/providers/utils/inference/openai_mixin.py +29 -9
- llama_stack/providers/utils/responses/responses_store.py +18 -2
- llama_stack/providers/utils/sqlstore/sqlalchemy_sqlstore.py +31 -1
- {llama_stack-0.3.2.dist-info → llama_stack-0.3.3.dist-info}/METADATA +3 -3
- {llama_stack-0.3.2.dist-info → llama_stack-0.3.3.dist-info}/RECORD +19 -19
- {llama_stack-0.3.2.dist-info → llama_stack-0.3.3.dist-info}/WHEEL +0 -0
- {llama_stack-0.3.2.dist-info → llama_stack-0.3.3.dist-info}/entry_points.txt +0 -0
- {llama_stack-0.3.2.dist-info → llama_stack-0.3.3.dist-info}/licenses/LICENSE +0 -0
- {llama_stack-0.3.2.dist-info → llama_stack-0.3.3.dist-info}/top_level.txt +0 -0
|
@@ -223,7 +223,8 @@ class FaissVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProtoco
|
|
|
223
223
|
return HealthResponse(status=HealthStatus.ERROR, message=f"Health check failed: {str(e)}")
|
|
224
224
|
|
|
225
225
|
async def register_vector_store(self, vector_store: VectorStore) -> None:
|
|
226
|
-
|
|
226
|
+
if self.kvstore is None:
|
|
227
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before registering vector stores.")
|
|
227
228
|
|
|
228
229
|
key = f"{VECTOR_DBS_PREFIX}{vector_store.identifier}"
|
|
229
230
|
await self.kvstore.set(key=key, value=vector_store.model_dump_json())
|
|
@@ -239,7 +240,8 @@ class FaissVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProtoco
|
|
|
239
240
|
return [i.vector_store for i in self.cache.values()]
|
|
240
241
|
|
|
241
242
|
async def unregister_vector_store(self, vector_store_id: str) -> None:
|
|
242
|
-
|
|
243
|
+
if self.kvstore is None:
|
|
244
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before unregistering vector stores.")
|
|
243
245
|
|
|
244
246
|
if vector_store_id not in self.cache:
|
|
245
247
|
return
|
|
@@ -248,6 +250,27 @@ class FaissVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProtoco
|
|
|
248
250
|
del self.cache[vector_store_id]
|
|
249
251
|
await self.kvstore.delete(f"{VECTOR_DBS_PREFIX}{vector_store_id}")
|
|
250
252
|
|
|
253
|
+
async def _get_and_cache_vector_store_index(self, vector_store_id: str) -> VectorStoreWithIndex | None:
|
|
254
|
+
if vector_store_id in self.cache:
|
|
255
|
+
return self.cache[vector_store_id]
|
|
256
|
+
|
|
257
|
+
if self.kvstore is None:
|
|
258
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before using vector stores.")
|
|
259
|
+
|
|
260
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store_id}"
|
|
261
|
+
vector_store_data = await self.kvstore.get(key)
|
|
262
|
+
if not vector_store_data:
|
|
263
|
+
raise VectorStoreNotFoundError(vector_store_id)
|
|
264
|
+
|
|
265
|
+
vector_store = VectorStore.model_validate_json(vector_store_data)
|
|
266
|
+
index = VectorStoreWithIndex(
|
|
267
|
+
vector_store=vector_store,
|
|
268
|
+
index=await FaissIndex.create(vector_store.embedding_dimension, self.kvstore, vector_store.identifier),
|
|
269
|
+
inference_api=self.inference_api,
|
|
270
|
+
)
|
|
271
|
+
self.cache[vector_store_id] = index
|
|
272
|
+
return index
|
|
273
|
+
|
|
251
274
|
async def insert_chunks(self, vector_db_id: str, chunks: list[Chunk], ttl_seconds: int | None = None) -> None:
|
|
252
275
|
index = self.cache.get(vector_db_id)
|
|
253
276
|
if index is None:
|
|
@@ -412,6 +412,14 @@ class SQLiteVecVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresPro
|
|
|
412
412
|
return [v.vector_store for v in self.cache.values()]
|
|
413
413
|
|
|
414
414
|
async def register_vector_store(self, vector_store: VectorStore) -> None:
|
|
415
|
+
if self.kvstore is None:
|
|
416
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before registering vector stores.")
|
|
417
|
+
|
|
418
|
+
# Save to kvstore for persistence
|
|
419
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store.identifier}"
|
|
420
|
+
await self.kvstore.set(key=key, value=vector_store.model_dump_json())
|
|
421
|
+
|
|
422
|
+
# Create and cache the index
|
|
415
423
|
index = await SQLiteVecIndex.create(
|
|
416
424
|
vector_store.embedding_dimension, self.config.db_path, vector_store.identifier
|
|
417
425
|
)
|
|
@@ -421,13 +429,16 @@ class SQLiteVecVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresPro
|
|
|
421
429
|
if vector_store_id in self.cache:
|
|
422
430
|
return self.cache[vector_store_id]
|
|
423
431
|
|
|
424
|
-
|
|
425
|
-
|
|
432
|
+
# Try to load from kvstore
|
|
433
|
+
if self.kvstore is None:
|
|
434
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before using vector stores.")
|
|
426
435
|
|
|
427
|
-
|
|
428
|
-
|
|
436
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store_id}"
|
|
437
|
+
vector_store_data = await self.kvstore.get(key)
|
|
438
|
+
if not vector_store_data:
|
|
429
439
|
raise VectorStoreNotFoundError(vector_store_id)
|
|
430
440
|
|
|
441
|
+
vector_store = VectorStore.model_validate_json(vector_store_data)
|
|
431
442
|
index = VectorStoreWithIndex(
|
|
432
443
|
vector_store=vector_store,
|
|
433
444
|
index=SQLiteVecIndex(
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
# This source code is licensed under the terms described in the LICENSE file in
|
|
5
5
|
# the root directory of this source tree.
|
|
6
6
|
|
|
7
|
+
from collections.abc import Iterable
|
|
7
8
|
|
|
8
9
|
import google.auth.transport.requests
|
|
9
10
|
from google.auth import default
|
|
@@ -42,3 +43,12 @@ class VertexAIInferenceAdapter(OpenAIMixin):
|
|
|
42
43
|
Source: https://cloud.google.com/vertex-ai/generative-ai/docs/start/openai
|
|
43
44
|
"""
|
|
44
45
|
return f"https://{self.config.location}-aiplatform.googleapis.com/v1/projects/{self.config.project}/locations/{self.config.location}/endpoints/openapi"
|
|
46
|
+
|
|
47
|
+
async def list_provider_model_ids(self) -> Iterable[str]:
|
|
48
|
+
"""
|
|
49
|
+
VertexAI doesn't currently offer a way to query a list of available models from Google's Model Garden
|
|
50
|
+
For now we return a hardcoded version of the available models
|
|
51
|
+
|
|
52
|
+
:return: An iterable of model IDs
|
|
53
|
+
"""
|
|
54
|
+
return ["google/gemini-2.0-flash", "google/gemini-2.5-flash", "google/gemini-2.5-pro"]
|
|
@@ -131,7 +131,6 @@ class ChromaVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProtoc
|
|
|
131
131
|
|
|
132
132
|
async def initialize(self) -> None:
|
|
133
133
|
self.kvstore = await kvstore_impl(self.config.persistence)
|
|
134
|
-
self.vector_store_table = self.kvstore
|
|
135
134
|
|
|
136
135
|
if isinstance(self.config, RemoteChromaVectorIOConfig):
|
|
137
136
|
log.info(f"Connecting to Chroma server at: {self.config.url}")
|
|
@@ -190,9 +189,16 @@ class ChromaVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProtoc
|
|
|
190
189
|
if vector_store_id in self.cache:
|
|
191
190
|
return self.cache[vector_store_id]
|
|
192
191
|
|
|
193
|
-
|
|
194
|
-
if
|
|
192
|
+
# Try to load from kvstore
|
|
193
|
+
if self.kvstore is None:
|
|
194
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before using vector stores.")
|
|
195
|
+
|
|
196
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store_id}"
|
|
197
|
+
vector_store_data = await self.kvstore.get(key)
|
|
198
|
+
if not vector_store_data:
|
|
195
199
|
raise ValueError(f"Vector DB {vector_store_id} not found in Llama Stack")
|
|
200
|
+
|
|
201
|
+
vector_store = VectorStore.model_validate_json(vector_store_data)
|
|
196
202
|
collection = await maybe_await(self.client.get_collection(vector_store_id))
|
|
197
203
|
if not collection:
|
|
198
204
|
raise ValueError(f"Vector DB {vector_store_id} not found in Chroma")
|
|
@@ -328,13 +328,16 @@ class MilvusVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProtoc
|
|
|
328
328
|
if vector_store_id in self.cache:
|
|
329
329
|
return self.cache[vector_store_id]
|
|
330
330
|
|
|
331
|
-
|
|
332
|
-
|
|
331
|
+
# Try to load from kvstore
|
|
332
|
+
if self.kvstore is None:
|
|
333
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before using vector stores.")
|
|
333
334
|
|
|
334
|
-
|
|
335
|
-
|
|
335
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store_id}"
|
|
336
|
+
vector_store_data = await self.kvstore.get(key)
|
|
337
|
+
if not vector_store_data:
|
|
336
338
|
raise VectorStoreNotFoundError(vector_store_id)
|
|
337
339
|
|
|
340
|
+
vector_store = VectorStore.model_validate_json(vector_store_data)
|
|
338
341
|
index = VectorStoreWithIndex(
|
|
339
342
|
vector_store=vector_store,
|
|
340
343
|
index=MilvusIndex(client=self.client, collection_name=vector_store.identifier, kvstore=self.kvstore),
|
|
@@ -368,6 +368,22 @@ class PGVectorVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProt
|
|
|
368
368
|
log.exception("Could not connect to PGVector database server")
|
|
369
369
|
raise RuntimeError("Could not connect to PGVector database server") from e
|
|
370
370
|
|
|
371
|
+
# Load existing vector stores from KV store into cache
|
|
372
|
+
start_key = VECTOR_DBS_PREFIX
|
|
373
|
+
end_key = f"{VECTOR_DBS_PREFIX}\xff"
|
|
374
|
+
stored_vector_stores = await self.kvstore.values_in_range(start_key, end_key)
|
|
375
|
+
for vector_store_data in stored_vector_stores:
|
|
376
|
+
vector_store = VectorStore.model_validate_json(vector_store_data)
|
|
377
|
+
pgvector_index = PGVectorIndex(
|
|
378
|
+
vector_store=vector_store,
|
|
379
|
+
dimension=vector_store.embedding_dimension,
|
|
380
|
+
conn=self.conn,
|
|
381
|
+
kvstore=self.kvstore,
|
|
382
|
+
)
|
|
383
|
+
await pgvector_index.initialize()
|
|
384
|
+
index = VectorStoreWithIndex(vector_store, index=pgvector_index, inference_api=self.inference_api)
|
|
385
|
+
self.cache[vector_store.identifier] = index
|
|
386
|
+
|
|
371
387
|
async def shutdown(self) -> None:
|
|
372
388
|
if self.conn is not None:
|
|
373
389
|
self.conn.close()
|
|
@@ -377,7 +393,13 @@ class PGVectorVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProt
|
|
|
377
393
|
|
|
378
394
|
async def register_vector_store(self, vector_store: VectorStore) -> None:
|
|
379
395
|
# Persist vector DB metadata in the KV store
|
|
380
|
-
|
|
396
|
+
if self.kvstore is None:
|
|
397
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before registering vector stores.")
|
|
398
|
+
|
|
399
|
+
# Save to kvstore for persistence
|
|
400
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store.identifier}"
|
|
401
|
+
await self.kvstore.set(key=key, value=vector_store.model_dump_json())
|
|
402
|
+
|
|
381
403
|
# Upsert model metadata in Postgres
|
|
382
404
|
upsert_models(self.conn, [(vector_store.identifier, vector_store)])
|
|
383
405
|
|
|
@@ -396,7 +418,8 @@ class PGVectorVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProt
|
|
|
396
418
|
del self.cache[vector_store_id]
|
|
397
419
|
|
|
398
420
|
# Delete vector DB metadata from KV store
|
|
399
|
-
|
|
421
|
+
if self.kvstore is None:
|
|
422
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before unregistering vector stores.")
|
|
400
423
|
await self.kvstore.delete(key=f"{VECTOR_DBS_PREFIX}{vector_store_id}")
|
|
401
424
|
|
|
402
425
|
async def insert_chunks(self, vector_db_id: str, chunks: list[Chunk], ttl_seconds: int | None = None) -> None:
|
|
@@ -413,13 +436,16 @@ class PGVectorVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProt
|
|
|
413
436
|
if vector_store_id in self.cache:
|
|
414
437
|
return self.cache[vector_store_id]
|
|
415
438
|
|
|
416
|
-
|
|
417
|
-
|
|
439
|
+
# Try to load from kvstore
|
|
440
|
+
if self.kvstore is None:
|
|
441
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before using vector stores.")
|
|
418
442
|
|
|
419
|
-
|
|
420
|
-
|
|
443
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store_id}"
|
|
444
|
+
vector_store_data = await self.kvstore.get(key)
|
|
445
|
+
if not vector_store_data:
|
|
421
446
|
raise VectorStoreNotFoundError(vector_store_id)
|
|
422
447
|
|
|
448
|
+
vector_store = VectorStore.model_validate_json(vector_store_data)
|
|
423
449
|
index = PGVectorIndex(vector_store, vector_store.embedding_dimension, self.conn)
|
|
424
450
|
await index.initialize()
|
|
425
451
|
self.cache[vector_store_id] = VectorStoreWithIndex(vector_store, index, self.inference_api)
|
|
@@ -183,7 +183,8 @@ class QdrantVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProtoc
|
|
|
183
183
|
await super().shutdown()
|
|
184
184
|
|
|
185
185
|
async def register_vector_store(self, vector_store: VectorStore) -> None:
|
|
186
|
-
|
|
186
|
+
if self.kvstore is None:
|
|
187
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before registering vector stores.")
|
|
187
188
|
key = f"{VECTOR_DBS_PREFIX}{vector_store.identifier}"
|
|
188
189
|
await self.kvstore.set(key=key, value=vector_store.model_dump_json())
|
|
189
190
|
|
|
@@ -200,20 +201,24 @@ class QdrantVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorStoresProtoc
|
|
|
200
201
|
await self.cache[vector_store_id].index.delete()
|
|
201
202
|
del self.cache[vector_store_id]
|
|
202
203
|
|
|
203
|
-
|
|
204
|
+
if self.kvstore is None:
|
|
205
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before using vector stores.")
|
|
204
206
|
await self.kvstore.delete(f"{VECTOR_DBS_PREFIX}{vector_store_id}")
|
|
205
207
|
|
|
206
208
|
async def _get_and_cache_vector_store_index(self, vector_store_id: str) -> VectorStoreWithIndex | None:
|
|
207
209
|
if vector_store_id in self.cache:
|
|
208
210
|
return self.cache[vector_store_id]
|
|
209
211
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
+
# Try to load from kvstore
|
|
213
|
+
if self.kvstore is None:
|
|
214
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before using vector stores.")
|
|
212
215
|
|
|
213
|
-
|
|
214
|
-
|
|
216
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store_id}"
|
|
217
|
+
vector_store_data = await self.kvstore.get(key)
|
|
218
|
+
if not vector_store_data:
|
|
215
219
|
raise VectorStoreNotFoundError(vector_store_id)
|
|
216
220
|
|
|
221
|
+
vector_store = VectorStore.model_validate_json(vector_store_data)
|
|
217
222
|
index = VectorStoreWithIndex(
|
|
218
223
|
vector_store=vector_store,
|
|
219
224
|
index=QdrantIndex(client=self.client, collection_name=vector_store.identifier),
|
|
@@ -346,13 +346,16 @@ class WeaviateVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, NeedsRequestProv
|
|
|
346
346
|
if vector_store_id in self.cache:
|
|
347
347
|
return self.cache[vector_store_id]
|
|
348
348
|
|
|
349
|
-
|
|
350
|
-
|
|
349
|
+
# Try to load from kvstore
|
|
350
|
+
if self.kvstore is None:
|
|
351
|
+
raise RuntimeError("KVStore not initialized. Call initialize() before using vector stores.")
|
|
351
352
|
|
|
352
|
-
|
|
353
|
-
|
|
353
|
+
key = f"{VECTOR_DBS_PREFIX}{vector_store_id}"
|
|
354
|
+
vector_store_data = await self.kvstore.get(key)
|
|
355
|
+
if not vector_store_data:
|
|
354
356
|
raise VectorStoreNotFoundError(vector_store_id)
|
|
355
357
|
|
|
358
|
+
vector_store = VectorStore.model_validate_json(vector_store_data)
|
|
356
359
|
client = self._get_client()
|
|
357
360
|
sanitized_collection_name = sanitize_collection_name(vector_store.identifier, weaviate_format=True)
|
|
358
361
|
if not client.collections.exists(sanitized_collection_name):
|
|
@@ -35,6 +35,7 @@ class InferenceStore:
|
|
|
35
35
|
self.reference = reference
|
|
36
36
|
self.sql_store = None
|
|
37
37
|
self.policy = policy
|
|
38
|
+
self.enable_write_queue = True
|
|
38
39
|
|
|
39
40
|
# Async write queue and worker control
|
|
40
41
|
self._queue: asyncio.Queue[tuple[OpenAIChatCompletion, list[OpenAIMessageParam]]] | None = None
|
|
@@ -47,14 +48,13 @@ class InferenceStore:
|
|
|
47
48
|
base_store = sqlstore_impl(self.reference)
|
|
48
49
|
self.sql_store = AuthorizedSqlStore(base_store, self.policy)
|
|
49
50
|
|
|
50
|
-
# Disable write queue for SQLite
|
|
51
|
-
|
|
52
|
-
backend_config = _SQLSTORE_BACKENDS.get(
|
|
53
|
-
if backend_config
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
self.enable_write_queue = backend_config.type != StorageBackendType.SQL_SQLITE
|
|
51
|
+
# Disable write queue for SQLite since WAL mode handles concurrency
|
|
52
|
+
# Keep it enabled for other backends (like Postgres) for performance
|
|
53
|
+
backend_config = _SQLSTORE_BACKENDS.get(self.reference.backend)
|
|
54
|
+
if backend_config and backend_config.type == StorageBackendType.SQL_SQLITE:
|
|
55
|
+
self.enable_write_queue = False
|
|
56
|
+
logger.debug("Write queue disabled for SQLite (WAL mode handles concurrency)")
|
|
57
|
+
|
|
58
58
|
await self.sql_store.create_table(
|
|
59
59
|
"chat_completions",
|
|
60
60
|
{
|
|
@@ -66,6 +66,14 @@ class InferenceStore:
|
|
|
66
66
|
},
|
|
67
67
|
)
|
|
68
68
|
|
|
69
|
+
if self.enable_write_queue:
|
|
70
|
+
self._queue = asyncio.Queue(maxsize=self._max_write_queue_size)
|
|
71
|
+
for _ in range(self._num_writers):
|
|
72
|
+
self._worker_tasks.append(asyncio.create_task(self._worker_loop()))
|
|
73
|
+
logger.debug(
|
|
74
|
+
f"Inference store write queue enabled with {self._num_writers} writers, max queue size {self._max_write_queue_size}"
|
|
75
|
+
)
|
|
76
|
+
|
|
69
77
|
async def shutdown(self) -> None:
|
|
70
78
|
if not self._worker_tasks:
|
|
71
79
|
return
|
|
@@ -20,7 +20,7 @@ logger = get_logger(name=__name__, category="providers::utils")
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class RemoteInferenceProviderConfig(BaseModel):
|
|
23
|
-
allowed_models: list[str] | None = Field(
|
|
23
|
+
allowed_models: list[str] | None = Field(
|
|
24
24
|
default=None,
|
|
25
25
|
description="List of models that should be registered with the model registry. If None, all models are allowed.",
|
|
26
26
|
)
|
|
@@ -82,9 +82,6 @@ class OpenAIMixin(NeedsRequestProviderData, ABC, BaseModel):
|
|
|
82
82
|
# This is set in list_models() and used in check_model_availability()
|
|
83
83
|
_model_cache: dict[str, Model] = {}
|
|
84
84
|
|
|
85
|
-
# List of allowed models for this provider, if empty all models allowed
|
|
86
|
-
allowed_models: list[str] = []
|
|
87
|
-
|
|
88
85
|
# Optional field name in provider data to look for API key, which takes precedence
|
|
89
86
|
provider_data_api_key_field: str | None = None
|
|
90
87
|
|
|
@@ -191,6 +188,19 @@ class OpenAIMixin(NeedsRequestProviderData, ABC, BaseModel):
|
|
|
191
188
|
|
|
192
189
|
return api_key
|
|
193
190
|
|
|
191
|
+
def _validate_model_allowed(self, provider_model_id: str) -> None:
|
|
192
|
+
"""
|
|
193
|
+
Validate that the model is in the allowed_models list if configured.
|
|
194
|
+
|
|
195
|
+
:param provider_model_id: The provider-specific model ID to validate
|
|
196
|
+
:raises ValueError: If the model is not in the allowed_models list
|
|
197
|
+
"""
|
|
198
|
+
if self.config.allowed_models is not None and provider_model_id not in self.config.allowed_models:
|
|
199
|
+
raise ValueError(
|
|
200
|
+
f"Model '{provider_model_id}' is not in the allowed models list. "
|
|
201
|
+
f"Allowed models: {self.config.allowed_models}"
|
|
202
|
+
)
|
|
203
|
+
|
|
194
204
|
async def _get_provider_model_id(self, model: str) -> str:
|
|
195
205
|
"""
|
|
196
206
|
Get the provider-specific model ID from the model store.
|
|
@@ -237,8 +247,11 @@ class OpenAIMixin(NeedsRequestProviderData, ABC, BaseModel):
|
|
|
237
247
|
Direct OpenAI completion API call.
|
|
238
248
|
"""
|
|
239
249
|
# TODO: fix openai_completion to return type compatible with OpenAI's API response
|
|
250
|
+
provider_model_id = await self._get_provider_model_id(params.model)
|
|
251
|
+
self._validate_model_allowed(provider_model_id)
|
|
252
|
+
|
|
240
253
|
completion_kwargs = await prepare_openai_completion_params(
|
|
241
|
-
model=
|
|
254
|
+
model=provider_model_id,
|
|
242
255
|
prompt=params.prompt,
|
|
243
256
|
best_of=params.best_of,
|
|
244
257
|
echo=params.echo,
|
|
@@ -270,6 +283,9 @@ class OpenAIMixin(NeedsRequestProviderData, ABC, BaseModel):
|
|
|
270
283
|
"""
|
|
271
284
|
Direct OpenAI chat completion API call.
|
|
272
285
|
"""
|
|
286
|
+
provider_model_id = await self._get_provider_model_id(params.model)
|
|
287
|
+
self._validate_model_allowed(provider_model_id)
|
|
288
|
+
|
|
273
289
|
messages = params.messages
|
|
274
290
|
|
|
275
291
|
if self.download_images:
|
|
@@ -291,7 +307,7 @@ class OpenAIMixin(NeedsRequestProviderData, ABC, BaseModel):
|
|
|
291
307
|
messages = [await _localize_image_url(m) for m in messages]
|
|
292
308
|
|
|
293
309
|
request_params = await prepare_openai_completion_params(
|
|
294
|
-
model=
|
|
310
|
+
model=provider_model_id,
|
|
295
311
|
messages=messages,
|
|
296
312
|
frequency_penalty=params.frequency_penalty,
|
|
297
313
|
function_call=params.function_call,
|
|
@@ -329,9 +345,13 @@ class OpenAIMixin(NeedsRequestProviderData, ABC, BaseModel):
|
|
|
329
345
|
"""
|
|
330
346
|
Direct OpenAI embeddings API call.
|
|
331
347
|
"""
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
348
|
+
provider_model_id = await self._get_provider_model_id(params.model)
|
|
349
|
+
self._validate_model_allowed(provider_model_id)
|
|
350
|
+
|
|
351
|
+
# Build request params conditionally to avoid NotGiven/Omit type mismatch
|
|
352
|
+
# The OpenAI SDK uses Omit in signatures but NOT_GIVEN has type NotGiven
|
|
353
|
+
request_params: dict[str, Any] = {
|
|
354
|
+
"model": provider_model_id,
|
|
335
355
|
"input": params.input,
|
|
336
356
|
"encoding_format": params.encoding_format if params.encoding_format is not None else NOT_GIVEN,
|
|
337
357
|
"dimensions": params.dimensions if params.dimensions is not None else NOT_GIVEN,
|
|
@@ -416,7 +436,7 @@ class OpenAIMixin(NeedsRequestProviderData, ABC, BaseModel):
|
|
|
416
436
|
for provider_model_id in provider_models_ids:
|
|
417
437
|
if not isinstance(provider_model_id, str):
|
|
418
438
|
raise ValueError(f"Model ID {provider_model_id} from list_provider_model_ids() is not a string")
|
|
419
|
-
if self.allowed_models and provider_model_id not in self.allowed_models:
|
|
439
|
+
if self.config.allowed_models is not None and provider_model_id not in self.config.allowed_models:
|
|
420
440
|
logger.info(f"Skipping model {provider_model_id} as it is not in the allowed models list")
|
|
421
441
|
continue
|
|
422
442
|
if metadata := self.embedding_model_metadata.get(provider_model_id):
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# This source code is licensed under the terms described in the LICENSE file in
|
|
5
5
|
# the root directory of this source tree.
|
|
6
|
+
import asyncio
|
|
6
7
|
|
|
7
8
|
from llama_stack.apis.agents import (
|
|
8
9
|
Order,
|
|
@@ -17,12 +18,12 @@ from llama_stack.apis.agents.openai_responses import (
|
|
|
17
18
|
)
|
|
18
19
|
from llama_stack.apis.inference import OpenAIMessageParam
|
|
19
20
|
from llama_stack.core.datatypes import AccessRule
|
|
20
|
-
from llama_stack.core.storage.datatypes import ResponsesStoreReference, SqlStoreReference
|
|
21
|
+
from llama_stack.core.storage.datatypes import ResponsesStoreReference, SqlStoreReference, StorageBackendType
|
|
21
22
|
from llama_stack.log import get_logger
|
|
22
23
|
|
|
23
24
|
from ..sqlstore.api import ColumnDefinition, ColumnType
|
|
24
25
|
from ..sqlstore.authorized_sqlstore import AuthorizedSqlStore
|
|
25
|
-
from ..sqlstore.sqlstore import sqlstore_impl
|
|
26
|
+
from ..sqlstore.sqlstore import _SQLSTORE_BACKENDS, sqlstore_impl
|
|
26
27
|
|
|
27
28
|
logger = get_logger(name=__name__, category="openai_responses")
|
|
28
29
|
|
|
@@ -59,6 +60,13 @@ class ResponsesStore:
|
|
|
59
60
|
base_store = sqlstore_impl(self.reference)
|
|
60
61
|
self.sql_store = AuthorizedSqlStore(base_store, self.policy)
|
|
61
62
|
|
|
63
|
+
# Disable write queue for SQLite since WAL mode handles concurrency
|
|
64
|
+
# Keep it enabled for other backends (like Postgres) for performance
|
|
65
|
+
backend_config = _SQLSTORE_BACKENDS.get(self.reference.backend)
|
|
66
|
+
if backend_config and backend_config.type == StorageBackendType.SQL_SQLITE:
|
|
67
|
+
self.enable_write_queue = False
|
|
68
|
+
logger.debug("Write queue disabled for SQLite (WAL mode handles concurrency)")
|
|
69
|
+
|
|
62
70
|
await self.sql_store.create_table(
|
|
63
71
|
"openai_responses",
|
|
64
72
|
{
|
|
@@ -77,6 +85,14 @@ class ResponsesStore:
|
|
|
77
85
|
},
|
|
78
86
|
)
|
|
79
87
|
|
|
88
|
+
if self.enable_write_queue:
|
|
89
|
+
self._queue = asyncio.Queue(maxsize=self._max_write_queue_size)
|
|
90
|
+
for _ in range(self._num_writers):
|
|
91
|
+
self._worker_tasks.append(asyncio.create_task(self._worker_loop()))
|
|
92
|
+
logger.debug(
|
|
93
|
+
f"Responses store write queue enabled with {self._num_writers} writers, max queue size {self._max_write_queue_size}"
|
|
94
|
+
)
|
|
95
|
+
|
|
80
96
|
async def shutdown(self) -> None:
|
|
81
97
|
return
|
|
82
98
|
|
|
@@ -17,6 +17,7 @@ from sqlalchemy import (
|
|
|
17
17
|
String,
|
|
18
18
|
Table,
|
|
19
19
|
Text,
|
|
20
|
+
event,
|
|
20
21
|
inspect,
|
|
21
22
|
select,
|
|
22
23
|
text,
|
|
@@ -75,7 +76,36 @@ class SqlAlchemySqlStoreImpl(SqlStore):
|
|
|
75
76
|
self.metadata = MetaData()
|
|
76
77
|
|
|
77
78
|
def create_engine(self) -> AsyncEngine:
|
|
78
|
-
|
|
79
|
+
# Configure connection args for better concurrency support
|
|
80
|
+
connect_args = {}
|
|
81
|
+
if "sqlite" in self.config.engine_str:
|
|
82
|
+
# SQLite-specific optimizations for concurrent access
|
|
83
|
+
# With WAL mode, most locks resolve in milliseconds, but allow up to 5s for edge cases
|
|
84
|
+
connect_args["timeout"] = 5.0
|
|
85
|
+
connect_args["check_same_thread"] = False # Allow usage across asyncio tasks
|
|
86
|
+
|
|
87
|
+
engine = create_async_engine(
|
|
88
|
+
self.config.engine_str,
|
|
89
|
+
pool_pre_ping=True,
|
|
90
|
+
connect_args=connect_args,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
# Enable WAL mode for SQLite to support concurrent readers and writers
|
|
94
|
+
if "sqlite" in self.config.engine_str:
|
|
95
|
+
|
|
96
|
+
@event.listens_for(engine.sync_engine, "connect")
|
|
97
|
+
def set_sqlite_pragma(dbapi_conn, connection_record):
|
|
98
|
+
cursor = dbapi_conn.cursor()
|
|
99
|
+
# Enable Write-Ahead Logging for better concurrency
|
|
100
|
+
cursor.execute("PRAGMA journal_mode=WAL")
|
|
101
|
+
# Set busy timeout to 5 seconds (retry instead of immediate failure)
|
|
102
|
+
# With WAL mode, locks should be brief; if we hit 5s there's a bigger issue
|
|
103
|
+
cursor.execute("PRAGMA busy_timeout=5000")
|
|
104
|
+
# Use NORMAL synchronous mode for better performance (still safe with WAL)
|
|
105
|
+
cursor.execute("PRAGMA synchronous=NORMAL")
|
|
106
|
+
cursor.close()
|
|
107
|
+
|
|
108
|
+
return engine
|
|
79
109
|
|
|
80
110
|
async def create_table(
|
|
81
111
|
self,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: llama_stack
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Llama Stack
|
|
5
5
|
Author-email: Meta Llama <llama-oss@meta.com>
|
|
6
6
|
License: MIT
|
|
@@ -22,7 +22,7 @@ Requires-Dist: fire
|
|
|
22
22
|
Requires-Dist: httpx
|
|
23
23
|
Requires-Dist: jinja2>=3.1.6
|
|
24
24
|
Requires-Dist: jsonschema
|
|
25
|
-
Requires-Dist: llama-stack-client>=0.3.
|
|
25
|
+
Requires-Dist: llama-stack-client>=0.3.3
|
|
26
26
|
Requires-Dist: openai>=1.107
|
|
27
27
|
Requires-Dist: prompt-toolkit
|
|
28
28
|
Requires-Dist: python-dotenv
|
|
@@ -44,7 +44,7 @@ Requires-Dist: sqlalchemy[asyncio]>=2.0.41
|
|
|
44
44
|
Provides-Extra: ui
|
|
45
45
|
Requires-Dist: streamlit; extra == "ui"
|
|
46
46
|
Requires-Dist: pandas; extra == "ui"
|
|
47
|
-
Requires-Dist: llama-stack-client>=0.3.
|
|
47
|
+
Requires-Dist: llama-stack-client>=0.3.3; extra == "ui"
|
|
48
48
|
Requires-Dist: streamlit-option-menu; extra == "ui"
|
|
49
49
|
Dynamic: license-file
|
|
50
50
|
|
|
@@ -394,14 +394,14 @@ llama_stack/providers/inline/vector_io/chroma/__init__.py,sha256=7zeAups-Y1Uowud
|
|
|
394
394
|
llama_stack/providers/inline/vector_io/chroma/config.py,sha256=xRSJPOF9aMKBDIdIUFCfvOeq4qCQmbXae2s68vojoS0,934
|
|
395
395
|
llama_stack/providers/inline/vector_io/faiss/__init__.py,sha256=rwB9SaZR6i5WwFCypC58EFJI3ii3hOkpXmHS4CPD6lc,662
|
|
396
396
|
llama_stack/providers/inline/vector_io/faiss/config.py,sha256=3cgZiUAxULaU0qnhhl-DAWU0KjND3g9TdZvdycDU4zI,771
|
|
397
|
-
llama_stack/providers/inline/vector_io/faiss/faiss.py,sha256=
|
|
397
|
+
llama_stack/providers/inline/vector_io/faiss/faiss.py,sha256=rATsfuSOzWOqBydYMkBUH0Pa7-jmrwHSST-T1Fl7HxU,12396
|
|
398
398
|
llama_stack/providers/inline/vector_io/milvus/__init__.py,sha256=fHR2w5MvA-qZsVD2OE88mkgLL8yvuu6TuKmWNLYMA6o,617
|
|
399
399
|
llama_stack/providers/inline/vector_io/milvus/config.py,sha256=yO8gS6lNLTqJwUHRzKRybX77KC7ndZ9eHI7iYU8U0UY,1069
|
|
400
400
|
llama_stack/providers/inline/vector_io/qdrant/__init__.py,sha256=De9BAorlOtcgWNgR97_LVvtzQRxJc-Jp1l79qNsnt6w,712
|
|
401
401
|
llama_stack/providers/inline/vector_io/qdrant/config.py,sha256=xjOI1dHMT_aL-5J7tF4Lczva5UHvfja7wMOWRdbr8Qc,864
|
|
402
402
|
llama_stack/providers/inline/vector_io/sqlite_vec/__init__.py,sha256=_gP1I0fHxY3fdmPkr_FqMbjSfhDOfCpxj2rbhDSwQpM,677
|
|
403
403
|
llama_stack/providers/inline/vector_io/sqlite_vec/config.py,sha256=zwHR-7oXMSbTnXeO2pJ1BmXWGL9NBkQ76A5Wb3fjqZQ,937
|
|
404
|
-
llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py,sha256=
|
|
404
|
+
llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py,sha256=jhBqfQI4E4EqijQR-2-f99YDQ4WENqHrkgoRirsVhd0,20511
|
|
405
405
|
llama_stack/providers/registry/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
|
|
406
406
|
llama_stack/providers/registry/agents.py,sha256=brI3222FyMoFtN4ooWJsoqMRNK9s0L87xkBISqrd2I8,1416
|
|
407
407
|
llama_stack/providers/registry/batches.py,sha256=KElTpHCiLl4J7pa5BOkVYNK7woC9JB96JU0IcEjpdHI,901
|
|
@@ -486,7 +486,7 @@ llama_stack/providers/remote/inference/together/config.py,sha256=sefPbjy538oUbgw
|
|
|
486
486
|
llama_stack/providers/remote/inference/together/together.py,sha256=V7M-0lzT3kGhEfhPYL2UNj97zNL9yk0D69jyevXrFHs,4477
|
|
487
487
|
llama_stack/providers/remote/inference/vertexai/__init__.py,sha256=Bq5thvFjeShxdr8I1fZRJRCv3wKAX48qGknQ4j57gyY,444
|
|
488
488
|
llama_stack/providers/remote/inference/vertexai/config.py,sha256=sHmX8pAg8UTUgwyF2K9W2oXdYOfSALREV3v48sGTsLU,1428
|
|
489
|
-
llama_stack/providers/remote/inference/vertexai/vertexai.py,sha256=
|
|
489
|
+
llama_stack/providers/remote/inference/vertexai/vertexai.py,sha256=BEI_qWMK6COirXuGld6nHHY12gtuVa7UQ-Jlp76MBQo,2161
|
|
490
490
|
llama_stack/providers/remote/inference/vllm/__init__.py,sha256=xoVNaQvqBOiKxiCc-iHI1fYTyAcZvRKizYBtBjIwPi8,673
|
|
491
491
|
llama_stack/providers/remote/inference/vllm/config.py,sha256=qN_djLcdnmknwLnLSYTW9r9TNAb1MYMHNHmGM05wtAc,1917
|
|
492
492
|
llama_stack/providers/remote/inference/vllm/vllm.py,sha256=0IfNDNtLXuYDTsp29b9hM1zTfJoqH-QRjCg_w0NpDbg,4101
|
|
@@ -527,20 +527,20 @@ llama_stack/providers/remote/tool_runtime/wolfram_alpha/config.py,sha256=RK12PdV
|
|
|
527
527
|
llama_stack/providers/remote/tool_runtime/wolfram_alpha/wolfram_alpha.py,sha256=-9hb_2Z2dkTYARg8G267GDHZ4BbYkXhbAz1w-t3r9aY,5182
|
|
528
528
|
llama_stack/providers/remote/vector_io/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
|
|
529
529
|
llama_stack/providers/remote/vector_io/chroma/__init__.py,sha256=t9lO66Cr_8tdhswtvbSnSZR2nFB2C23LyDxuPqQe6_c,570
|
|
530
|
-
llama_stack/providers/remote/vector_io/chroma/chroma.py,sha256=
|
|
530
|
+
llama_stack/providers/remote/vector_io/chroma/chroma.py,sha256=958kw8apWWZpOjXA-hxVorfonrDvzYowVU9w9dzx7LI,9010
|
|
531
531
|
llama_stack/providers/remote/vector_io/chroma/config.py,sha256=T9PnQRzfPQR8VR1XDMXZedhh5EFLsEKUyF6sFEDoJ7w,917
|
|
532
532
|
llama_stack/providers/remote/vector_io/milvus/__init__.py,sha256=XLdJvLapmiKt_nkzrhpFLGP-toMsMiGrZ79-ZuYETvM,665
|
|
533
533
|
llama_stack/providers/remote/vector_io/milvus/config.py,sha256=lpr1Dc1R7870A9LKlNpu7sAoA9c_iZXgbiuDFFJ3d8M,1465
|
|
534
|
-
llama_stack/providers/remote/vector_io/milvus/milvus.py,sha256=
|
|
534
|
+
llama_stack/providers/remote/vector_io/milvus/milvus.py,sha256=j8dH3MfPWId6xVUvW1xoEGnGA4i7tNKzaUX2tnzMQOY,16490
|
|
535
535
|
llama_stack/providers/remote/vector_io/pgvector/__init__.py,sha256=yzHD7-1O7NAf3YUy1ShDN_LdDKvvZaJDhaCq-FtTZUw,580
|
|
536
536
|
llama_stack/providers/remote/vector_io/pgvector/config.py,sha256=IrZQt43N3Q7YpQHMN3jERw2i3FSnON_SmQi0Q2O1rFI,1549
|
|
537
|
-
llama_stack/providers/remote/vector_io/pgvector/pgvector.py,sha256=
|
|
537
|
+
llama_stack/providers/remote/vector_io/pgvector/pgvector.py,sha256=FDpmCb3QLvPpbXryE1xdEdW6YcTRaa-xovcRKIDslVo,19485
|
|
538
538
|
llama_stack/providers/remote/vector_io/qdrant/__init__.py,sha256=hZfyksxpFotJlJ5mre5iT_ohnGkG7uwsv_QFOscALgw,570
|
|
539
539
|
llama_stack/providers/remote/vector_io/qdrant/config.py,sha256=njL6MbyUd_fUM0PfzOeWeRLN4dKazYPAqSrZMvDk598,1124
|
|
540
|
-
llama_stack/providers/remote/vector_io/qdrant/qdrant.py,sha256=
|
|
540
|
+
llama_stack/providers/remote/vector_io/qdrant/qdrant.py,sha256=WNWutg1aFE__xOqBKzF0H5IJvyub-1xTwJAI863dWcs,10761
|
|
541
541
|
llama_stack/providers/remote/vector_io/weaviate/__init__.py,sha256=RPJQ2JlcxGnaUkjfR1V7UimQPgE76WNQ-SbfTZLjylE,580
|
|
542
542
|
llama_stack/providers/remote/vector_io/weaviate/config.py,sha256=Ghy6LEx2aQ8KyXv97F0ZXOClAKt0gNTenucP_JLuGqM,1240
|
|
543
|
-
llama_stack/providers/remote/vector_io/weaviate/weaviate.py,sha256
|
|
543
|
+
llama_stack/providers/remote/vector_io/weaviate/weaviate.py,sha256=oC0O4rI4s6Y53MFOQ5YpbJ1eJwiTyy9htfCHvwq7X1M,17419
|
|
544
544
|
llama_stack/providers/utils/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
|
|
545
545
|
llama_stack/providers/utils/pagination.py,sha256=Racj4zXqi19AQlA2FkVhcyzueNd9s7MTy0Fc0FZjNQc,1409
|
|
546
546
|
llama_stack/providers/utils/scheduler.py,sha256=kP6lR0KPsYnd_mtwInuqegNqTSylZ09WiDQfiDyaX2k,8473
|
|
@@ -556,11 +556,11 @@ llama_stack/providers/utils/files/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8us
|
|
|
556
556
|
llama_stack/providers/utils/files/form_data.py,sha256=oLDS9gsOWpUnqX51qczjNGTfHJBrZ0SFZbEHFtsfqCs,2291
|
|
557
557
|
llama_stack/providers/utils/inference/__init__.py,sha256=Ocwqyn7ytwdt1vMFXsPBoa5D6uhA1fIljF-HiIsVvKw,1089
|
|
558
558
|
llama_stack/providers/utils/inference/embedding_mixin.py,sha256=Ur9A0VJB0BEDh00Er8Ua-Mc08Sa69YAQW_cCcAdxB88,3336
|
|
559
|
-
llama_stack/providers/utils/inference/inference_store.py,sha256=
|
|
559
|
+
llama_stack/providers/utils/inference/inference_store.py,sha256=zNscOx7uiIspV8UoAdSlciWvupOWrLDBEtoros5tlpk,10273
|
|
560
560
|
llama_stack/providers/utils/inference/litellm_openai_mixin.py,sha256=tcRCccOd4fR61TIQjFGb-B6Qybu5q-pklK5fo87Ji3I,13094
|
|
561
|
-
llama_stack/providers/utils/inference/model_registry.py,sha256=
|
|
561
|
+
llama_stack/providers/utils/inference/model_registry.py,sha256=ElaDfW67XphDvVLYBBghwSB-2A704ELqpJpm42Hdpc8,8250
|
|
562
562
|
llama_stack/providers/utils/inference/openai_compat.py,sha256=kTjea5GUmaD8UfA6UgoPD8wvmWNBnAwuWLkmNUwy-as,49768
|
|
563
|
-
llama_stack/providers/utils/inference/openai_mixin.py,sha256=
|
|
563
|
+
llama_stack/providers/utils/inference/openai_mixin.py,sha256=WFRSrrtah3P_eDMJiA2fW_vGSEkl5I12p6SYfWdDB6U,20839
|
|
564
564
|
llama_stack/providers/utils/inference/prompt_adapter.py,sha256=fSP6G79BSyO32UHUY19x7kdypNXPIZP_nOX6DW7oAQA,17890
|
|
565
565
|
llama_stack/providers/utils/kvstore/__init__.py,sha256=GUuUhxrSBkRqNRORwBvoiBJfg6YDgg1cAaH4G35iY4Y,244
|
|
566
566
|
llama_stack/providers/utils/kvstore/api.py,sha256=v89kXHvy4vBoK9xIjyJDJuNOS0RTWTV4U8W8VX3YxYs,707
|
|
@@ -580,7 +580,7 @@ llama_stack/providers/utils/memory/file_utils.py,sha256=1Lz7FTR4eV1OYPgD3oABRCho
|
|
|
580
580
|
llama_stack/providers/utils/memory/openai_vector_store_mixin.py,sha256=XbmaUW7srqYbx1UZGn8h0NjCe3o9j_afeG-sdrYYaME,53335
|
|
581
581
|
llama_stack/providers/utils/memory/vector_store.py,sha256=bAnoHLa68Z9Zsaufpovkwb5wlAvoyXVHRG33gvTcjls,12023
|
|
582
582
|
llama_stack/providers/utils/responses/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
|
|
583
|
-
llama_stack/providers/utils/responses/responses_store.py,sha256=
|
|
583
|
+
llama_stack/providers/utils/responses/responses_store.py,sha256=cJF93RVEyeGvd7-YJK9HK9NpfkcWzZ507bEK0D9Z8XI,11651
|
|
584
584
|
llama_stack/providers/utils/scoring/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
|
|
585
585
|
llama_stack/providers/utils/scoring/aggregation_utils.py,sha256=vNtkQbyEg71tWLCwibOHJyNGHqk5GBNB6uSMnlDaqJs,2775
|
|
586
586
|
llama_stack/providers/utils/scoring/base_scoring_fn.py,sha256=q4KZZxU1TVBKO21bTcO5bnXu2LuzjjYzQZ492i_DfhA,4153
|
|
@@ -588,7 +588,7 @@ llama_stack/providers/utils/scoring/basic_scoring_utils.py,sha256=JmGA65N55raHR7
|
|
|
588
588
|
llama_stack/providers/utils/sqlstore/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
|
|
589
589
|
llama_stack/providers/utils/sqlstore/api.py,sha256=qhhfUWQ1erK9Bo5ocoFOuHgRAlOwi_8uh2wuvrqBbX8,3738
|
|
590
590
|
llama_stack/providers/utils/sqlstore/authorized_sqlstore.py,sha256=GJ8T-wg_tkc2tITC6ne0X0Kfqc0pHbs9dDcHNMbkueE,14143
|
|
591
|
-
llama_stack/providers/utils/sqlstore/sqlalchemy_sqlstore.py,sha256=
|
|
591
|
+
llama_stack/providers/utils/sqlstore/sqlalchemy_sqlstore.py,sha256=o-D-34JmuX5LR8lj_UV4TkgtqG7ivH8qLhEZeSSeQTk,13491
|
|
592
592
|
llama_stack/providers/utils/sqlstore/sqlstore.py,sha256=o9o4kSSYgQQ1g1zfuPNYb1_f6x_knhniHG6xwG-VgNQ,2360
|
|
593
593
|
llama_stack/providers/utils/telemetry/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
|
|
594
594
|
llama_stack/providers/utils/telemetry/trace_protocol.py,sha256=VjTZ40NWQLdUfZuU07rtaLFn6wU9guuXAP62WkBd1Ws,5277
|
|
@@ -617,9 +617,9 @@ llama_stack/strong_typing/topological.py,sha256=I2YyhYW62PBM2wpfn6mbeCRxKGl_oa5t
|
|
|
617
617
|
llama_stack/testing/__init__.py,sha256=vUvqRS2CXhASaFzYVspRYa5q8usSCzjKUlZhzNLuiKg,200
|
|
618
618
|
llama_stack/testing/api_recorder.py,sha256=jt5Fq8HOPTA4rDzwIWWdBQJjxtivhbqoghFql3D--A0,38423
|
|
619
619
|
llama_stack/ui/node_modules/flatted/python/flatted.py,sha256=UYburBDqkySaTfSpntPCUJRxiBGcplusJM7ECX8FEgA,3860
|
|
620
|
-
llama_stack-0.3.
|
|
621
|
-
llama_stack-0.3.
|
|
622
|
-
llama_stack-0.3.
|
|
623
|
-
llama_stack-0.3.
|
|
624
|
-
llama_stack-0.3.
|
|
625
|
-
llama_stack-0.3.
|
|
620
|
+
llama_stack-0.3.3.dist-info/licenses/LICENSE,sha256=42g1gBn9gHYdBt5e6e1aFYhnc-JT9trU9qBD84oUAlY,1087
|
|
621
|
+
llama_stack-0.3.3.dist-info/METADATA,sha256=-2v1yFVpGA-OAXZICSSE1aB-XqIRLEDoPD2w6AHSsUI,15124
|
|
622
|
+
llama_stack-0.3.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
623
|
+
llama_stack-0.3.3.dist-info/entry_points.txt,sha256=E5xoyAM9064aW_y96eSSwZCNT_ANctrvrhLMJnMQlw0,141
|
|
624
|
+
llama_stack-0.3.3.dist-info/top_level.txt,sha256=2-nbQ1CAn4_w76YD_O6N6ofvjmk4DX5NFaBuApSx5N0,12
|
|
625
|
+
llama_stack-0.3.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|