hwhkit
Main function
- Connection
- mqtt
- llm
Connection
yaml config
key_pairs:
default_topic:
algorithm: rsa
public: '-----BEGIN PUBLIC KEY-----'
private: '-----BEGIN PRIVATE KEY-----'
default_topic_2:
algorithm: aes
private: '---------xxx-------'
Sync MQTT
import time
import signal
from hwhkit.connection.mqtt.client import MQTTClientManager
def main():
default_topic = "default_topic"
client_id = "test_mqtt_client"
manager = MQTTClientManager(mqtt_config="mqtt_keys.yaml")
manager.create_client(client_id=client_id, broker="broker.emqx.io", port=1883)
manager.start_all_clients()
@manager.subscribe(topic=default_topic)
def handle_message(client, message: str):
print(f"Received message from {client}: {message}")
manager.publish(client_id, default_topic, f"Response from {client}")
time.sleep(4)
manager.publish(client_id=client_id, topic=default_topic, message="Hello from Client2")
signal.pause()
if __name__ == '__main__':
main()
Async MQTT
import asyncio
from hwhkit.connection.mqtt.async_client import MQTTAsyncClientManager, MQTTConfig
from hwhkit.utils import logger
async def main():
configs = [
MQTTConfig(client_id="client1", broker="broker.emqx.io", port=1883, username="user", password="pass"),
]
default_topic = "default_topic"
async with MQTTAsyncClientManager(mqtt_config="mqtt_keys.yaml") as manager:
for config in configs:
await manager.add_client(config)
@manager.topic_handler(default_topic)
async def topic_key(client, topic, message):
logger.info(f"Received message on {topic} from {client}: {message}")
await manager.publish("client1", default_topic, f"Response from {client}")
await manager.run()
if __name__ == "__main__":
asyncio.run(main())
LLM
Three steps to use models
Step1, llm_config.yaml
matter that needs attention
- custom_model_name used for models.get_model_instance()
- custom_model_name.name should specify the name of the model supported by the current company
models:
openai:
custom_model_name:
name: "gpt-4o"
short_name: "OIG4"
company: "openai"
max_input_token: 8100
max_output_token: 2048
top_p: 0.5
top_k: 1
temperature: 0.5
input_token_fee_pm: 30.0
output_token_fee_pm: 60.0
train_token_fee_pm: 0.0
keys:
- name: "openai_key1"
- name: "openai_key2"
siliconflow:
qw-72b-p:
name: "Qwen/QVQ-72B-Preview"
short_name: "QW-72B-P"
company: "siliconflow"
max_input_token: 8100
max_output_token: 2048
top_p: 0.5
top_k: 1
temperature: 0.5
input_token_fee_pm: 30.0
output_token_fee_pm: 60.0
train_token_fee_pm: 0.0
keys:
- name: "siliconflow_1"
Step2, llm_keys.yaml
- The keys name of the model in llm_config.yaml corresponds to llm_keys.yaml one by one
keys:
openai_key1: "xx"
openai_key2: "xx"
anthropic_key1: "your_anthropic_api_key_1"
anthropic_key2: "your_anthropic_api_key_2"
Step3, load models
from hwhkit.llm.config import load_models_from_yaml
from hwhkit.llm import LLMClient
async def main():
# The first method
models = load_models_from_yaml(config_file="examples/llm_config.yaml", keys_file="examples/llm_keys.yaml")
print(models.list_models())
resp = await models.get_model_instance("gpt-4o").chat("who r u?")
print(resp)
# The second method
client = LLMClient(config_file="llm_config.yaml", keys_file="llm_keys.yaml")
print(client.list_models())
resp = await client.chat("qw-72b-p", "who r u?", system_prompt="")
print(resp)
async for chunk in client.chat_stream("qw-72b-p", "who r u?", system_prompt=""):
print(chunk)
if __name__ == '__main__':
import asyncio
asyncio.run(main())
Metadata
Release files for hwhkit 1.0.21
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| hwhkit-1.0.21.tar.gz | 18.7 kB | Without provenance | Details for hwhkit-1.0.21.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| hwhkit-1.0.21-py3-none-any.whl | Python 3 | none | any | Details for hwhkit-1.0.21-py3-none-any.whl |
Total release size: 52.9 kB
Release files / hwhkit-1.0.21.tar.gz
| Download URL | hwhkit-1.0.21.tar.gz |
|---|---|
| Size | 18.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8dbd2eaf6ce6f7f7eb5fd4b48a0d0b7810598f4fd92072dbcd48235f472662c0
|
|
BLAKE2b-256 checksum How to use checksums |
98d665ab7caa3ab18025a0f9d1b65e44fb4d3bb1b6a63e4b9185cdd610f9b960
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.0.1 CPython/3.10.10
|
Release files / hwhkit-1.0.21-py3-none-any.whl
| Download URL | hwhkit-1.0.21-py3-none-any.whl |
|---|---|
| Size | 34.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3524affbf3665be1e35a7d1e7c37d187c282eff16ac3155906a50183412e4ee6
|
|
BLAKE2b-256 checksum How to use checksums |
acdb46b68a4bc11b2a0a734bb44f820c0088499865662f7ece27b01bf80dc076
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.0.1 CPython/3.10.10
|
Security for hwhkit 1.0.21
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.