useClaude.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import Anthropic from '@anthropic-ai/sdk'
  2. export const useClaude = () => {
  3. const runtimeConfig = useRuntimeConfig()
  4. const client = new Anthropic({
  5. apiKey: runtimeConfig.public.anthropicApiKey,
  6. dangerouslyAllowBrowser: true
  7. })
  8. const sendMessage = async (message, conversation = []) => {
  9. try {
  10. const messages = [
  11. ...conversation,
  12. { role: 'user', content: message }
  13. ]
  14. const response = await client.messages.create({
  15. model: 'claude-3-5-sonnet-20241022',
  16. max_tokens: 1000,
  17. messages: messages
  18. })
  19. return {
  20. success: true,
  21. content: response.content[0].text,
  22. usage: response.usage
  23. }
  24. } catch (error) {
  25. console.error('Claude API Error:', error)
  26. return {
  27. success: false,
  28. error: error.message
  29. }
  30. }
  31. }
  32. const sendStreamMessage = async (message, conversation = [], onChunk) => {
  33. try {
  34. const messages = [
  35. ...conversation,
  36. { role: 'user', content: message }
  37. ]
  38. const stream = await client.messages.create({
  39. model: 'claude-3-5-sonnet-20241022',
  40. max_tokens: 1000,
  41. messages: messages,
  42. stream: true
  43. })
  44. let fullResponse = ''
  45. for await (const chunk of stream) {
  46. if (chunk.type === 'content_block_delta') {
  47. const text = chunk.delta.text
  48. fullResponse += text
  49. if (onChunk) {
  50. onChunk(text, fullResponse)
  51. }
  52. }
  53. }
  54. return {
  55. success: true,
  56. content: fullResponse
  57. }
  58. } catch (error) {
  59. console.error('Claude Stream API Error:', error)
  60. return {
  61. success: false,
  62. error: error.message
  63. }
  64. }
  65. }
  66. return {
  67. sendMessage,
  68. sendStreamMessage
  69. }
  70. }