mirror of
https://github.com/tiennm99/litellm.git
synced 2026-06-18 03:31:23 +00:00
128 lines
3.9 KiB
Python
128 lines
3.9 KiB
Python
import os
|
|
import sys
|
|
import pytest
|
|
import asyncio
|
|
from typing import Optional
|
|
from unittest.mock import patch, AsyncMock
|
|
|
|
sys.path.insert(0, os.path.abspath("../.."))
|
|
import litellm
|
|
from litellm.integrations.custom_logger import CustomLogger
|
|
import json
|
|
from litellm.types.utils import StandardLoggingPayload
|
|
from litellm.types.llms.openai import (
|
|
ResponseCompletedEvent,
|
|
ResponsesAPIResponse,
|
|
ResponseAPIUsage,
|
|
IncompleteDetails,
|
|
)
|
|
from litellm.llms.custom_httpx.http_handler import AsyncHTTPHandler
|
|
from base_responses_api import BaseResponsesAPITest
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_manus_responses_api_with_agent_profile():
|
|
"""
|
|
Test that Manus API correctly extracts agent profile from model name
|
|
and includes task_mode and agent_profile in the request.
|
|
"""
|
|
litellm._turn_on_debug()
|
|
|
|
response = await litellm.aresponses(
|
|
model="manus/manus-1.6-lite",
|
|
input="What's the color of the sky?",
|
|
api_key=os.getenv("MANUS_API_KEY"),
|
|
max_output_tokens=50,
|
|
)
|
|
|
|
print("Manus response=", json.dumps(response, indent=4, default=str))
|
|
|
|
## Get the status of the response
|
|
got_response = await litellm.aget_responses(
|
|
response_id=response.id,
|
|
custom_llm_provider="manus",
|
|
api_key=os.getenv("MANUS_API_KEY"),
|
|
)
|
|
print("GET API MANUS RESPONSE=", json.dumps(got_response, indent=4, default=str))
|
|
if got_response.status == "completed":
|
|
assert got_response.output is not None
|
|
assert len(got_response.output) > 0
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_manus_responses_api_with_file_upload():
|
|
"""
|
|
Test that uploads a file via Files API and then passes it to Responses API.
|
|
"""
|
|
litellm._turn_on_debug()
|
|
|
|
api_key = os.getenv("MANUS_API_KEY")
|
|
if api_key is None:
|
|
pytest.skip("MANUS_API_KEY not set")
|
|
|
|
# Step 1: Upload a file
|
|
test_content = b"Warren Buffett's 2023 Letter to Shareholders\n\nKey Points:\n1. Long-term value creation\n2. Capital allocation strategy\n3. Market volatility perspective"
|
|
test_filename = "buffett_letter_summary.txt"
|
|
|
|
print("Step 1: Uploading file...")
|
|
uploaded_file = await litellm.acreate_file(
|
|
file=(test_filename, test_content),
|
|
purpose="assistants",
|
|
custom_llm_provider="manus",
|
|
api_key=api_key,
|
|
)
|
|
print(f"Uploaded file: {uploaded_file}")
|
|
assert uploaded_file.id is not None
|
|
file_id = uploaded_file.id
|
|
|
|
# Step 2: Create a response with the uploaded file
|
|
print(f"\nStep 2: Creating response with file {file_id}...")
|
|
response = await litellm.aresponses(
|
|
model="manus/manus-1.6-lite",
|
|
input=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "input_text",
|
|
"text": "Summarize the key points from this letter.",
|
|
},
|
|
{
|
|
"type": "input_file",
|
|
"file_id": file_id,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
api_key=api_key,
|
|
max_output_tokens=100,
|
|
)
|
|
|
|
print(f"Response created: {response}")
|
|
print(f"Response type: {type(response)}")
|
|
print(f"Response has id: {hasattr(response, 'id')}")
|
|
|
|
# Handle both dict and ResponsesAPIResponse object
|
|
if isinstance(response, dict):
|
|
response_id = response.get("id")
|
|
else:
|
|
response_id = getattr(response, "id", None)
|
|
|
|
assert response_id is not None, f"Response ID is None. Response: {response}"
|
|
|
|
|
|
# Step 3: Clean up - delete the file
|
|
print(f"\nStep 4: Cleaning up - deleting file {file_id}...")
|
|
deleted_file = await litellm.afile_delete(
|
|
file_id=file_id,
|
|
custom_llm_provider="manus",
|
|
api_key=api_key,
|
|
)
|
|
print(f"Deleted file: {deleted_file}")
|
|
assert deleted_file.deleted is True
|
|
|
|
print("\n✅ File upload and responses API integration test passed!")
|
|
|
|
|