I agree with you @firmansi
the problem is there are 2 topics discussed in this thread :
- Topic #1: Packaging of librechat
- Topic #2: How to build an AI agent to automate the process of packaging Cloudron app
I think that lead to our misunderstanding
I agree with you @firmansi
the problem is there are 2 topics discussed in this thread :
I think that lead to our misunderstanding
We should split in 2 different thread
Yes Librechat needs RAG API to have all its feature
No a cloudron packaging agent does not need a RAG knowledge bases to be efficient (I think)
Those are 2 totally different subjects
I think building a RAG-like knowledge base is not the best approach for this use case.
It would be much mode efficient an agent with
The process is complex but quite straightforward and I see no need for a RAG knowledge base
Hi @LoudLemur
Thanks
For those who want to dig "AI assisted packaging", here is how I proceeded
I did this in 2024. This could be largely improved in 2025 with more agentic behaviour to let the AI fetch the context it needs
I don't know, didn't try to reproduce on last versions
@canadaduane
Yes no problem
Hi @canadaduane
I think I did have a working app at the end but not 100% features. And then I didn't had time (and interest) to finish the setup
If somebody is interested I can share my past work but I guess litellm have change quite a bit since
So it seem the environment variable is not required.
My mistake, it actually seem to enable the feature. Let me check
Hi @nebulon
No it does not.
This allows to make public URLs
AUTH_ROLE_PUBLIC = 'Public'
PUBLIC_ROLE_LIKE = 'Gamma'
FEATURE_FLAGS = {
'DASHBOARD_RBAC': True
}
But it does not permits to use the embed sdk
https://www.npmjs.com/package/@superset-ui/embedded-sdk
The embed SDK references a EMBEDDED_SUPERSET
feature flag but the Superset documentation references a SUPERSET_FEATURE_EMBEDDED_SUPERSET=true
environment variable
I guess Superset docs is more accurate because I did try the feature flag and it does not activate the embed feature.
Based on the documentation, the "embedded mode" require to add an environment variable:
https://superset.apache.org/docs/configuration/networking-settings/#enabling-embedding-via-the-sdk
SUPERSET_FEATURE_EMBEDDED_SUPERSET=true
I found other sources online speaking of a config.py parameter, but this approach seems outdated and is not mentioned in the docs:
https://medium.com/@nandwalritik/embed-superset-dashboard-react-843b0a60a31f
FEATURE_FLAGS = {
# Paste this along with other feature flag options
"EMBEDDED_SUPERSET": True,
}
Unfortunately, env.sh is located in /app/pkg
and is read-only
https://git.cloudron.io/packages/superset-app/-/blob/main/start.sh?ref_type=heads#L17
Could you change the packaging in order to be able to configure the environment variables ?
Could be related to this post
https://forum.cloudron.io/topic/12830/superset-public-access/5
Hi @girish
Any news on this matter. I had the same issue yesterday and had to use your workaround to restore a backup
However, if this is an import UI issue, that means it is maybe also impossible to set up a new GCP backup ?
Could you adress this issue ?
Since recent update, I can't any more create new posts from HTML with API.
Did something change in the package ?
@girish I confirm after update id works
@joseph Sorry it was a bit rough but in short
Workaround :
Use SQLalchemy URI
I think the issue is that there is no /root/.postgresql/postgresql.crt
inside the container app
This error occurs with default engine (psycopg2)
(psycopg2.OperationalError) connection to server at "**********" (151.80.10.***), port 5432 failed: could not open certificate file "/root/.postgresql/postgresql.crt": Permission denied
(Background on this error at: https://sqlalche.me/e/14/e3q8)
I think it is a cloudron app issue
You can workaround using sqlalchemy.
Wow thanks @nebulon . I think it would have been necessary one day or another with the current AI hype.
By the way I'd be glad to share my "cloudron packaging prompt engineering" techniques some when. I'll make a second try with another app, I am thinking appsmith
Hmm I tried a sed and could create a vectors
extension instead of vector
But then it cascaded to more errors. And with the different abstraction layers (langchain, sqlalchemy...) I couln't solve the issue.
I think current implementation tries to ceate a table with a VECTOR type anv vecto.rs expects VECTOR(dimension) (or is maybe not loaded properly)
The above exception was the direct cause of the following exception:
Nov 27 16:17:11 2024-11-27T15:17:11Z
Nov 27 16:17:11 Traceback (most recent call last):
Nov 27 16:17:11 File "/app/code/rag_api/main.py", line 46, in <module>
Nov 27 16:17:11 from psql import PSQLDatabase, ensure_custom_id_index_on_embedding, pg_health_check
Nov 27 16:17:11 File "/app/code/rag_api/psql.py", line 3, in <module>
Nov 27 16:17:11 from config import DSN, logger
Nov 27 16:17:11 File "/app/code/rag_api/config.py", line 232, in <module>
Nov 27 16:17:11 vector_store = get_vector_store(
Nov 27 16:17:11 File "/app/code/rag_api/store_factory.py", line 20, in get_vector_store
Nov 27 16:17:11 return AsyncPgVector(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/langchain_core/_api/deprecation.py", line 183, in warn_if_direct_instance
Nov 27 16:17:11 return wrapped(self, *args, **kwargs)
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/langchain_community/vectorstores/pgvector.py", line 341, in __init__
Nov 27 16:17:11 self.__post_init__()
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/langchain_community/vectorstores/pgvector.py", line 355, in __post_init__
Nov 27 16:17:11 self.create_tables_if_not_exists()
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/langchain_community/vectorstores/pgvector.py", line 390, in create_tables_if_not_exists
Nov 27 16:17:11 Base.metadata.create_all(session.get_bind())
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/sql/schema.py", line 5825, in create_all
Nov 27 16:17:11 bind._run_ddl_visitor(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 3254, in _run_ddl_visitor
Nov 27 16:17:11 conn._run_ddl_visitor(visitorcallable, element, **kwargs)
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 2460, in _run_ddl_visitor
Nov 27 16:17:11 visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/sql/visitors.py", line 664, in traverse_single
Nov 27 16:17:11 return meth(obj, **kw)
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/sql/ddl.py", line 918, in visit_metadata
Nov 27 16:17:11 self.traverse_single(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/sql/visitors.py", line 664, in traverse_single
Nov 27 16:17:11 return meth(obj, **kw)
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/sql/ddl.py", line 956, in visit_table
Nov 27 16:17:11 )._invoke_with(self.connection)
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/sql/ddl.py", line 314, in _invoke_with
Nov 27 16:17:11 return bind.execute(self)
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 1421, in execute
Nov 27 16:17:11 return meth(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/sql/ddl.py", line 180, in _execute_on_connection
Nov 27 16:17:11 return connection._execute_ddl(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 1532, in _execute_ddl
Nov 27 16:17:11 ret = self._execute_context(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 1849, in _execute_context
Nov 27 16:17:11 return self._exec_single_context(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 1989, in _exec_single_context
Nov 27 16:17:11 self._handle_dbapi_exception(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 2356, in _handle_dbapi_exception
Nov 27 16:17:11 raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 1970, in _exec_single_context
Nov 27 16:17:11 self.dialect.do_execute(
Nov 27 16:17:11 File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/default.py", line 924, in do_execute
Nov 27 16:17:11 cursor.execute(statement, parameters)
Nov 27 16:17:11 sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedObject) type "vector" does not exist
Nov 27 16:17:11 LINE 4: embedding VECTOR,
Nov 27 16:17:11 ^
Nov 27 16:17:11 2024-11-27T15:17:11Z
Nov 27 16:17:11 [SQL:
Nov 27 16:17:11 CREATE TABLE langchain_pg_embedding (
Nov 27 16:17:11 collection_id UUID,
Nov 27 16:17:11 embedding VECTOR,
Nov 27 16:17:11 document VARCHAR,
Nov 27 16:17:11 cmetadata JSON,
Nov 27 16:17:11 custom_id VARCHAR,
Nov 27 16:17:11 uuid UUID NOT NULL,
Nov 27 16:17:11 PRIMARY KEY (uuid),
Nov 27 16:17:11 FOREIGN KEY(collection_id) REFERENCES langchain_pg_collection (uuid) ON DELETE CASCADE
Nov 27 16:17:11 )
Thanks for the response @nebulon
I could fix my start.sh
however, the vector extension is then expected by the app code
[SQL: BEGIN;SELECT pg_advisory_xact_lock(1573678846307946496);CREATE EXTENSION IF NOT EXISTS vector;COMMIT;]
Nov 27 11:31:05 (Background on this error at: https://sqlalche.me/e/20/e3q8)
Nov 27 11:31:05 2024-11-27T10:31:05Z
Nov 27 11:31:05 The above exception was the direct cause of the following exception:
Nov 27 11:31:05 2024-11-27T10:31:05Z
Nov 27 11:31:05 Traceback (most recent call last):
Nov 27 11:31:05 File "/app/code/rag_api/main.py", line 46, in <module>
Nov 27 11:31:05 from psql import PSQLDatabase, ensure_custom_id_index_on_embedding, pg_health_check
Nov 27 11:31:05 File "/app/code/rag_api/psql.py", line 3, in <module>
Nov 27 11:31:05 from config import DSN, logger
Nov 27 11:31:05 File "/app/code/rag_api/config.py", line 232, in <module>
Nov 27 11:31:05 vector_store = get_vector_store(
Nov 27 11:31:05 File "/app/code/rag_api/store_factory.py", line 20, in get_vector_store
Nov 27 11:31:05 return AsyncPgVector(
Nov 27 11:31:05 File "/usr/local/lib/python3.10/dist-packages/langchain_core/_api/deprecation.py", line 183, in warn_if_direct_instance
Nov 27 11:31:05 return wrapped(self, *args, **kwargs)
Nov 27 11:31:05 File "/usr/local/lib/python3.10/dist-packages/langchain_community/vectorstores/pgvector.py", line 341, in __init__
Nov 27 11:31:05 self.__post_init__()
Nov 27 11:31:05 File "/usr/local/lib/python3.10/dist-packages/langchain_community/vectorstores/pgvector.py", line 348, in __post_init__
Nov 27 11:31:05 self.create_vector_extension()
Nov 27 11:31:05 File "/usr/local/lib/python3.10/dist-packages/langchain_community/vectorstores/pgvector.py", line 386, in create_vector_extension
Nov 27 11:31:05 raise Exception(f"Failed to create vector extension: {e}") from e
Nov 27 11:31:05 Exception: Failed to create vector extension: (psycopg2.errors.UndefinedFile) could not open extension control file "/usr/share/postgresql/14/extension/vector.control": No such file or directory
And this seems to come directly from Langchain code. I didn't know this interesting verto.rs alternative, however the normal "pgvector" seems more broadly used. Could we have both alternative on Cloudron ? Or maybe a symlink if pgvecto.rs is compatible with classic pgvector ?