Add your description here
Project description
Xecai - Cross compatible and extendable AI interface
Develop code for different LLMs and AI services, change very few lines. Easily customise the behaviour so that it fits your requirements.
This library is currently focused on RAG purposes, no Agent implementation (this may change in the future).
Examples
Chat interface
from chat.implementations.openai.openai_chat import OpenAIChat
messages = [Message(content="what model are you?", message_type=MessageType.USER)]
prompt = "you are a helpful bot"
model = "gpt-4o"
chat = OpenAIChat()
chat.check_model(model)
response, stats = chat.invoke(model, prompt, messages)
print(response)
for text, stats in chat.stream(model, prompt, messages):
if text:
print(text, end="", flush=True)
VectorDB interface
from vector_db.implementations.postgresql.postgresql_vector_db import PostgreSQLVectorDB
from embeddings.implementations.openai.openai_embedding import OpenAIEmbedding
from models import SearchType
vector_db = PostgreSQLVectorDB(
embedding_interface=OpenAIEmbedding(), embedding_model="text-embedding-3-small"
)
chunks = vector_db.sync_retrieve(
query="this is an example query",
k=3,
search_type=SearchType.HYBRID,
)
print(chunks)
Memory interface
from memory.implementations.postgresql.postgresql_memory import PostgreSQLMemory
from models import Conversation, Message, MessageType
memory = PostgreSQLMemory()
conversation = memory.sync_get_conversation("example_conversation_id") else Conversation()
print(conversation)
conversation.messages.append(Message(message_type=MessageType.USER, content="example query"))
memory.sync_save_conversation(conversation)
Typical rag workflow
graph TD
%% Refined Palette with Intense Cherry and Ink Black
%% Outlines perfectly hidden by matching stroke to fill color
classDef input fill:#0074D9,stroke:#0074D9,color:#FFFFFF,font-weight:bold,rx:8,ry:8;
classDef process fill:#003366,stroke:#003366,color:#FFFFFF,rx:8,ry:8;
classDef condition fill:#FF851B,stroke:#FF851B,color:#FFFFFF,font-weight:bold,rx:8,ry:8;
%% Lighter Grey for the output node
classDef output fill:#F8FAFC,stroke:#F8FAFC,color:#0B0F19,font-weight:bold,rx:8,ry:8;
%% Intense Cherry
classDef condense fill:#BA0C2F,stroke:#BA0C2F,color:#FFFFFF,rx:8,ry:8;
%% Ink Black
classDef retrieve fill:#0B0F19,stroke:#0B0F19,color:#FFFFFF,rx:8,ry:8;
%% Clean, subtle slate-gray connecting lines
linkStyle default stroke:#A0AAB2,stroke-width:2px,fill:none;
%% Nodes
Query([Receive User Query]):::input
FetchHistory[Fetch Conversation History]:::process
CheckHistory{History Exists?}:::condition
CondenseQuery[Condense Query with Context]:::condense
RetrieveChunks[(Retrieve Context Chunks)]:::retrieve
LLMResponse([Generate LLM Response]):::output
%% Flow
Query --> FetchHistory
FetchHistory --> CheckHistory
CheckHistory -- "Yes" --> CondenseQuery
CheckHistory -- "No" --> RetrieveChunks
CondenseQuery --> RetrieveChunks
RetrieveChunks --> LLMResponse
You can find an example of the typical RAG implemented with FastAPI on examples/simple_rag.py.
Differences with projects that have a similar objective
| Library | Notes |
|---|---|
| JustLLMs | Requests are made directly with http. More LLMs supported and many more features (agents, tools, etc.). I personally prefer using the official SDKs. |
| LiteLLM & Agents SDK + LiteLLM | Local proxy router where you send the requests to be translated, adds complexity to the project and another element to the infrastructure. |
| LangChain | The most popular one. Bloated in some features, complex implementations that make it difficult to change its behaviours. |
| OpenRouter | All requests are sent to a 3rd party + additional charges. |
Notes
- I will implement Azure OpenAI's chat implementation if this gets enough traction (I don't want to loose my free Azure credits unless it is worth it).
- Retries are left to the user to put and customise (check out
examples/retry_example.py), as it adds a lot of complexity to have a default retry logic but also let the user modify it. - Agents and tools will be evaluated later, the focus is to make this library simple and not bloated, providing the core functionalities and letting you easily extend them.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file xecai-0.1.0.tar.gz.
File metadata
- Download URL: xecai-0.1.0.tar.gz
- Upload date:
- Size: 25.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28bb3ed507b8b1bd14e838fd6e03cbd2028e3bf3a1dfa2ba54b982f2a8ff854b
|
|
| MD5 |
cbf6137f1b61636f046cae2167b1edc0
|
|
| BLAKE2b-256 |
359141b97d9644b35dd8d8cf9c0952269089c3ee22490805869785d105dbb323
|
Provenance
The following attestation bundles were made for xecai-0.1.0.tar.gz:
Publisher:
publish.yml on AdrianVispalia/xecai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
xecai-0.1.0.tar.gz -
Subject digest:
28bb3ed507b8b1bd14e838fd6e03cbd2028e3bf3a1dfa2ba54b982f2a8ff854b - Sigstore transparency entry: 1112884130
- Sigstore integration time:
-
Permalink:
AdrianVispalia/xecai@ef23674bfcc58ffe30e9cceb1313cf39a1f40807 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/AdrianVispalia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ef23674bfcc58ffe30e9cceb1313cf39a1f40807 -
Trigger Event:
release
-
Statement type:
File details
Details for the file xecai-0.1.0-py3-none-any.whl.
File metadata
- Download URL: xecai-0.1.0-py3-none-any.whl
- Upload date:
- Size: 36.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f3ecdf1748db7403f4477d74104634d640ebfd3565f31e4bc4fb322cf5b04fa
|
|
| MD5 |
3013ff13e465ce7c70791da0c4bf46f5
|
|
| BLAKE2b-256 |
32e2bb5a5994b3513fd682c6b8efbf97b943d9196759c5b1bce671294b0c4921
|
Provenance
The following attestation bundles were made for xecai-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on AdrianVispalia/xecai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
xecai-0.1.0-py3-none-any.whl -
Subject digest:
9f3ecdf1748db7403f4477d74104634d640ebfd3565f31e4bc4fb322cf5b04fa - Sigstore transparency entry: 1112884134
- Sigstore integration time:
-
Permalink:
AdrianVispalia/xecai@ef23674bfcc58ffe30e9cceb1313cf39a1f40807 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/AdrianVispalia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ef23674bfcc58ffe30e9cceb1313cf39a1f40807 -
Trigger Event:
release
-
Statement type: