Esta API Python não oficial fornece acesso aos recursos de conversação do Claude AI da Anthropic por meio de uma interface simples de mensagens de bate-papo.
Embora não seja oficialmente suportada pela Anthropic, esta biblioteca pode permitir aplicações de conversação interessantes.
Permite:
Faça perguntas sobre uma ampla variedade de tópicos. Claude pode conversar sobre eventos atuais, cultura pop, esportes e muito mais.
Obtenha explicações úteis sobre tópicos complexos. Peça a Claude para explicar conceitos e ideias em termos simples.
Gere resumos de textos longos ou documentos. Basta fornecer o caminho do arquivo como anexo a Claude e receber um resumo conciso.
Receba respostas atenciosas a sugestões e ideias abertas. Claude pode debater ideias, expandir conceitos e ter discussões filosóficas.
Envie imagens e deixe Claude analisá-las para você.
pip install unofficial-claude-api
pip uninstall unofficial-claude-api
(percorrendo este README você encontrará também uma alternativa manual)
from sys import exit as sys_exit
from claude_api . client import (
ClaudeAPIClient ,
SendMessageResponse ,
)
from claude_api . session import SessionData , get_session_data
from claude_api . errors import ClaudeAPIError , MessageRateLimitError , OverloadError
# Wildcard import will also work the same as above
# from claude_api import *
# List of attachments filepaths, up to 5, max 10 MB each
FILEPATH_LIST = [
"test1.txt" ,
"test2.txt" ,
]
# This function will automatically retrieve a SessionData instance using selenium
# It will auto gather cookie session, user agent and organization ID.
# Omitting profile argument will use default Firefox profile
session : SessionData = get_session_data ()
# Initialize a client instance using a session
# Optionally change the requests timeout parameter to best fit your needs...default to 240 seconds.
client = ClaudeAPIClient ( session , timeout = 240 )
# Create a new chat and cache the chat_id
chat_id = client . create_chat ()
if not chat_id :
# This will not throw MessageRateLimitError
# But it still means that account has no more messages left.
print ( " n Message limit hit, cannot create chat..." )
sys_exit ( 1 )
try :
# Used for sending message with or without attachments
# Returns a SendMessageResponse instance
res : SendMessageResponse = client . send_message (
chat_id , "Hello!" , attachment_paths = FILEPATH_LIST
)
# Inspect answer
if res . answer :
print ( res . answer )
else :
# Inspect response status code and raw answer bytes
print ( f" n Error code { res . status_code } , raw_answer: { res . raw_answer } " )
except ClaudeAPIError as e :
# Identify the error
if isinstance ( e , MessageRateLimitError ):
# The exception will hold these informations about the rate limit:
print ( f" n Message limit hit, resets at { e . reset_date } " )
print ( f" n { e . sleep_sec } seconds left until -> { e . reset_timestamp } " )
elif isinstance ( e , OverloadError ):
print ( f" n Overloaded error: { e } " )
else :
print ( f" n Got unknown Claude error: { e } " )
finally :
# Perform chat deletion for cleanup
client . delete_chat ( chat_id )
# Get a list of all chats ids
all_chat_ids = client . get_all_chat_ids ()
# Delete all chats
for chat in all_chat_ids :
client . delete_chat ( chat )
# Or by using a shortcut utility
client . delete_all_chats ()
sys_exit ( 0 )
# A convenience method to access a specific chat conversation is
chat_data = client . get_chat_data ( chat_id )
chat_data
será o mesmo dicionário json retornado pela chamada /api/organizations/{organization_id}/chat_conversations/{chat_id}
Aqui está um exemplo deste json:
{
"uuid" : " <ConversationUUID> " ,
"name" : " " ,
"summary" : " " ,
"model" : null ,
"created_at" : " 1997-12-25T13:33:33.959409+00:00 " ,
"updated_at" : " 1997-12-25T13:33:39.487561+00:00 " ,
"chat_messages" : [
{
"uuid" : " <MessageUUID> " ,
"text" : " Who is Bugs Bunny? " ,
"sender" : " human " ,
"index" : 0 ,
"created_at" : " 1997-12-25T13:33:39.487561+00:00 " ,
"updated_at" : " 1997-12-25T13:33:40.959409+00:00 " ,
"edited_at" : null ,
"chat_feedback" : null ,
"attachments" : []
},
{
"uuid" : " <MessageUUID> " ,
"text" : " <Claude response's text> " ,
"sender" : " assistant " ,
"index" : 1 ,
"created_at" : " 1997-12-25T13:33:40.959409+00:00 " ,
"updated_at" : " 1997-12-25T13:33:42.487561+00:00 " ,
"edited_at" : null ,
"chat_feedback" : null ,
"attachments" : []
}
]
}
Se por algum motivo você quiser evitar a coleta automática de sessões usando selênio, basta criar manualmente uma classe SessionData
para o construtor ClaudeAPIClient
, assim ...
from claude_api . session import SessionData
cookie_header_value = "The entire Cookie header value string when you visit https://claude.ai/chats"
user_agent = "User agent to use, required"
# You can retrieve this string from /api/organizations endpoint
# If omitted or None it will be auto retrieved when instantiating ClaudeAPIClient
organization_id = "<org_uuid>"
session = SessionData ( cookie_header_value , user_agent , organization_id )
NOTA (somente proxies sem autenticação de usuário/senha são suportados)
Se quiser definir um proxy HTTP para todas as solicitações, siga este exemplo:
from claude_api . client import HTTPProxy , ClaudeAPIClient
from claude_api . session import SessionData
# Create HTTPProxy instance
http_proxy = HTTPProxy (
"the.proxy.ip.addr" , # Proxy IP
8080 , # Proxy port
use_ssl = False # Set to True if proxy uses HTTPS schema
)
session = SessionData (...)
# Give the proxy instance to ClaudeAPIClient constructor, along with session data.
client = ClaudeAPIClient ( session , proxy = http_proxy )
Se você quiser optar pelos proxies SOCKS, o procedimento é o mesmo, mas será necessário importar a classe SOCKSProxy
, configurando-a com o número da versão.
from claude_api . client import SOCKSProxy , ClaudeAPIClient
from claude_api . session import SessionData
# Create SOCKSProxy instance
socks_proxy = SOCKSProxy (
"the.proxy.ip.addr" , # Proxy IP
8080 , # Proxy port
version_num = 5 # Either 4 or 5, defaults to 4
)
session = SessionData (...)
# Give the proxy instance to ClaudeAPIClient constructor as usual
client = ClaudeAPIClient ( session , proxy = socks_proxy )
Caso você queira alterar o modelo usado ou tenha contas que não conseguem migrar para o modelo mais recente, você pode substituir o parâmetro de string model_name
do construtor ClaudeAPIClient
da seguinte forma:
from claude_api . client import ClaudeAPIClient
from claude_api . session import SessionData
session = SessionData (...)
# Defaults to None (latest Claude model)
client = ClaudeAPIClient ( session , model_name = "claude-2.0" )
Você pode recuperar as strings model_name
dos documentos oficiais da API
Conforme relatado na edição nº 23, se você encontrar erros 403 ao usar o Selenium para recuperar automaticamente uma classe SessionData
e sua conta tiver várias organizações, você pode querer substituir a organização padrão recuperada.
Por padrão, get_session_data
recupera a última organização da matriz de resultados encontrada aqui. Você pode substituir o índice a ser buscado usando o parâmetro organization_index
:
from claude_api . session import get_session_data
# Defaults to -1 (last entry)
session = get_session_data ( organization_index = - 1 )
Alguns erros comuns que podem surgir durante o uso desta API:
Erro [400] (Não é possível preparar o anexo do arquivo):
Para corrigir esse erro, altere a extensão do arquivo anexo para algo como .txt, já que por padrão esta API retornará ao fluxo de octetos para extensões de arquivo desconhecidas, Claude pode rejeitar os dados do arquivo.
Erro [403] :
* Este bug já deve estar corrigido após a versão 0.2.2 *
Em algum momento, esta API retornará um status_code 403 ao chamar send_message
. Quando isso acontecer, é recomendável procurar por estas coisas:
Verifique se a localização do seu IP é permitida, deve ser nos EUA/Reino Unido, outros locais podem funcionar esporadicamente.
Não tente enviar o mesmo prompt/arquivo repetidamente; em vez disso, espere algum tempo e altere a entrada.
Este repositório fornece uma API não oficial para automatizar contas gratuitas em claude.ai. Observe que esta API não é endossada, suportada ou mantida pela Anthropic. Use-o por sua própria conta e risco. A Anthropic pode fazer alterações em seus produtos ou APIs oficiais a qualquer momento, o que pode afetar a funcionalidade desta API não oficial. Não garantimos a precisão, confiabilidade ou segurança das informações e dados recuperados usando esta API. Ao usar este repositório, você concorda que os mantenedores não são responsáveis por quaisquer danos, problemas ou consequências que possam surgir de seu uso. Consulte sempre a documentação oficial e os termos de uso da Anthropic. Este projeto é mantido de forma independente por colaboradores que não são afiliados à Anthropic.
Desde já um grande obrigado a quem quiser doar :)