feat: add excludes

This commit is contained in:
Alpha Nerd 2026-04-03 12:17:13 +02:00
parent 7eeb8c470b
commit 1343462516
Signed by: alpha-nerd
SSH key fingerprint: SHA256:QkkAgVoYi9TQ0UKPkiKSfnerZy2h4qhi3SVPXJmBN+M
2 changed files with 3 additions and 221 deletions

View file

@ -50,3 +50,6 @@ Issues = "https://bitfreedom.net/code/nomyo-ai/nomyo/issues"
[tool.hatch.build.targets.wheel]
packages = ["nomyo"]
[tool.hatch.build.targets.sdist]
exclude = ["test/", "build.sh", "dist/"]

221
test.py
View file

@ -1,221 +0,0 @@
#!/usr/bin/env python3
"""
Test script to verify OpenAI compatibility of SecureChatCompletion.
This script demonstrates that the SecureChatCompletion class provides
the same interface as OpenAI's ChatCompletion.create() method.
"""
import asyncio
from nomyo import SecureChatCompletion
client = SecureChatCompletion(api_key="test-api-key-12345")
async def test_basic_chat():
"""Test basic chat completion with OpenAI-style API."""
print("=" * 70)
print("TEST 1: Basic Chat Completion (OpenAI-style API)")
print("=" * 70)
# This is how you would use OpenAI's client:
# response = await openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
# messages=[...],
# temperature=0.7
# )
# Now with SecureChatCompletion (same API!):
response = await client.create(
model="Qwen/Qwen3-0.6B",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is the capital of France?"}
],
temperature=0.7,
)
# Verify response structure matches OpenAI format
assert "choices" in response, "Response missing 'choices' field"
assert len(response["choices"]) > 0, "No choices in response"
assert "message" in response["choices"][0], "Choice missing 'message' field"
assert "content" in response["choices"][0]["message"], "Message missing 'content' field"
assert "finish_reason" in response["choices"][0], "Choice missing 'finish_reason' field"
print("✅ Response structure matches OpenAI format")
print(f"✅ Model: {response.get('model')}")
print(f"✅ Finish Reason: {response['choices'][0].get('finish_reason')}")
print(f"✅ Content: {response['choices'][0]['message']['content']}...")
return True
async def test_chat_with_tools():
"""Test chat completion with tools (OpenAI-style API)."""
print("\n" + "=" * 70)
print("TEST 2: Chat with Tools (OpenAI-style API)")
print("=" * 70)
# This is how you would use OpenAI's client with tools:
# response = await openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
# messages=[...],
# tools=[...],
# temperature=0.7
# )
# Now with SecureChatCompletion (same API!):
response = await client.create(
model="Qwen/Qwen3-0.6B",
messages=[
{"role": "system", "content": "You are a helpful assistant with tools."},
{"role": "user", "content": "What's the weather in Paris?"}
],
tools=[
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get weather information for a location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City name"
}
},
"required": ["location"]
}
}
}
],
temperature=0.7,
max_tokens=2000
)
# Verify response structure
assert "choices" in response, "Response missing 'choices' field"
assert "message" in response["choices"][0], "Choice missing 'message' field"
print("✅ Response structure matches OpenAI format")
print(f"✅ Model: {response.get('model')}")
print(f"✅ Content: {response['choices'][0]['message']['content']}...")
# Check for tool calls if present
if 'tool_calls' in response['choices'][0]['message']:
print("✅ Tool calls detected in response")
for tool_call in response['choices'][0]['message']['tool_calls']:
print(f" - Function: {tool_call['function']['name']}")
return True
async def test_all_openai_parameters():
"""Test that all common OpenAI parameters are supported."""
print("\n" + "=" * 70)
print("TEST 3: All OpenAI Parameters Support")
print("=" * 70)
# Test with various OpenAI parameters
response = await client.create(
model="Qwen/Qwen3-0.6B",
messages=[
{"role": "user", "content": "Hello!"}
],
temperature=0.7,
max_tokens=100,
top_p=0.9,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=None,
n=1,
stream=False,
user="test_user"
)
print("✅ All OpenAI parameters accepted")
print(f"✅ Response received successfully")
return True
async def test_async_alias():
"""Test the acreate async alias method."""
print("\n" + "=" * 70)
print("TEST 4: Async Alias (acreate)")
print("=" * 70)
# Test using the acreate alias on the client instance
response = await client.acreate(
model="Qwen/Qwen3-0.6B",
messages=[
{"role": "user", "content": "Test message"}
],
temperature=0.7
)
print("✅ acreate() method works correctly")
print(f"✅ Response received: {response['choices'][0]['message']['content']}...")
return True
async def test_error_handling():
"""Test error handling."""
print("\n" + "=" * 70)
print("TEST 5: Error Handling")
print("=" * 70)
try:
# This should fail gracefully
response = await client.create(
model="nonexistent-model",
messages=[
{"role": "user", "content": "Test"}
]
)
print("⚠️ Expected error did not occur")
return False
except Exception as e:
print(f"✅ Error handled correctly: {type(e).__name__}")
return True
async def main():
"""Run all compatibility tests."""
print("=" * 70)
print("SECURE CHAT CLIENT - OpenAI Compatibility Tests")
print("=" * 70)
print("\nTesting that SecureChatCompletion provides the same API as")
print("openai.ChatCompletion.create() with end-to-end encryption...\n")
tests = [
test_basic_chat,
test_chat_with_tools,
test_all_openai_parameters,
test_async_alias,
test_error_handling,
]
results = []
for test in tests:
try:
result = await test()
results.append(result)
except Exception as e:
print(f"\n❌ Test failed with exception: {e}")
import traceback
traceback.print_exc()
results.append(False)
print("\n" + "=" * 70)
print("TEST SUMMARY")
print("=" * 70)
passed = sum(results)
total = len(results)
print(f"Passed: {passed}/{total}")
if passed == total:
print("\n🎉 ALL TESTS PASSED!")
print("\nThe SecureChatCompletion class is fully compatible with")
print("OpenAI's ChatCompletion.create() API while providing")
print("end-to-end encryption for secure communication.")
else:
print(f"\n⚠️ {total - passed} test(s) failed")
return passed == total
if __name__ == "__main__":
success = asyncio.run(main())
exit(0 if success else 1)