Metadata-Version: 2.4
Name: solace_ai_connector
Version: 3.3.12
Summary: Solace AI Connector - make it easy to connect Solace PubSub+ Event Brokers to AI/ML frameworks
Project-URL: homepage, https://github.com/SolaceLabs/solace-ai-connector
Project-URL: repository, https://github.com/SolaceLabs/solace-ai-connector
Project-URL: documentation, https://github.com/SolaceLabs/solace-ai-connector/blob/main/docs/index.md
Author-email: Edward Funnekotter <edward.funnekotter@solace.com>
License-File: LICENSE
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.10.16
Requires-Dist: gevent-websocket==0.10.1
Requires-Dist: gevent==25.8.2
Requires-Dist: opentelemetry-api<2.0.0,>=1.37.0
Requires-Dist: opentelemetry-exporter-prometheus<1.0.0,>=0.58b0
Requires-Dist: opentelemetry-sdk<2.0.0,>=1.37.0
Requires-Dist: python-json-logger==4.0.0
Requires-Dist: pywin32==311; sys_platform == 'win32'
Requires-Dist: pyyaml==6.0.2
Requires-Dist: requests==2.33.0
Requires-Dist: solace-pubsubplus==1.9.0
Requires-Dist: sqlalchemy==2.0.40
Requires-Dist: urllib3==2.7.0
Provides-Extra: all
Requires-Dist: beautifulsoup4==4.13.3; extra == 'all'
Requires-Dist: boto3==1.42.42; extra == 'all'
Requires-Dist: brotli==1.2.0; extra == 'all'
Requires-Dist: chromadb==1.3.5; extra == 'all'
Requires-Dist: dotenv==0.9.9; extra == 'all'
Requires-Dist: flask-socketio==5.4.1; extra == 'all'
Requires-Dist: flask-wtf==1.2.2; extra == 'all'
Requires-Dist: flask==3.0.3; extra == 'all'
Requires-Dist: langchain-aws==1.4.0; extra == 'all'
Requires-Dist: langchain-chroma==1.1.0; extra == 'all'
Requires-Dist: langchain-milvus==0.3.3; extra == 'all'
Requires-Dist: langchain-openai==1.1.1; extra == 'all'
Requires-Dist: langchain-postgres==0.0.17; extra == 'all'
Requires-Dist: langchain-qdrant==1.1.0; extra == 'all'
Requires-Dist: langchain-text-splitters==1.1.2; extra == 'all'
Requires-Dist: langchain==1.2.17; extra == 'all'
Requires-Dist: litellm==1.83.14; extra == 'all'
Requires-Dist: numpy; extra == 'all'
Requires-Dist: openai==2.24.0; extra == 'all'
Requires-Dist: pgvector==0.3.6; extra == 'all'
Requires-Dist: playwright==1.51.0; extra == 'all'
Requires-Dist: psycopg-binary==3.2.6; extra == 'all'
Requires-Dist: psycopg2-binary==2.9.10; extra == 'all'
Requires-Dist: pymilvus==2.6.0; extra == 'all'
Requires-Dist: pymongo==4.10.1; extra == 'all'
Requires-Dist: pymysql==1.1.1; extra == 'all'
Requires-Dist: python-dotenv==1.2.2; extra == 'all'
Requires-Dist: qdrant-client==1.15.1; extra == 'all'
Requires-Dist: requests-aws4auth>=1.3.1; extra == 'all'
Provides-Extra: aws
Requires-Dist: boto3==1.42.42; extra == 'aws'
Requires-Dist: langchain-aws==1.4.0; extra == 'aws'
Requires-Dist: requests-aws4auth>=1.3.1; extra == 'aws'
Provides-Extra: chromadb-vector-store
Requires-Dist: chromadb==1.3.5; extra == 'chromadb-vector-store'
Requires-Dist: langchain-chroma==1.1.0; extra == 'chromadb-vector-store'
Provides-Extra: integration-test
Requires-Dist: aiohttp>=3.8.0; extra == 'integration-test'
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'integration-test'
Requires-Dist: pytest-mock>=3.0.0; extra == 'integration-test'
Requires-Dist: requests-mock>=1.10.0; extra == 'integration-test'
Requires-Dist: trustme>=0.9.0; extra == 'integration-test'
Provides-Extra: langchain
Requires-Dist: langchain==1.2.17; extra == 'langchain'
Provides-Extra: llm
Requires-Dist: litellm==1.83.14; extra == 'llm'
Provides-Extra: llm-ext-release
Requires-Dist: aiohappyeyeballs==2.6.1; extra == 'llm-ext-release'
Requires-Dist: aiohttp==3.12.14; extra == 'llm-ext-release'
Requires-Dist: aiosignal>=1.4.0; extra == 'llm-ext-release'
Requires-Dist: annotated-types==0.7.0; extra == 'llm-ext-release'
Requires-Dist: anyio==4.9.0; extra == 'llm-ext-release'
Requires-Dist: attrs==25.3.0; extra == 'llm-ext-release'
Requires-Dist: certifi==2025.1.31; extra == 'llm-ext-release'
Requires-Dist: charset-normalizer==3.4.1; extra == 'llm-ext-release'
Requires-Dist: click==8.1.8; extra == 'llm-ext-release'
Requires-Dist: distro==1.9.0; extra == 'llm-ext-release'
Requires-Dist: dotenv==0.9.9; extra == 'llm-ext-release'
Requires-Dist: filelock==3.18.0; extra == 'llm-ext-release'
Requires-Dist: frozenlist==1.5.0; extra == 'llm-ext-release'
Requires-Dist: fsspec==2025.3.2; extra == 'llm-ext-release'
Requires-Dist: h11==0.16.0; extra == 'llm-ext-release'
Requires-Dist: httpcore==1.0.9; extra == 'llm-ext-release'
Requires-Dist: httpx==0.28.1; extra == 'llm-ext-release'
Requires-Dist: huggingface-hub==0.30.2; extra == 'llm-ext-release'
Requires-Dist: idna==3.10; extra == 'llm-ext-release'
Requires-Dist: importlib-metadata==8.6.1; extra == 'llm-ext-release'
Requires-Dist: jinja2==3.1.6; extra == 'llm-ext-release'
Requires-Dist: jiter==0.9.0; extra == 'llm-ext-release'
Requires-Dist: jsonschema-specifications==2024.10.1; extra == 'llm-ext-release'
Requires-Dist: jsonschema==4.23.0; extra == 'llm-ext-release'
Requires-Dist: litellm==1.83.14; extra == 'llm-ext-release'
Requires-Dist: markupsafe==3.0.2; extra == 'llm-ext-release'
Requires-Dist: multidict==6.2.0; extra == 'llm-ext-release'
Requires-Dist: openai==2.24.0; extra == 'llm-ext-release'
Requires-Dist: packaging==24.2; extra == 'llm-ext-release'
Requires-Dist: propcache==0.3.1; extra == 'llm-ext-release'
Requires-Dist: pydantic-core==2.33.1; extra == 'llm-ext-release'
Requires-Dist: pydantic==2.11.3; extra == 'llm-ext-release'
Requires-Dist: python-dotenv==1.2.2; extra == 'llm-ext-release'
Requires-Dist: pyyaml==6.0.2; extra == 'llm-ext-release'
Requires-Dist: referencing==0.36.2; extra == 'llm-ext-release'
Requires-Dist: regex==2024.11.6; extra == 'llm-ext-release'
Requires-Dist: rpds-py==0.24.0; extra == 'llm-ext-release'
Requires-Dist: sniffio==1.3.1; extra == 'llm-ext-release'
Requires-Dist: tiktoken==0.9.0; extra == 'llm-ext-release'
Requires-Dist: tokenizers==0.21.1; extra == 'llm-ext-release'
Requires-Dist: tqdm==4.67.1; extra == 'llm-ext-release'
Requires-Dist: typing-extensions==4.13.1; extra == 'llm-ext-release'
Requires-Dist: typing-inspection==0.4.0; extra == 'llm-ext-release'
Requires-Dist: yarl==1.19.0; extra == 'llm-ext-release'
Requires-Dist: zipp==3.21.0; extra == 'llm-ext-release'
Provides-Extra: milvus-vector-store
Requires-Dist: langchain-milvus==0.3.3; extra == 'milvus-vector-store'
Requires-Dist: pymilvus==2.6.0; extra == 'milvus-vector-store'
Provides-Extra: mongodb
Requires-Dist: pymongo==4.10.1; extra == 'mongodb'
Provides-Extra: openai
Requires-Dist: langchain-openai==1.1.1; extra == 'openai'
Requires-Dist: openai==2.24.0; extra == 'openai'
Provides-Extra: openai-ext-release
Requires-Dist: annotated-types==0.7.0; extra == 'openai-ext-release'
Requires-Dist: anyio==4.9.0; extra == 'openai-ext-release'
Requires-Dist: certifi==2025.1.31; extra == 'openai-ext-release'
Requires-Dist: charset-normalizer==3.4.1; extra == 'openai-ext-release'
Requires-Dist: distro==1.9.0; extra == 'openai-ext-release'
Requires-Dist: h11==0.16.0; extra == 'openai-ext-release'
Requires-Dist: httpcore==1.0.9; extra == 'openai-ext-release'
Requires-Dist: httpx==0.28.1; extra == 'openai-ext-release'
Requires-Dist: idna==3.10; extra == 'openai-ext-release'
Requires-Dist: jiter==0.9.0; extra == 'openai-ext-release'
Requires-Dist: jsonpatch==1.33; extra == 'openai-ext-release'
Requires-Dist: jsonpointer==3.0.0; extra == 'openai-ext-release'
Requires-Dist: langchain-core==1.3.3; extra == 'openai-ext-release'
Requires-Dist: langchain-openai==1.1.1; extra == 'openai-ext-release'
Requires-Dist: langsmith==0.3.45; extra == 'openai-ext-release'
Requires-Dist: openai==2.24.0; extra == 'openai-ext-release'
Requires-Dist: orjson==3.10.16; extra == 'openai-ext-release'
Requires-Dist: packaging==24.2; extra == 'openai-ext-release'
Requires-Dist: pydantic-core==2.33.1; extra == 'openai-ext-release'
Requires-Dist: pydantic==2.11.3; extra == 'openai-ext-release'
Requires-Dist: pyyaml==6.0.2; extra == 'openai-ext-release'
Requires-Dist: regex==2024.11.6; extra == 'openai-ext-release'
Requires-Dist: requests-toolbelt==1.0.0; extra == 'openai-ext-release'
Requires-Dist: sniffio==1.3.1; extra == 'openai-ext-release'
Requires-Dist: tenacity==9.1.2; extra == 'openai-ext-release'
Requires-Dist: tiktoken==0.9.0; extra == 'openai-ext-release'
Requires-Dist: tqdm==4.67.1; extra == 'openai-ext-release'
Requires-Dist: typing-extensions==4.13.1; extra == 'openai-ext-release'
Requires-Dist: typing-inspection==0.4.0; extra == 'openai-ext-release'
Requires-Dist: zstandard==0.23.0; extra == 'openai-ext-release'
Provides-Extra: pgvector-vector-store
Requires-Dist: langchain-postgres==0.0.17; extra == 'pgvector-vector-store'
Requires-Dist: pgvector==0.3.6; extra == 'pgvector-vector-store'
Requires-Dist: psycopg-binary==3.2.6; extra == 'pgvector-vector-store'
Provides-Extra: qdrant-ext-release
Requires-Dist: annotated-types==0.7.0; extra == 'qdrant-ext-release'
Requires-Dist: anyio==4.9.0; extra == 'qdrant-ext-release'
Requires-Dist: certifi==2025.1.31; extra == 'qdrant-ext-release'
Requires-Dist: charset-normalizer==3.4.1; extra == 'qdrant-ext-release'
Requires-Dist: grpcio-tools==1.73.1; extra == 'qdrant-ext-release'
Requires-Dist: grpcio==1.73.1; extra == 'qdrant-ext-release'
Requires-Dist: h11==0.16.0; extra == 'qdrant-ext-release'
Requires-Dist: h2==4.3.0; extra == 'qdrant-ext-release'
Requires-Dist: hpack==4.1.0; extra == 'qdrant-ext-release'
Requires-Dist: httpcore==1.0.9; extra == 'qdrant-ext-release'
Requires-Dist: httpx==0.28.1; extra == 'qdrant-ext-release'
Requires-Dist: hyperframe==6.1.0; extra == 'qdrant-ext-release'
Requires-Dist: idna==3.10; extra == 'qdrant-ext-release'
Requires-Dist: jsonpatch==1.33; extra == 'qdrant-ext-release'
Requires-Dist: jsonpointer==3.0.0; extra == 'qdrant-ext-release'
Requires-Dist: langchain-core==1.3.3; extra == 'qdrant-ext-release'
Requires-Dist: langchain-qdrant==1.1.0; extra == 'qdrant-ext-release'
Requires-Dist: langsmith==0.3.45; extra == 'qdrant-ext-release'
Requires-Dist: orjson==3.10.16; extra == 'qdrant-ext-release'
Requires-Dist: packaging==24.2; extra == 'qdrant-ext-release'
Requires-Dist: portalocker==2.10.1; extra == 'qdrant-ext-release'
Requires-Dist: protobuf==6.31.1; extra == 'qdrant-ext-release'
Requires-Dist: pydantic-core==2.33.1; extra == 'qdrant-ext-release'
Requires-Dist: pydantic==2.11.3; extra == 'qdrant-ext-release'
Requires-Dist: pyyaml==6.0.2; extra == 'qdrant-ext-release'
Requires-Dist: qdrant-client==1.15.1; extra == 'qdrant-ext-release'
Requires-Dist: requests-toolbelt==1.0.0; extra == 'qdrant-ext-release'
Requires-Dist: setuptools==78.1.1; extra == 'qdrant-ext-release'
Requires-Dist: sniffio==1.3.1; extra == 'qdrant-ext-release'
Requires-Dist: tenacity==9.1.2; extra == 'qdrant-ext-release'
Requires-Dist: typing-extensions==4.13.1; extra == 'qdrant-ext-release'
Requires-Dist: typing-inspection==0.4.0; extra == 'qdrant-ext-release'
Requires-Dist: zstandard==0.23.0; extra == 'qdrant-ext-release'
Provides-Extra: qdrant-vector-store
Requires-Dist: langchain-qdrant==1.1.0; extra == 'qdrant-vector-store'
Provides-Extra: splitter
Requires-Dist: langchain-text-splitters==1.1.2; extra == 'splitter'
Provides-Extra: splitter-ext-release
Requires-Dist: annotated-types==0.7.0; extra == 'splitter-ext-release'
Requires-Dist: anyio==4.9.0; extra == 'splitter-ext-release'
Requires-Dist: certifi==2025.1.31; extra == 'splitter-ext-release'
Requires-Dist: charset-normalizer==3.4.1; extra == 'splitter-ext-release'
Requires-Dist: h11==0.16.0; extra == 'splitter-ext-release'
Requires-Dist: httpcore==1.0.9; extra == 'splitter-ext-release'
Requires-Dist: httpx==0.28.1; extra == 'splitter-ext-release'
Requires-Dist: idna==3.10; extra == 'splitter-ext-release'
Requires-Dist: jsonpatch==1.33; extra == 'splitter-ext-release'
Requires-Dist: jsonpointer==3.0.0; extra == 'splitter-ext-release'
Requires-Dist: langchain-core==1.3.3; extra == 'splitter-ext-release'
Requires-Dist: langchain-text-splitters==1.1.2; extra == 'splitter-ext-release'
Requires-Dist: langsmith==0.3.45; extra == 'splitter-ext-release'
Requires-Dist: orjson==3.10.16; extra == 'splitter-ext-release'
Requires-Dist: packaging==24.2; extra == 'splitter-ext-release'
Requires-Dist: pydantic-core==2.33.1; extra == 'splitter-ext-release'
Requires-Dist: pydantic==2.11.3; extra == 'splitter-ext-release'
Requires-Dist: pyyaml==6.0.2; extra == 'splitter-ext-release'
Requires-Dist: requests-toolbelt==1.0.0; extra == 'splitter-ext-release'
Requires-Dist: sniffio==1.3.1; extra == 'splitter-ext-release'
Requires-Dist: tenacity==9.1.2; extra == 'splitter-ext-release'
Requires-Dist: typing-extensions==4.13.1; extra == 'splitter-ext-release'
Requires-Dist: typing-inspection==0.4.0; extra == 'splitter-ext-release'
Requires-Dist: zstandard==0.23.0; extra == 'splitter-ext-release'
Provides-Extra: sql
Requires-Dist: psycopg2-binary==2.9.10; extra == 'sql'
Requires-Dist: pymysql==1.1.1; extra == 'sql'
Provides-Extra: test
Requires-Dist: pytest-asyncio>=1.2.0; extra == 'test'
Requires-Dist: pytest-cov>=4.0.0; extra == 'test'
Requires-Dist: pytest-mock>=3.0.0; extra == 'test'
Requires-Dist: pytest>=8.0.0; extra == 'test'
Provides-Extra: webscraping
Requires-Dist: beautifulsoup4==4.13.3; extra == 'webscraping'
Requires-Dist: brotli==1.2.0; extra == 'webscraping'
Requires-Dist: playwright==1.51.0; extra == 'webscraping'
Provides-Extra: websocket
Requires-Dist: flask-socketio==5.4.1; extra == 'websocket'
Requires-Dist: flask-wtf==1.2.2; extra == 'websocket'
Requires-Dist: flask==3.0.3; extra == 'websocket'
Description-Content-Type: text/markdown

# Solace AI Connector

## Overview

This project provides a standalone, Python-based application to allow Solace event brokers to connect to
a wide range of AI models and services. The application is designed to be easily extensible to
support new AI models and services.

## Documentation

Please see the [documentation](docs/index.md) for more information.

## Getting started quickly

Please see the [getting started guide](docs/getting_started.md) for instructions on how to get started quickly.

## Observability

solace-ai-connector provides OpenTelemetry-based metrics for monitoring duration across:
- Remote service calls (Solace broker, S3, OAuth, etc.)
- LLM inference (duration and time-to-first-token)
- Database operations
- Gateway request handling
- Internal operations

Enable in your configuration:

```yaml
management_server:
  observability:
    enabled: true
    path: /metrics
```

See [Observability Documentation](docs/observability.md) for details.

## Support

This is not an officially supported Solace product.

For more information try these resources:

- Ask the [Solace Community](https://solace.community)
- The Solace Developer Portal website at: https://solace.dev

## Contributing

Contributions are encouraged! Please read [CONTRIBUTING](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.

## License

See the [LICENSE](LICENSE) file for details.

